gdk: Move GL context construction to GdkGLContext
authorBenjamin Otte <otte@redhat.com>
Fri, 9 Jul 2021 00:50:32 +0000 (02:50 +0200)
committerBenjamin Otte <otte@redhat.com>
Thu, 22 Jul 2021 14:27:32 +0000 (16:27 +0200)
Now that we have the display's context to hook into, we can use it to
construct other GL contexts and don't need a GdkSurface vfunc anymore.

This has the added benefit that backends can have different GdkGLContext
classes on the display and get new GLContexts generated from them, so
we get multiple GL backend support per GDK backend for free.

I originally wanted to make this a vfunc on GdkGLContextClass, but
it turns out all the abckends would just call g_object_new() anyway.

20 files changed:
gdk/gdkglcontext.c
gdk/gdkglcontextprivate.h
gdk/gdksurface.c
gdk/gdksurfaceprivate.h
gdk/macos/gdkmacosdisplay.c
gdk/macos/gdkmacosglcontext-private.h
gdk/macos/gdkmacosglcontext.c
gdk/macos/gdkmacossurface.c
gdk/wayland/gdkglcontext-wayland.c
gdk/wayland/gdkglcontext-wayland.h
gdk/wayland/gdksurface-wayland.c
gdk/win32/gdkglcontext-win32.c
gdk/win32/gdkglcontext-win32.h
gdk/win32/gdksurface-win32.c
gdk/x11/gdkdisplay-x11.c
gdk/x11/gdkglcontext-egl.c
gdk/x11/gdkglcontext-glx.c
gdk/x11/gdkglcontext-x11.c
gdk/x11/gdkglcontext-x11.h
gdk/x11/gdksurface-x11.c

index 06a9de118ecb4446f1c06f8486d2997afe65c818..5c0193c0ec9dff2ad078fb54071f7050c71c5d6c 100644 (file)
@@ -451,6 +451,21 @@ gdk_gl_context_init (GdkGLContext *self)
   priv->use_es = -1;
 }
 
