[gtk/wip/matthiasc/shared-glyph-cache: 39/41] gdk: Create a global shared GL context



commit 1f70bc4bf38a396a7d7c0ee54a4ea6813498ec0f
Author: Matthias Clasen <mclasen redhat com>
Date:   Tue Jun 4 21:26:28 2019 +0000

    gdk: Create a global shared GL context
    
    Create a global GL context that connects all
    GL contexts on a display and lets us share textures
    between them.

 gdk/gdkinternals.h                 |  2 ++
 gdk/gdksurface.c                   | 40 ++++++++++++++++++++++++++++++++++++++
 gdk/wayland/gdkglcontext-wayland.c |  7 +++++--
 gdk/x11/gdkglcontext-x11.c         |  8 +++++---
 4 files changed, 52 insertions(+), 5 deletions(-)
---
diff --git a/gdk/gdkinternals.h b/gdk/gdkinternals.h
index 143ed59529..13b139f5ce 100644
--- a/gdk/gdkinternals.h
+++ b/gdk/gdkinternals.h
@@ -274,6 +274,8 @@ void gdk_surface_move_resize  (GdkSurface     *surface,
                                gint           width,
                                gint           height);
 
+GdkGLContext *gdk_surface_get_shared_data_gl_context (GdkSurface *surface);
+
 G_END_DECLS
 
 #endif /* __GDK_INTERNALS_H__ */
diff --git a/gdk/gdksurface.c b/gdk/gdksurface.c
index f670291477..c1e57a591c 100644
--- a/gdk/gdksurface.c
+++ b/gdk/gdksurface.c
@@ -1110,6 +1110,46 @@ gdk_surface_get_state (GdkSurface *surface)
   return surface->state;
 }
 
+GdkGLContext *
+gdk_surface_get_shared_data_gl_context (GdkSurface *surface)
+{
+  static int in_shared_data_creation;
+  GdkDisplay *display;
+  GdkGLContext *context;
+
+  if (in_shared_data_creation)
+    return NULL;
+
+  in_shared_data_creation = 1;
+
+  display = gdk_surface_get_display (surface);
+  context = (GdkGLContext *)g_object_get_data (G_OBJECT (display), "gdk-gl-shared-data-context");
+  if (context == NULL)
+    {
+      GError *error = NULL;
+      context = GDK_SURFACE_GET_CLASS (surface)->create_gl_context (surface, FALSE, NULL, &error);
+      if (context == NULL)
+        {
+          g_warning ("Failed to create shared context: %s", error->message);
+          g_clear_error (&error);
+        }
+
+      gdk_gl_context_realize (context, &error);
+      if (context == NULL)
+        {
+          g_warning ("Failed to realize shared context: %s", error->message);
+          g_clear_error (&error);
+        }
+
+
+      g_object_set_data (G_OBJECT (display), "gdk-gl-shared-data-context", context);
+    }
+
+  in_shared_data_creation = 0;
+
+  return context;
+}
+
 GdkGLContext *
 gdk_surface_get_paint_gl_context (GdkSurface  *surface,
                                   GError    **error)
