127 lines
4.0 KiB
Diff
127 lines
4.0 KiB
Diff
From c6835e469549189eed7cac13a9c6f0de574e436b Mon Sep 17 00:00:00 2001
|
|
From: Adam Jackson <ajax@redhat.com>
|
|
Date: Tue, 4 Oct 2016 13:20:27 -0400
|
|
Subject: [PATCH] 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>
|
|
---
|
|
cogl/cogl/winsys/cogl-winsys-egl-x11.c | 36 ++++++++++++++++++++++++++++--
|
|
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 454b41e..a7379a5 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 2093e09..b0d11c0 100644
|
|
--- a/src/backends/native/meta-renderer-native.c
|
|
+++ b/src/backends/native/meta-renderer-native.c
|
|
@@ -222,6 +222,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)
|
|
@@ -246,8 +279,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,
|
|
--
|
|
2.9.3
|
|
|