[gtk/ebassi/egl-display-get: 3/3] wayland: Add EGLDisplay getter




commit e6ca0dd326ba765674f9bab71a348578bfe87072
Author: Emmanuele Bassi <ebassi gnome org>
Date:   Tue May 11 12:26:55 2021 +0100

    wayland: Add EGLDisplay getter
    
    Getting an EGLDisplay object is messy; might as well expose the function
    we use internally to save some time, just like we did for the X11
    backend.

 gdk/wayland/gdkglcontext-wayland.c | 42 +++++++++++++++++++++++++++++---------
 gdk/wayland/gdkwaylanddisplay.h    |  3 +++
 2 files changed, 35 insertions(+), 10 deletions(-)
---
diff --git a/gdk/wayland/gdkglcontext-wayland.c b/gdk/wayland/gdkglcontext-wayland.c
index 9e2572f5be..c22a9ef3b9 100644
--- a/gdk/wayland/gdkglcontext-wayland.c
+++ b/gdk/wayland/gdkglcontext-wayland.c
@@ -333,22 +333,38 @@ gdk_wayland_gl_context_init (GdkWaylandGLContext *self)
 {
 }
 
-static EGLDisplay
-gdk_wayland_get_display (GdkWaylandDisplay *display_wayland)
+/**
+ * gdk_wayland_display_get_egl_display:
+ * @display: (type GdkWaylandDisplay): a Wayland display
+ *
+ * Retrieves the EGL display connection object for the given GDK display.
+ *
+ * Returns: (nullable): the EGL display
+ */
+gpointer
+gdk_wayland_display_get_egl_display (GdkDisplay *display)
 {
+  g_return_val_if_fail (GDK_IS_WAYLAND_DISPLAY (display), NULL);
+
   EGLDisplay dpy = NULL;
 
+  dpy = g_object_get_data (G_OBJECT (display), "-gtk-wayland-egl-display");
+  if (dpy != NULL)
+    return dpy;
+
+  GdkWaylandDisplay *display_wayland = GDK_WAYLAND_DISPLAY (display);
+
   if (epoxy_has_egl_extension (NULL, "EGL_KHR_platform_base"))
     {
       PFNEGLGETPLATFORMDISPLAYPROC getPlatformDisplay =
         (void *) eglGetProcAddress ("eglGetPlatformDisplay");
 
-      if (getPlatformDisplay)
+      if (getPlatformDisplay != NULL)
         dpy = getPlatformDisplay (EGL_PLATFORM_WAYLAND_EXT,
                                   display_wayland->wl_display,
                                   NULL);
-      if (dpy)
-        return dpy;
+      if (dpy != NULL)
+        goto out;
     }
 
   if (epoxy_has_egl_extension (NULL, "EGL_EXT_platform_base"))
@@ -356,15 +372,21 @@ gdk_wayland_get_display (GdkWaylandDisplay *display_wayland)
       PFNEGLGETPLATFORMDISPLAYEXTPROC getPlatformDisplay =
         (void *) eglGetProcAddress ("eglGetPlatformDisplayEXT");
 
-      if (getPlatformDisplay)
+      if (getPlatformDisplay != NULL)
         dpy = getPlatformDisplay (EGL_PLATFORM_WAYLAND_EXT,
                                   display_wayland->wl_display,
                                   NULL);
-      if (dpy)
-        return dpy;
+      if (dpy != NULL)
+        goto out;
     }
 
-  return eglGetDisplay ((EGLNativeDisplayType) display_wayland->wl_display);
+  dpy = eglGetDisplay ((EGLNativeDisplayType) display_wayland->wl_display);
+
+out:
+  if (dpy != NULL)
+    g_object_set_data (G_OBJECT (display), "-gtk-wayland-egl-display", dpy);
+
+  return dpy;
 }
 
 gboolean
@@ -377,7 +399,7 @@ gdk_wayland_display_init_gl (GdkDisplay *display)
   if (display_wayland->have_egl)
     return TRUE;
 
-  dpy = gdk_wayland_get_display (display_wayland);
+  dpy = gdk_wayland_display_get_egl_display (display);
 
   if (dpy == NULL)
     return FALSE;
diff --git a/gdk/wayland/gdkwaylanddisplay.h b/gdk/wayland/gdkwaylanddisplay.h
index 239bf26ce5..7aac2db509 100644
--- a/gdk/wayland/gdkwaylanddisplay.h
+++ b/gdk/wayland/gdkwaylanddisplay.h
@@ -63,6 +63,9 @@ GDK_AVAILABLE_IN_ALL
 gboolean                gdk_wayland_display_query_registry      (GdkDisplay  *display,
                                                                 const char *global);
 
+GDK_AVAILABLE_IN_4_4
+gpointer                gdk_wayland_display_get_egl_display     (GdkDisplay  *display);
+
 G_END_DECLS
 
 #endif /* __GDK_WAYLAND_DISPLAY_H__ */


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