[mutter/gnome-3-22] Use eglGetPlatformDisplay



commit 998aa532d0cc7373ac8b118c1fc6f88dc40e2416
Author: Adam Jackson <ajax redhat com>
Date:   Tue Oct 4 13:20:27 2016 -0400

    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

 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 6d89153..103e6ad 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,


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]