x11: Store the EGL surface in the GdkSurfaceX11
authorBenjamin Otte <otte@redhat.com>
Thu, 10 Jun 2021 21:10:22 +0000 (23:10 +0200)
committerBenjamin Otte <otte@redhat.com>
Thu, 22 Jul 2021 14:06:05 +0000 (16:06 +0200)
Avoids having to use private data, though the benefit is somewhat
limited as we still have to put the destructor in the egl code and can't
just put it in gdk_surface_x11_finalize().

gdk/x11/gdkglcontext-egl.c
gdk/x11/gdkglcontext-x11.h
gdk/x11/gdksurface-x11.c
gdk/x11/gdksurface-x11.h

index fc1aaf6ad2091f6695c41fbd3f468e520e588e5d..4ecdcf3fbda7563584290cca6797bd2e7e111365 100644 (file)
@@ -277,27 +277,34 @@ gdk_x11_display_get_egl_dummy_surface (GdkDisplay *display,
 static EGLSurface
 gdk_x11_surface_get_egl_surface (GdkSurface *surface)
 {
-  GdkDisplay *display = gdk_surface_get_display (surface);
+  GdkX11Surface *self = GDK_X11_SURFACE (surface);
+  GdkDisplay *display = gdk_surface_get_display (GDK_SURFACE (self));
   GdkX11Display *display_x11 = GDK_X11_DISPLAY (display);
-  DrawableInfo *info;
 
-  info = g_object_get_data (G_OBJECT (surface), "-gdk-x11-egl-drawable");
-  if (info != NULL)
-    return info->egl_surface;
+  if (self->egl_surface)
+    return self->egl_surface;
 
-  info = g_new0 (DrawableInfo, 1);
-  info->egl_display = display_x11->egl_display;
-  info->egl_config = display_x11->egl_config;
-  info->egl_surface =
-    eglCreateWindowSurface (info->egl_display, info->egl_config,
+  self->egl_surface =
+    eglCreateWindowSurface (display_x11->egl_display, 
+                            display_x11->egl_config,
                             (EGLNativeWindowType) gdk_x11_surface_get_xid (surface),
                             NULL);
 
-  g_object_set_data_full (G_OBJECT (surface), "-gdk-x11-egl-drawable",
-                          info,
-                          drawable_info_free);
+  return self->egl_surface;
+}
 
-  return info->egl_surface;
+void
+gdk_x11_surface_destroy_egl_surface (GdkX11Surface *self)
+{
+  GdkX11Display *display_x11;
+
+  if (self->egl_surface == NULL)
+    return;
+
+  display_x11 = GDK_X11_DISPLAY (gdk_surface_get_display (GDK_SURFACE (self)));
+
+  eglDestroySurface (display_x11->egl_display, self->egl_surface);
+  self->egl_surface = NULL;
 }
 
 static void
index 97583133f277f8c541a10e198a97974b309e1b09..ca296a2c978a287ce300f20f677341358c2e6a2c 100644 (file)
@@ -93,6 +93,7 @@ gboolean                gdk_x11_gl_context_glx_make_current     (GdkDisplay    *
 typedef struct _GdkX11GLContextEGL      GdkX11GLContextEGL;
 
 gboolean                gdk_x11_display_init_egl                (GdkX11Display *display_x11);
+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,
index 11abd59723399291b29670eede7b128044369da7..5dc3e001b4a10ea6dea793dd1993089015de5d61 100644 (file)
@@ -1360,7 +1360,11 @@ gdk_x11_surface_destroy (GdkSurface *surface,
     }
 
   if (!foreign_destroy)
-    XDestroyWindow (GDK_SURFACE_XDISPLAY (surface), GDK_SURFACE_XID (surface));
+    {
+      gdk_x11_surface_destroy_egl_surface (impl);
+
+      XDestroyWindow (GDK_SURFACE_XDISPLAY (surface), GDK_SURFACE_XID (surface));
+    }
 }
 
 /* This function is called when the XWindow is really gone.
index 89f4b12845db7449e8a708cbea46b3c2dd48566f..cb8f92307f3849f4b9c7c192f088c13dc99b39af 100644 (file)
@@ -87,6 +87,7 @@ struct _GdkX11Surface
   guint compute_size_source_id;
 
   cairo_surface_t *cairo_surface;
+  /* EGLSurface */ gpointer egl_surface;
 
   int abs_x;
   int abs_y;