[gtk/wip/otte/gleanup: 30/70] x11: Store the EGL surface in the GdkSurfaceX11
- From: Chun-wei Fan <fanchunwei src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/wip/otte/gleanup: 30/70] x11: Store the EGL surface in the GdkSurfaceX11
- Date: Mon, 19 Jul 2021 02:52:50 +0000 (UTC)
commit 7c91ed7064f131d0c76ccf6ee70cab80c10bcbf5
Author: Benjamin Otte <otte redhat com>
Date: Thu Jun 10 23:10:22 2021 +0200
x11: Store the EGL surface in the GdkSurfaceX11
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 | 35 +++++++++++++++++++++--------------
gdk/x11/gdkglcontext-x11.h | 1 +
gdk/x11/gdksurface-x11.c | 6 +++++-
gdk/x11/gdksurface-x11.h | 1 +
4 files changed, 28 insertions(+), 15 deletions(-)
---
diff --git a/gdk/x11/gdkglcontext-egl.c b/gdk/x11/gdkglcontext-egl.c
index fc1aaf6ad2..4ecdcf3fbd 100644
--- a/gdk/x11/gdkglcontext-egl.c
+++ b/gdk/x11/gdkglcontext-egl.c
@@ -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
diff --git a/gdk/x11/gdkglcontext-x11.h b/gdk/x11/gdkglcontext-x11.h
index 97583133f2..ca296a2c97 100644
--- a/gdk/x11/gdkglcontext-x11.h
+++ b/gdk/x11/gdkglcontext-x11.h
@@ -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,
diff --git a/gdk/x11/gdksurface-x11.c b/gdk/x11/gdksurface-x11.c
index add72799f6..6edf839cf8 100644
--- a/gdk/x11/gdksurface-x11.c
+++ b/gdk/x11/gdksurface-x11.c
@@ -1368,7 +1368,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.
diff --git a/gdk/x11/gdksurface-x11.h b/gdk/x11/gdksurface-x11.h
index 89f4b12845..cb8f92307f 100644
--- a/gdk/x11/gdksurface-x11.h
+++ b/gdk/x11/gdksurface-x11.h
@@ -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;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]