+/* Must have called gdk_display_prepare_gl() before */
+GdkGLContext *
+gdk_gl_context_new_for_surface (GdkSurface *surface)
+{
+  GdkDisplay *display = gdk_surface_get_display (surface);
+  GdkGLContext *shared = gdk_display_get_gl_context (display);
+
+  /* assert gdk_display_prepare_gl() had been called */
+  g_assert (shared);
+
+  return g_object_new (G_OBJECT_TYPE (shared),
+                       "surface", surface,
+                       NULL);
+}
+
 GdkGLContextPaintData *
 gdk_gl_context_get_paint_data (GdkGLContext *context)
 {
index a338d7cbbe46d8ad1f4b893634d4f88e6a8f5558..c8afedda02fb768f4ac6adf85aa9c70d934f0b33 100644 (file)
@@ -86,6 +86,8 @@ typedef struct {
   guint use_es : 1;
 } GdkGLContextPaintData;
 
+GdkGLContext *          gdk_gl_context_new_for_surface          (GdkSurface      *surface);
+
 void                    gdk_gl_context_set_is_legacy            (GdkGLContext    *context,
                                                                  gboolean         is_legacy);
 
index f56b0e8c17af597ea71fac9c11b5fc634a084b5d..3f2b5189ffb751c06b859c8e70467b259429d61e 100644 (file)
@@ -1069,31 +1069,19 @@ GdkGLContext *
 gdk_surface_get_paint_gl_context (GdkSurface  *surface,
                                   GError     **error)
 {
-  GError *internal_error = NULL;
-
   if (!gdk_display_prepare_gl (surface->display, error))
     return NULL;
 
   if (surface->gl_paint_context == NULL)
     {
-      GdkSurfaceClass *class = GDK_SURFACE_GET_CLASS (surface);
-
-      surface->gl_paint_context =
-        class->create_gl_context (surface, &internal_error);
-    }
-
-  if (internal_error != NULL)
-    {
-      g_propagate_error (error, internal_error);
-      g_clear_object (&(surface->gl_paint_context));
-      return NULL;
+      surface->gl_paint_context = gdk_surface_create_gl_context (surface, error);
+      if (surface->gl_paint_context == NULL)
+        return NULL;
     }
 
-  gdk_gl_context_realize (surface->gl_paint_context, &internal_error);
-  if (internal_error != NULL)
+  if (!gdk_gl_context_realize (surface->gl_paint_context, error))
     {
-      g_propagate_error (error, internal_error);
-      g_clear_object (&(surface->gl_paint_context));
+      g_clear_object (&surface->gl_paint_context);
       return NULL;
     }
 
@@ -1124,8 +1112,7 @@ gdk_surface_create_gl_context (GdkSurface   *surface,
   if (!gdk_display_prepare_gl (surface->display, error))
     return NULL;
 
-  return GDK_SURFACE_GET_CLASS (surface)->create_gl_context (surface,
-                                                             error);
+  return gdk_gl_context_new_for_surface (surface);
 }
 
 /**
index cf7a0f73b694291d4760e1a977e504570dc41406..3ab692e19c68fd0fa49c59e747fe05a379244f3e 100644 (file)
@@ -160,8 +160,6 @@ struct _GdkSurfaceClass
 
   void         (* set_opaque_region)      (GdkSurface      *surface,
                                            cairo_region_t *region);
-  GdkGLContext *(*create_gl_context)      (GdkSurface      *surface,
-                                           GError        **error);
   void         (* request_layout)         (GdkSurface     *surface);
   gboolean     (* compute_size)           (GdkSurface     *surface);
 };
index 93afcce196e2e770dd7e1f869b91ffbd1f302e94..450ad2434d55d5d95f8e414aa55d4def43bd83a8 100644 (file)
@@ -641,7 +641,9 @@ static GdkGLContext *
 gdk_macos_display_init_gl (GdkDisplay  *display,
                            GError     **error)
 {
-  return _gdk_macos_gl_context_new (display, NULL, FALSE, NULL, error);
+  return g_object_new (GDK_TYPE_MACOS_GL_CONTEXT,
+                       "display", display,
+                       NULL);
 }
 
 static void
index a09a2da905ee34c7bace2b05642ad412f6a60de4..533888cd2c63933896fec408dc6c652363987665 100644 (file)
@@ -57,11 +57,6 @@ struct _GdkMacosGLContextClass
   GdkGLContextClass parent_class;
 };
 
-GdkGLContext *_gdk_macos_gl_context_new          (GdkMacosDisplay    *display,
-                                                  GdkMacosSurface    *surface,
-                                                  gboolean            attached,
-                                                  GdkGLContext       *share,
-                                                  GError            **error);
 
 G_END_DECLS
 
index 9b23fe929ab4ce79601c7b18d060531bd69fa436..8e79f7688f055f53404d3e8a9c07e7befcce809b 100644 (file)
@@ -522,27 +522,4 @@ gdk_macos_gl_context_init (GdkMacosGLContext *self)
 {
 }
 
-GdkGLContext *
-_gdk_macos_gl_context_new (GdkMacosDisplay  *display,
-                           GdkMacosSurface  *surface,
-                           gboolean          attached,
-                           GdkGLContext     *share,
-                           GError          **error)
-{
-  GdkMacosGLContext *context;
-
-  g_return_val_if_fail (GDK_IS_MACOS_SURFACE (surface), NULL);
-  g_return_val_if_fail (!share || GDK_IS_MACOS_GL_CONTEXT (share), NULL);
-
-  context = g_object_new (GDK_TYPE_MACOS_GL_CONTEXT,
-                          "display", display,
-                          "surface", surface,
-                          "shared-context", share,
-                          NULL);
-
-  context->is_attached = !!attached;
-
-  return GDK_GL_CONTEXT (context);
-}
-
 G_GNUC_END_IGNORE_DEPRECATIONS
index aa8df2f35ef87e68b2bc40c19c528a4bfee15cb2..88be1f513de7e81fccb1733c51bf9bc45c8ec0ec 100644 (file)
@@ -358,21 +358,6 @@ gdk_macos_surface_drag_begin (GdkSurface         *surface,
   return GDK_DRAG (g_steal_pointer (&drag));
 }
 
-static GdkGLContext *
-gdk_macos_surface_create_gl_context (GdkSurface    *surface,
-                                     gboolean       attached,
-                                     GdkGLContext  *share,
-                                     GError       **error)
-{
-  GdkMacosSurface *self = (GdkMacosSurface *)surface;
-
-  g_assert (GDK_IS_MACOS_SURFACE (self));
-  g_assert (!share || GDK_IS_GL_CONTEXT (share));
-
-  return _gdk_macos_gl_context_new ((GdkMacosDisplay *) gdk_surface_get_display (surface),
-                                    self, attached, share, error);
-}
-
 static void
 gdk_macos_surface_destroy (GdkSurface *surface,
                            gboolean    foreign_destroy)
@@ -496,7 +481,6 @@ gdk_macos_surface_class_init (GdkMacosSurfaceClass *klass)
   object_class->get_property = gdk_macos_surface_get_property;
   object_class->set_property = gdk_macos_surface_set_property;
 
-  surface_class->create_gl_context = gdk_macos_surface_create_gl_context;
   surface_class->destroy = gdk_macos_surface_destroy;
   surface_class->drag_begin = gdk_macos_surface_drag_begin;
   surface_class->get_device_state = gdk_macos_surface_get_device_state;
index 2a2e03300d3f8a61454ac6ddb7acd45d661ee9be..558c9cfed0c3dd3c3a40df80cce125d3c233ebac 100644 (file)
@@ -550,19 +550,6 @@ gdk_wayland_display_init_gl (GdkDisplay  *display,
                        NULL);
 }
 
-GdkGLContext *
-gdk_wayland_surface_create_gl_context (GdkSurface    *surface,
-                                       GError       **error)
-{
-  GdkWaylandGLContext *context;
-
-  context = g_object_new (GDK_TYPE_WAYLAND_GL_CONTEXT,
-                          "surface", surface,
-                          NULL);
-
-  return GDK_GL_CONTEXT (context);
-}
-
 static void
 gdk_wayland_gl_context_dispose (GObject *gobject)
 {
index add5807849b908a396299811be1710f213a0a017..0a60a467be1a012ac519d9306c2c2b82c62eb2ea 100644 (file)
@@ -45,8 +45,6 @@ struct _GdkWaylandGLContextClass
 
 GdkGLContext *  gdk_wayland_display_init_gl                         (GdkDisplay        *display,
                                                                      GError           **error);
-GdkGLContext *  gdk_wayland_surface_create_gl_context               (GdkSurface        *surface,
-                                                                     GError           **error);
 
 G_END_DECLS
 
index 404b10b226ed43b2bdbcab7c98df207afa2ad908..5689241c7dee3ec24e39b615bc2b704a753e7244 100644 (file)
@@ -4224,7 +4224,6 @@ gdk_wayland_surface_class_init (GdkWaylandSurfaceClass *klass)
   impl_class->drag_begin = _gdk_wayland_surface_drag_begin;
   impl_class->get_scale_factor = gdk_wayland_surface_get_scale_factor;
   impl_class->set_opaque_region = gdk_wayland_surface_set_opaque_region;
-  impl_class->create_gl_context = gdk_wayland_surface_create_gl_context;
   impl_class->request_layout = gdk_wayland_surface_request_layout;
   impl_class->compute_size = gdk_wayland_surface_compute_size;
 }
index 9d87b89e0a0e53c1f1554fd6bce91c1e5812f16c..44010df3a3709f5fde1b5ea28be66a18fccdd058 100644 (file)
@@ -1155,6 +1155,7 @@ gdk_win32_gl_context_init (GdkWin32GLContext *self)
 {
 }
 
+#if 0
 GdkGLContext *
 _gdk_win32_surface_create_gl_context (GdkSurface *surface,
                                       GError **error)
@@ -1203,6 +1204,7 @@ _gdk_win32_surface_create_gl_context (GdkSurface *surface,
 
   return GDK_GL_CONTEXT (context);
 }
+#endif
 
 /**
  * gdk_win32_display_get_wgl_version:
index 5a66334fca32150cad32ef14d9b7d870c696e283..b13fb04913104b77d4185bd6b8c2cd82478ae64e 100644 (file)
@@ -59,10 +59,6 @@ struct _GdkWin32GLContextClass
   GdkGLContextClass parent_class;
 };
 
-GdkGLContext *
-_gdk_win32_surface_create_gl_context (GdkSurface *window,
-                                      GError **error);
-
 void
 _gdk_win32_surface_invalidate_egl_framebuffer (GdkSurface *surface);
 
index bb96b6f6e35480c19028423634e255af0938d925..48194888a96995d4d0cde4644264c0e4ec0b9bfd 100644 (file)
@@ -4623,7 +4623,6 @@ gdk_win32_surface_class_init (GdkWin32SurfaceClass *klass)
 
   impl_class->destroy_notify = gdk_win32_surface_destroy_notify;
   impl_class->drag_begin = _gdk_win32_surface_drag_begin;
-  impl_class->create_gl_context = _gdk_win32_surface_create_gl_context;
   impl_class->get_scale_factor = _gdk_win32_surface_get_scale_factor;
   impl_class->request_layout = _gdk_win32_surface_request_layout;
   impl_class->compute_size = _gdk_win32_surface_compute_size;
index 6ea083394848d01ba5fda305201740b327ebe3ba..947e8122a422129973e3e08239b1acc41610c9ba 100644 (file)
@@ -2889,7 +2889,12 @@ gdk_x11_display_init_gl (GdkDisplay  *display,
   if (!have_gl)
     return NULL;
 
-  return gdk_x11_surface_create_gl_context (display_x11->leader_gdk_surface, error);
+  if (display_x11->egl_display)
+    return g_object_new (GDK_TYPE_X11_GL_CONTEXT_EGL, "surface", display_x11->leader_gdk_surface, NULL);
+  else if (display_x11->glx_config != NULL)
+    return g_object_new (GDK_TYPE_X11_GL_CONTEXT_GLX, "surface", display_x11->leader_gdk_surface, NULL);
+  else
+    g_return_val_if_reached (NULL);
 }
 
 static void
index 2248adaf2c0a176f02dcc3cb533fcdf016890ce3..b5a571303c77a6f35597f2ed59e2ca474d4ebabc 100644 (file)
@@ -742,19 +742,6 @@ gdk_x11_display_init_egl (GdkX11Display  *self,
   return TRUE;
 }
 
-GdkX11GLContext *
-gdk_x11_gl_context_egl_new (GdkSurface    *surface,
-                            GError       **error)
-{
-  GdkX11GLContextEGL *context;
-
-  context = g_object_new (GDK_TYPE_X11_GL_CONTEXT_EGL,
-                          "surface", surface,
-                          NULL);
-
-  return GDK_X11_GL_CONTEXT (context);
-}
-
 /**
  * gdk_x11_display_get_egl_version:
  * @display: (type GdkX11Display): a `GdkDisplay`
index 70489374c03cf3ec7524a72b1a3a6f0ef6541822..67e008527d5ea5ec6afa1d835cb3d1531a9670f0 100644 (file)
@@ -890,19 +890,6 @@ gdk_x11_display_create_glx_config (GdkX11Display  *self,
 
 #undef MAX_GLX_ATTRS
 
-GdkX11GLContext *
-gdk_x11_gl_context_glx_new (GdkSurface    *surface,
-                            GError       **error)
-{
-  GdkX11GLContextGLX *context;
-
-  return g_object_new (GDK_TYPE_X11_GL_CONTEXT_GLX,
-                       "surface", surface,
-                       NULL);
-
-  return GDK_X11_GL_CONTEXT (context);
-}
-
 /**
  * gdk_x11_display_get_glx_version:
  * @display: (type GdkX11Display): a `GdkDisplay`
index 88453663e89b51d3d7f4f1cac7b428eff69ea901..98210b5ef1216107dfde41142e7857d2af0b7e75 100644 (file)
@@ -53,35 +53,6 @@ gdk_x11_gl_context_init (GdkX11GLContext *self)
   self->do_frame_sync = TRUE;
 }
 
-GdkGLContext *
-gdk_x11_surface_create_gl_context (GdkSurface    *surface,
-                                   GError       **error)
-{
-  GdkX11GLContext *context = NULL;
-  GdkX11Display *display_x11;
-  GdkDisplay *display;
-
-  display = gdk_surface_get_display (surface);
-  display_x11 = GDK_X11_DISPLAY (display);
-
-  if (display_x11->egl_display)
-    context = gdk_x11_gl_context_egl_new (surface, error);
-  else if (display_x11->glx_config != NULL)
-    context = gdk_x11_gl_context_glx_new (surface, error);
-  else
-    {
-      g_assert (display_x11->gl_error);
-      if (error)
-        *error = g_error_copy (display_x11->gl_error);
-      return NULL;
-    }
-
-  if (context == NULL)
-    return NULL;
-
-  return GDK_GL_CONTEXT (context);
-}
-
 gboolean
 gdk_x11_display_init_gl_backend (GdkX11Display  *self,
                                  Visual        **out_visual,
index 70cee907ab62cb2659a3a133c6e7e12fac1e507d..d1b6c8e10689b4e681e008d135d48c1982893e31 100644 (file)
@@ -63,9 +63,6 @@ gboolean                gdk_x11_display_init_gl_backend         (GdkX11Display *
                                                                  int           *out_depth,
                                                                  GError       **error);
 
-GdkGLContext *          gdk_x11_surface_create_gl_context       (GdkSurface    *window,
-                                                                 GError       **error);
-
 /* GLX */
 #define GDK_TYPE_X11_GL_CONTEXT_GLX     (gdk_x11_gl_context_glx_get_type())
 #define GDK_X11_GL_CONTEXT_GLX(obj)     (G_TYPE_CHECK_INSTANCE_CAST ((obj), GDK_TYPE_X11_GL_CONTEXT_GLX, GdkX11GLContextGLX))
@@ -80,8 +77,6 @@ gboolean                gdk_x11_display_init_glx                (GdkX11Display *
 void                    gdk_x11_surface_destroy_glx_drawable    (GdkX11Surface *self);
 
 GType                   gdk_x11_gl_context_glx_get_type         (void) G_GNUC_CONST;
-GdkX11GLContext *       gdk_x11_gl_context_glx_new              (GdkSurface    *surface,
-                                                                 GError       **error);
 
 
 /* EGL */
@@ -99,8 +94,6 @@ gboolean                gdk_x11_display_init_egl                (GdkX11Display *
 void                    gdk_x11_surface_destroy_egl_surface     (GdkX11Surface *self);
 
 GType                   gdk_x11_gl_context_egl_get_type         (void) G_GNUC_CONST;
-GdkX11GLContext *       gdk_x11_gl_context_egl_new              (GdkSurface    *surface,
-                                                                 GError       **error);
 
 G_END_DECLS
 
index 89ca9f0ad2e96d7b4185309e1382a6bbed60ccc0..03aea25d3a765da7819569c52a37c2b60452f490 100644 (file)
@@ -4810,7 +4810,6 @@ gdk_x11_surface_class_init (GdkX11SurfaceClass *klass)
   impl_class->drag_begin = _gdk_x11_surface_drag_begin;
   impl_class->get_scale_factor = gdk_x11_surface_get_scale_factor;
   impl_class->set_opaque_region = gdk_x11_surface_set_opaque_region;
-  impl_class->create_gl_context = gdk_x11_surface_create_gl_context;
   impl_class->request_layout = gdk_x11_surface_request_layout;
   impl_class->compute_size = gdk_x11_surface_compute_size;
 }