diff options
author | Adam Jackson <ajax@redhat.com> | 2016-10-04 13:20:27 -0400 |
---|---|---|
committer | Rui Matos <tiagomatos@gmail.com> | 2017-02-07 14:44:51 +0100 |
commit | 998aa532d0cc7373ac8b118c1fc6f88dc40e2416 (patch) | |
tree | 57e2903bde5dd1abf10a6e0458ff2e067495989f | |
parent | 050e4acdae9f06fad0e03213fbc88752fa264e47 (diff) | |
download | mutter-998aa532d0cc7373ac8b118c1fc6f88dc40e2416.tar.gz |
Use eglGetPlatformDisplay
Different libEGL will do different things for eglGetDisplay since it has
to guess what kind of display it's been handed. Better to just use the
API that makes it explicit.
Signed-off-by: Adam Jackson <ajax@redhat.com>
https://bugzilla.gnome.org/show_bug.cgi?id=772422
-rw-r--r-- | cogl/cogl/winsys/cogl-winsys-egl-x11.c | 36 | ||||
-rw-r--r-- | src/backends/native/meta-renderer-native.c | 36 |
2 files changed, 68 insertions, 4 deletions
diff --git a/cogl/cogl/winsys/cogl-winsys-egl-x11.c b/cogl/cogl/winsys/cogl-winsys-egl-x11.c index 454b41ebc..a7379a550 100644 --- a/cogl/cogl/winsys/cogl-winsys-egl-x11.c +++ b/cogl/cogl/winsys/cogl-winsys-egl-x11.c @@ -261,6 +261,39 @@ _cogl_winsys_renderer_disconnect (CoglRenderer *renderer) g_slice_free (CoglRendererEGL, egl_renderer); } +static EGLDisplay +_cogl_winsys_egl_get_display (void *native) +{ + EGLDisplay dpy = NULL; + const char *client_exts = eglQueryString (NULL, EGL_EXTENSIONS); + + if (g_strstr_len (client_exts, -1, "EGL_KHR_platform_base")) + { + PFNEGLGETPLATFORMDISPLAYEXTPROC get_platform_display = + (void *) eglGetProcAddress ("eglGetPlatformDisplay"); + + if (get_platform_display) + dpy = get_platform_display (EGL_PLATFORM_X11_KHR, native, NULL); + + if (dpy) + return dpy; + } + + if (g_strstr_len (client_exts, -1, "EGL_EXT_platform_base")) + { + PFNEGLGETPLATFORMDISPLAYEXTPROC get_platform_display = + (void *) eglGetProcAddress ("eglGetPlatformDisplayEXT"); + + if (get_platform_display) + dpy = get_platform_display (EGL_PLATFORM_X11_KHR, native, NULL); + + if (dpy) + return dpy; + } + + return eglGetDisplay ((EGLNativeDisplayType) native); +} + static CoglBool _cogl_winsys_renderer_connect (CoglRenderer *renderer, CoglError **error) @@ -277,8 +310,7 @@ _cogl_winsys_renderer_connect (CoglRenderer *renderer, if (!_cogl_xlib_renderer_connect (renderer, error)) goto error; - egl_renderer->edpy = - eglGetDisplay ((EGLNativeDisplayType) xlib_renderer->xdpy); + egl_renderer->edpy = _cogl_winsys_egl_get_display (xlib_renderer->xdpy); if (!_cogl_winsys_egl_renderer_connect_common (renderer, error)) goto error; diff --git a/src/backends/native/meta-renderer-native.c b/src/backends/native/meta-renderer-native.c index 6d891535c..103e6ad8e 100644 --- a/src/backends/native/meta-renderer-native.c +++ b/src/backends/native/meta-renderer-native.c @@ -231,6 +231,39 @@ meta_onscreen_native_queue_swap_notify (CoglOnscreen *onscreen) onscreen_native->pending_swap_notify = TRUE; } +static EGLDisplay +meta_egl_get_display (void *native) +{ + EGLDisplay dpy = NULL; + const char *client_exts = eglQueryString (NULL, EGL_EXTENSIONS); + + if (g_strstr_len (client_exts, -1, "EGL_KHR_platform_base")) + { + PFNEGLGETPLATFORMDISPLAYEXTPROC get_platform_display = + (void *) eglGetProcAddress ("eglGetPlatformDisplay"); + + if (get_platform_display) + dpy = get_platform_display (EGL_PLATFORM_GBM_MESA, native, NULL); + + if (dpy) + return dpy; + } + + if (g_strstr_len (client_exts, -1, "EGL_EXT_platform_base")) + { + PFNEGLGETPLATFORMDISPLAYEXTPROC get_platform_display = + (void *) eglGetProcAddress ("eglGetPlatformDisplayEXT"); + + if (get_platform_display) + dpy = get_platform_display (EGL_PLATFORM_GBM_MESA, native, NULL); + + if (dpy) + return dpy; + } + + return eglGetDisplay ((EGLNativeDisplayType) native); +} + static CoglBool meta_renderer_native_connect (CoglRenderer *cogl_renderer, CoglError **error) @@ -255,8 +288,7 @@ meta_renderer_native_connect (CoglRenderer *cogl_renderer, goto fail; } - egl_renderer->edpy = - eglGetDisplay ((EGLNativeDisplayType) renderer_native->gbm); + egl_renderer->edpy = meta_egl_get_display (renderer_native->gbm); if (egl_renderer->edpy == EGL_NO_DISPLAY) { _cogl_set_error (error, COGL_WINSYS_ERROR, |