x11: Remove the dummy surface

Instead, use the display's "leader surface" when no surface is required,
because we have it lying around.

Really, we want to use EGL_NO_SURFACE, but if that's not supported...
This commit is contained in:
Benjamin Otte 2021-06-13 23:35:06 +02:00
parent ccd5992a83
commit 04c2093d5c

View File

@ -37,50 +37,10 @@ struct _GdkX11GLContextEGL
EGLContext egl_context; EGLContext egl_context;
}; };
typedef struct {
EGLDisplay egl_display;
EGLConfig egl_config;
EGLSurface egl_surface;
/* Only set by the dummy surface we attach to the display */
Display *xdisplay;
Window dummy_xwin;
XVisualInfo *xvisinfo;
} DrawableInfo;
typedef struct _GdkX11GLContextClass GdkX11GLContextEGLClass; typedef struct _GdkX11GLContextClass GdkX11GLContextEGLClass;
G_DEFINE_TYPE (GdkX11GLContextEGL, gdk_x11_gl_context_egl, GDK_TYPE_X11_GL_CONTEXT) G_DEFINE_TYPE (GdkX11GLContextEGL, gdk_x11_gl_context_egl, GDK_TYPE_X11_GL_CONTEXT)
static void
drawable_info_free (gpointer data)
{
DrawableInfo *info = data;
if (data == NULL)
return;
if (info->egl_surface != NULL)
{
eglDestroySurface (info->egl_display, info->egl_surface);
info->egl_surface = NULL;
}
if (info->dummy_xwin != None)
{
XDestroyWindow (info->xdisplay, info->dummy_xwin);
info->dummy_xwin = None;
}
if (info->xvisinfo != NULL)
{
XFree (info->xvisinfo);
info->xvisinfo = NULL;
}
g_free (info);
}
/** /**
* gdk_x11_display_get_egl_display: * gdk_x11_display_get_egl_display:
* @display: (type GdkX11Display): an X11 display * @display: (type GdkX11Display): an X11 display
@ -176,103 +136,6 @@ gdk_x11_display_create_egl_config (GdkX11Display *display)
#undef MAX_EGL_ATTRS #undef MAX_EGL_ATTRS
static XVisualInfo *
get_visual_info_for_egl_config (GdkDisplay *display,
EGLConfig egl_config)
{
XVisualInfo visinfo_template;
int template_mask = 0;
XVisualInfo *visinfo = NULL;
int visinfos_count;
EGLint visualid, red_size, green_size, blue_size, alpha_size;
EGLDisplay egl_display = GDK_X11_DISPLAY (display)->egl_display;
eglGetConfigAttrib (egl_display, egl_config, EGL_NATIVE_VISUAL_ID, &visualid);
if (visualid != 0)
{
visinfo_template.visualid = visualid;
template_mask |= VisualIDMask;
}
else
{
/* some EGL drivers don't implement the EGL_NATIVE_VISUAL_ID
* attribute, so attempt to find the closest match.
*/
eglGetConfigAttrib (egl_display, egl_config, EGL_RED_SIZE, &red_size);
eglGetConfigAttrib (egl_display, egl_config, EGL_GREEN_SIZE, &green_size);
eglGetConfigAttrib (egl_display, egl_config, EGL_BLUE_SIZE, &blue_size);
eglGetConfigAttrib (egl_display, egl_config, EGL_ALPHA_SIZE, &alpha_size);
visinfo_template.depth = red_size + green_size + blue_size + alpha_size;
template_mask |= VisualDepthMask;
visinfo_template.screen = DefaultScreen (gdk_x11_display_get_xdisplay (display));
template_mask |= VisualScreenMask;
}
visinfo = XGetVisualInfo (gdk_x11_display_get_xdisplay (display),
template_mask,
&visinfo_template,
&visinfos_count);
if (visinfos_count < 1)
return NULL;
return visinfo;
}
static EGLSurface
gdk_x11_display_get_egl_dummy_surface (GdkDisplay *display,
EGLConfig egl_config)
{
GdkX11Display *display_x11 = GDK_X11_DISPLAY (display);
DrawableInfo *info;
XVisualInfo *xvisinfo;
XSetWindowAttributes attrs;
info = g_object_get_data (G_OBJECT (display), "-gdk-x11-egl-dummy-surface");
if (info != NULL)
return info->egl_surface;
xvisinfo = get_visual_info_for_egl_config (display, egl_config);
if (xvisinfo == NULL)
return NULL;
info = g_new (DrawableInfo, 1);
info->xdisplay = gdk_x11_display_get_xdisplay (display);
info->xvisinfo = xvisinfo;
info->egl_display = GDK_X11_DISPLAY (display)->egl_display;
info->egl_config = egl_config;
attrs.override_redirect = True;
attrs.colormap = gdk_x11_display_get_window_colormap (display_x11);
attrs.border_pixel = 0;
info->dummy_xwin =
XCreateWindow (info->xdisplay,
DefaultRootWindow (info->xdisplay),
-100, -100, 1, 1,
0,
gdk_x11_display_get_window_depth (display_x11),
CopyFromParent,
gdk_x11_display_get_window_visual (display_x11),
CWOverrideRedirect | CWColormap | CWBorderPixel,
&attrs);
info->egl_surface =
eglCreateWindowSurface (info->egl_display,
info->egl_config,
(EGLNativeWindowType) info->dummy_xwin,
NULL);
g_object_set_data_full (G_OBJECT (display), "-gdk-x11-egl-dummy-surface",
info,
drawable_info_free);
return info->egl_surface;
}
static EGLSurface static EGLSurface
gdk_x11_surface_get_egl_surface (GdkSurface *surface) gdk_x11_surface_get_egl_surface (GdkSurface *surface)
{ {
@ -718,7 +581,7 @@ gdk_x11_gl_context_egl_make_current (GdkDisplay *display,
if (display_x11->has_egl_surfaceless_context) if (display_x11->has_egl_surfaceless_context)
egl_surface = EGL_NO_SURFACE; egl_surface = EGL_NO_SURFACE;
else else
egl_surface = gdk_x11_display_get_egl_dummy_surface (display, display_x11->egl_config); egl_surface = gdk_x11_surface_get_egl_surface (display_x11->leader_gdk_surface);
} }
GDK_DISPLAY_NOTE (display, OPENGL, GDK_DISPLAY_NOTE (display, OPENGL,