leigh123linux / rpms / mutter

Forked from rpms/mutter 5 years ago
Clone
Blob Blame History Raw
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