diff --git a/gdk/wayland/gdkglcontext-wayland.c b/gdk/wayland/gdkglcontext-wayland.c
index 79751cb8fc..edeca4916c 100644
--- a/gdk/wayland/gdkglcontext-wayland.c
+++ b/gdk/wayland/gdkglcontext-wayland.c
@@ -47,6 +47,7 @@ gdk_wayland_gl_context_realize (GdkGLContext *context,
   GdkWaylandGLContext *context_wayland = GDK_WAYLAND_GL_CONTEXT (context);
   GdkDisplay *display = gdk_gl_context_get_display (context);
   GdkGLContext *share = gdk_gl_context_get_shared_context (context);
+  GdkGLContext *shared_data_context = gdk_surface_get_shared_data_gl_context (gdk_gl_context_get_surface 
(context));
   GdkWaylandDisplay *display_wayland = GDK_WAYLAND_DISPLAY (display);
   EGLContext ctx;
   EGLint context_attribs[N_EGL_ATTRS];
@@ -114,7 +115,8 @@ gdk_wayland_gl_context_realize (GdkGLContext *context,
   ctx = eglCreateContext (display_wayland->egl_display,
                           context_wayland->egl_config,
                           share != NULL ? GDK_WAYLAND_GL_CONTEXT (share)->egl_context
-                                        : EGL_NO_CONTEXT,
+                             : shared_data_context != NULL ? GDK_WAYLAND_GL_CONTEXT 
(shared_data_context)->egl_context
+                                                  : EGL_NO_CONTEXT,
                           context_attribs);
 
   /* If context creation failed without the legacy bit, let's try again with it */
@@ -136,7 +138,8 @@ gdk_wayland_gl_context_realize (GdkGLContext *context,
       ctx = eglCreateContext (display_wayland->egl_display,
                               context_wayland->egl_config,
                               share != NULL ? GDK_WAYLAND_GL_CONTEXT (share)->egl_context
-                                            : EGL_NO_CONTEXT,
+                                 : shared_data_context != NULL ? GDK_WAYLAND_GL_CONTEXT 
(shared_data_context)->egl_context
+                                    : EGL_NO_CONTEXT,
                               context_attribs);
     }
 
diff --git a/gdk/x11/gdkglcontext-x11.c b/gdk/x11/gdkglcontext-x11.c
index b95a18517c..1385713609 100644
--- a/gdk/x11/gdkglcontext-x11.c
+++ b/gdk/x11/gdkglcontext-x11.c
@@ -576,6 +576,7 @@ gdk_x11_gl_context_realize (GdkGLContext  *context,
   Display *dpy;
   DrawableInfo *info;
   GdkGLContext *share;
+  GdkGLContext *shared_data_context;
   GdkSurface *surface;
   gboolean debug_bit, compat_bit, legacy_bit, es_bit;
   int major, minor, flags;
@@ -586,6 +587,7 @@ gdk_x11_gl_context_realize (GdkGLContext  *context,
   context_x11 = GDK_X11_GL_CONTEXT (context);
   display_x11 = GDK_X11_DISPLAY (display);
   share = gdk_gl_context_get_shared_context (context);
+  shared_data_context = gdk_surface_get_shared_data_gl_context (surface);
 
   gdk_gl_context_get_required_version (context, &major, &minor);
   debug_bit = gdk_gl_context_get_debug_enabled (context);
@@ -625,7 +627,7 @@ gdk_x11_gl_context_realize (GdkGLContext  *context,
   if (legacy_bit && !GDK_X11_DISPLAY (display)->has_glx_create_context)
     {
       GDK_DISPLAY_NOTE (display, OPENGL, g_message ("Creating legacy GL context on request"));
-      context_x11->glx_context = create_legacy_context (display, context_x11->glx_config, share);
+      context_x11->glx_context = create_legacy_context (display, context_x11->glx_config, share ? share : 
shared_data_context);
     }
   else
     {
@@ -650,14 +652,14 @@ gdk_x11_gl_context_realize (GdkGLContext  *context,
       GDK_DISPLAY_NOTE (display, OPENGL, g_message ("Creating GL3 context"));
       context_x11->glx_context = create_gl3_context (display,
                                                      context_x11->glx_config,
-                                                     share,
+                                                     share ? share : shared_data_context,
                                                      profile, flags, major, minor);
 
       /* Fall back to legacy in case the GL3 context creation failed */
       if (context_x11->glx_context == NULL)
         {
           GDK_DISPLAY_NOTE (display, OPENGL, g_message ("Creating fallback legacy context"));
-          context_x11->glx_context = create_legacy_context (display, context_x11->glx_config, share);
+          context_x11->glx_context = create_legacy_context (display, context_x11->glx_config, share ? share 
: shared_data_context);
           legacy_bit = TRUE;
           es_bit = FALSE;
         }


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