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().
This commit is contained in:
Benjamin Otte 2021-06-10 23:10:22 +02:00
parent c787fe7ecb
commit b1fbc2ef24
4 changed files with 28 additions and 15 deletions

View 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

View 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,

View 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.

View 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;