mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-12-25 21:21:21 +00:00
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:
parent
ccd5992a83
commit
04c2093d5c
@ -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,
|
||||||
|
Loading…
Reference in New Issue
Block a user