diff --git a/Makefile.am b/Makefile.am index c509f6ec..863adb24 100644 --- a/Makefile.am +++ b/Makefile.am @@ -74,6 +74,7 @@ weston_SOURCES = \ shared/matrix.c \ shared/matrix.h \ shared/zalloc.h \ + shared/platform.h \ src/weston-egl-ext.h nodist_weston_SOURCES = \ @@ -166,7 +167,8 @@ westoninclude_HEADERS = \ src/timeline-object.h \ shared/matrix.h \ shared/config-parser.h \ - shared/zalloc.h + shared/zalloc.h \ + shared/platform.h if ENABLE_EGL module_LTLIBRARIES += gl-renderer.la diff --git a/clients/nested-client.c b/clients/nested-client.c index 7f237e66..96cf1c8a 100644 --- a/clients/nested-client.c +++ b/clients/nested-client.c @@ -277,7 +277,9 @@ nested_client_create(void) /* get globals */ wl_display_roundtrip(client->display); - client->egl_display = eglGetDisplay(client->display); + client->egl_display = + weston_platform_get_egl_display(EGL_PLATFORM_WAYLAND_KHR, + client->display, NULL); if (client->egl_display == NULL) return NULL; diff --git a/clients/simple-egl.c b/clients/simple-egl.c index 3040caa0..33e02e75 100644 --- a/clients/simple-egl.c +++ b/clients/simple-egl.c @@ -46,6 +46,8 @@ #include "protocol/ivi-application-client-protocol.h" #define IVI_SURFACE_ID 9000 +#include "../shared/platform.h" + #ifndef EGL_EXT_swap_buffers_with_damage #define EGL_EXT_swap_buffers_with_damage 1 typedef EGLBoolean (EGLAPIENTRYP PFNEGLSWAPBUFFERSWITHDAMAGEEXTPROC)(EGLDisplay dpy, EGLSurface surface, EGLint *rects, EGLint n_rects); @@ -151,7 +153,9 @@ init_egl(struct display *display, struct window *window) if (window->opaque || window->buffer_size == 16) config_attribs[9] = 0; - display->egl.dpy = eglGetDisplay(display->display); + display->egl.dpy = + weston_platform_get_egl_display(EGL_PLATFORM_WAYLAND_KHR, + display->display, NULL); assert(display->egl.dpy); ret = eglInitialize(display->egl.dpy, &major, &minor); diff --git a/clients/subsurfaces.c b/clients/subsurfaces.c index fcbe496f..5b8fd8d0 100644 --- a/clients/subsurfaces.c +++ b/clients/subsurfaces.c @@ -38,6 +38,7 @@ #include #include #include +#include #include "window.h" @@ -215,7 +216,9 @@ egl_state_create(struct wl_display *display) egl = calloc(1, sizeof *egl); assert(egl); - egl->dpy = eglGetDisplay(display); + egl->dpy = + weston_platform_get_egl_display(EGL_PLATFORM_WAYLAND_KHR, + display, NULL); assert(egl->dpy); ret = eglInitialize(egl->dpy, &major, &minor); diff --git a/clients/window.c b/clients/window.c index b84d3b2c..2858281e 100644 --- a/clients/window.c +++ b/clients/window.c @@ -5392,7 +5392,10 @@ init_egl(struct display *d) EGLint api = EGL_OPENGL_API; #endif - d->dpy = eglGetDisplay(d->display); + d->dpy = + weston_platform_get_egl_display(EGL_PLATFORM_WAYLAND_KHR, + d->display, NULL); + if (!eglInitialize(d->dpy, &major, &minor)) { fprintf(stderr, "failed to initialize EGL\n"); return -1; diff --git a/clients/window.h b/clients/window.h index 5247f19c..0686c3fc 100644 --- a/clients/window.h +++ b/clients/window.h @@ -30,6 +30,7 @@ #include #include "../shared/config-parser.h" #include "../shared/zalloc.h" +#include "../shared/platform.h" #define ARRAY_LENGTH(a) (sizeof (a) / sizeof (a)[0]) diff --git a/shared/platform.h b/shared/platform.h new file mode 100644 index 00000000..7f847fa2 --- /dev/null +++ b/shared/platform.h @@ -0,0 +1,79 @@ +/* + * Copyright © 2015 Collabora, Ltd. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of the copyright holders not be used in + * advertising or publicity pertaining to distribution of the software + * without specific, written prior permission. The copyright holders make + * no representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY + * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF + * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef WESTON_PLATFORM_H +#define WESTON_PLATFORM_H + +#include + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef EGL_EXT_platform_base +static PFNEGLGETPLATFORMDISPLAYEXTPROC get_platform_display_ext = NULL; + +#ifndef EGL_PLATFORM_WAYLAND_KHR +#define EGL_PLATFORM_WAYLAND_KHR 0x31D8 +#endif +#endif /* EGL_EXT_platform_base */ + +static inline void +weston_platform_get_egl_proc_addresses(void) +{ +#ifdef EGL_EXT_platform_base + if (!get_platform_display_ext) { + const char *extensions = eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS); + + if (strstr(extensions, "EGL_EXT_platform_wayland") + || strstr(extensions, "EGL_KHR_platform_wayland")) { + get_platform_display_ext = + (void *) eglGetProcAddress("eglGetPlatformDisplayEXT"); + } + } +#endif +} + +static inline EGLDisplay +weston_platform_get_egl_display(EGLenum platform, void *native_display, + const EGLint *attrib_list) +{ +#ifdef EGL_EXT_platform_base + if (!get_platform_display_ext) + weston_platform_get_egl_proc_addresses(); + + if (get_platform_display_ext) + return get_platform_display_ext(platform, + native_display, attrib_list); + else +#endif + return eglGetDisplay((EGLNativeDisplayType) native_display); +} + +#ifdef __cplusplus +} +#endif + +#endif /* WESTON_PLATFORM_H */ diff --git a/tests/buffer-count-test.c b/tests/buffer-count-test.c index 43fb089e..815e1cc8 100644 --- a/tests/buffer-count-test.c +++ b/tests/buffer-count-test.c @@ -29,6 +29,7 @@ #include #include "weston-test-client-helper.h" +#include "../shared/platform.h" #define fail(msg) { fprintf(stderr, "%s failed\n", msg); return -1; } @@ -66,10 +67,12 @@ init_egl(struct test_data *test_data) EGLint major, minor, n; EGLBoolean ret; - test_data->egl_dpy = eglGetDisplay((EGLNativeDisplayType) - test_data->client->wl_display); + test_data->egl_dpy = + weston_platform_get_egl_display(EGL_PLATFORM_WAYLAND_KHR, + test_data->client->wl_display, + NULL); if (!test_data->egl_dpy) - fail("eglGetDisplay"); + fail("eglGetPlatformDisplay or eglGetDisplay"); if (eglInitialize(test_data->egl_dpy, &major, &minor) != EGL_TRUE) fail("eglInitialize");