From 55e3b2e519365ed0396dcf519a5b2beec4f9dfe9 Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Thu, 31 Aug 2023 15:09:40 +0200 Subject: [PATCH] cogl: Replace xlib error traps with Mtk ones Replace these with Mtk error traps altogether, and avoid stacking one API over the other here. Part-of: --- cogl/cogl/cogl-xlib-private.h | 45 ---------------- cogl/cogl/cogl-xlib-renderer-private.h | 34 ------------ cogl/cogl/cogl-xlib-renderer.c | 74 ++------------------------ cogl/cogl/meson.build | 1 - cogl/cogl/winsys/cogl-onscreen-glx.c | 24 ++++----- cogl/cogl/winsys/cogl-onscreen-xlib.c | 13 ++--- cogl/cogl/winsys/cogl-winsys-glx.c | 29 +++++----- 7 files changed, 30 insertions(+), 190 deletions(-) delete mode 100644 cogl/cogl/cogl-xlib-private.h diff --git a/cogl/cogl/cogl-xlib-private.h b/cogl/cogl/cogl-xlib-private.h deleted file mode 100644 index 5dffdbed1..000000000 --- a/cogl/cogl/cogl-xlib-private.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Cogl - * - * A Low Level GPU Graphics and Utilities API - * - * Copyright (C) 2010,2011 Intel Corporation. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - * - */ - -#pragma once - -#include - -typedef struct _CoglXlibTrapState CoglXlibTrapState; - -struct _CoglXlibTrapState -{ - /* These values are intended to be internal to - * _cogl_xlib_{un,}trap_errors but they need to be in the header so - * that the struct can be allocated on the stack */ - int (* old_error_handler) (Display *, XErrorEvent *); - int trapped_error_code; - CoglXlibTrapState *old_state; -}; diff --git a/cogl/cogl/cogl-xlib-renderer-private.h b/cogl/cogl/cogl-xlib-renderer-private.h index 703315ab9..ee288f291 100644 --- a/cogl/cogl/cogl-xlib-renderer-private.h +++ b/cogl/cogl/cogl-xlib-renderer-private.h @@ -33,7 +33,6 @@ #include #include "cogl/cogl-object-private.h" -#include "cogl/cogl-xlib-private.h" #include "cogl/cogl-x11-renderer-private.h" #include "cogl/cogl-context.h" #include "cogl/cogl-output.h" @@ -44,10 +43,6 @@ typedef struct _CoglXlibRenderer Display *xdpy; - /* Current top of the XError trap state stack. The actual memory for - these is expected to be allocated on the stack by the caller */ - CoglXlibTrapState *trap_state; - unsigned long outputs_update_serial; XVisualInfo *xvisinfo; @@ -59,35 +54,6 @@ _cogl_xlib_renderer_connect (CoglRenderer *renderer, GError **error); void _cogl_xlib_renderer_disconnect (CoglRenderer *renderer); -/* - * cogl_xlib_renderer_trap_errors: - * @state: A temporary place to store data for the trap. - * - * Traps every X error until _cogl_xlib_renderer_untrap_errors() - * called. You should allocate an uninitialised CoglXlibTrapState - * struct on the stack to pass to this function. The same pointer - * should later be passed to _cogl_xlib_renderer_untrap_errors(). - * - * Calls to _cogl_xlib_renderer_trap_errors() can be nested as long as - * _cogl_xlib_renderer_untrap_errors() is called with the - * corresponding state pointers in reverse order. - */ -void -_cogl_xlib_renderer_trap_errors (CoglRenderer *renderer, - CoglXlibTrapState *state); - -/* - * cogl_xlib_renderer_untrap_errors: - * @state: The state that was passed to _cogl_xlib_renderer_trap_errors(). - * - * Removes the X error trap and returns the current status. - * - * Return value: the trapped error code, or 0 for success - */ -int -_cogl_xlib_renderer_untrap_errors (CoglRenderer *renderer, - CoglXlibTrapState *state); - CoglXlibRenderer * _cogl_xlib_renderer_get_data (CoglRenderer *renderer); diff --git a/cogl/cogl/cogl-xlib-renderer.c b/cogl/cogl/cogl-xlib-renderer.c index c4ab91717..6870e891a 100644 --- a/cogl/cogl/cogl-xlib-renderer.c +++ b/cogl/cogl/cogl-xlib-renderer.c @@ -41,6 +41,7 @@ #include "cogl/cogl-x11-renderer-private.h" #include "cogl/cogl-poll-private.h" #include "cogl/winsys/cogl-winsys-private.h" +#include "mtk/mtk-x11.h" #include #include @@ -94,72 +95,6 @@ unregister_xlib_renderer (CoglRenderer *renderer) _cogl_xlib_renderers = g_list_remove (_cogl_xlib_renderers, renderer); } -static CoglRenderer * -get_renderer_for_xdisplay (Display *xdpy) -{ - GList *l; - - for (l = _cogl_xlib_renderers; l; l = l->next) - { - CoglRenderer *renderer = l->data; - CoglXlibRenderer *xlib_renderer = - _cogl_xlib_renderer_get_data (renderer); - - if (xlib_renderer->xdpy == xdpy) - return renderer; - } - - return NULL; -} - -static int -error_handler (Display *xdpy, - XErrorEvent *error) -{ - CoglRenderer *renderer; - CoglXlibRenderer *xlib_renderer; - - renderer = get_renderer_for_xdisplay (xdpy); - - xlib_renderer = _cogl_xlib_renderer_get_data (renderer); - g_assert (xlib_renderer->trap_state); - - xlib_renderer->trap_state->trapped_error_code = error->error_code; - - return 0; -} - -void -_cogl_xlib_renderer_trap_errors (CoglRenderer *renderer, - CoglXlibTrapState *state) -{ - CoglXlibRenderer *xlib_renderer; - - xlib_renderer = _cogl_xlib_renderer_get_data (renderer); - - state->trapped_error_code = 0; - state->old_error_handler = XSetErrorHandler (error_handler); - - state->old_state = xlib_renderer->trap_state; - xlib_renderer->trap_state = state; -} - -int -_cogl_xlib_renderer_untrap_errors (CoglRenderer *renderer, - CoglXlibTrapState *state) -{ - CoglXlibRenderer *xlib_renderer; - - xlib_renderer = _cogl_xlib_renderer_get_data (renderer); - g_assert (state == xlib_renderer->trap_state); - - XSetErrorHandler (state->old_error_handler); - - xlib_renderer->trap_state = state->old_state; - - return state->trapped_error_code; -} - static Display * assert_xlib_display (CoglRenderer *renderer, GError **error) { @@ -218,7 +153,6 @@ update_outputs (CoglRenderer *renderer, CoglXlibRenderer *xlib_renderer = _cogl_xlib_renderer_get_data (renderer); XRRScreenResources *resources; - CoglXlibTrapState state; gboolean error = FALSE; GList *new_outputs = NULL; GList *l, *m; @@ -230,7 +164,7 @@ update_outputs (CoglRenderer *renderer, resources = XRRGetScreenResources (xlib_renderer->xdpy, DefaultRootWindow (xlib_renderer->xdpy)); - _cogl_xlib_renderer_trap_errors (renderer, &state); + mtk_x11_error_trap_push (xlib_renderer->xdpy); for (i = 0; resources && i < resources->ncrtc && !error; i++) { @@ -386,7 +320,7 @@ update_outputs (CoglRenderer *renderer, } g_list_free_full (new_outputs, (GDestroyNotify)cogl_object_unref); - _cogl_xlib_renderer_untrap_errors (renderer, &state); + mtk_x11_error_trap_pop (xlib_renderer->xdpy); if (changed) { @@ -515,8 +449,6 @@ _cogl_xlib_renderer_connect (CoglRenderer *renderer, GError **error) &randr_error)) x11_renderer->randr_base = -1; - xlib_renderer->trap_state = NULL; - if (renderer->xlib_enable_event_retrieval) { _cogl_poll_renderer_add_fd (renderer, diff --git a/cogl/cogl/meson.build b/cogl/cogl/meson.build index 2aa71dd08..84ec3f1f0 100644 --- a/cogl/cogl/meson.build +++ b/cogl/cogl/meson.build @@ -361,7 +361,6 @@ if have_x11_client 'cogl-x11-onscreen.c', 'cogl-x11-onscreen.h', 'cogl-x11-renderer-private.h', - 'cogl-xlib-private.h', 'cogl-xlib-renderer-private.h', 'cogl-xlib-renderer.c', 'winsys/cogl-texture-pixmap-x11-private.h', diff --git a/cogl/cogl/winsys/cogl-onscreen-glx.c b/cogl/cogl/winsys/cogl-onscreen-glx.c index 05dd8ca1e..cc724b3db 100644 --- a/cogl/cogl/winsys/cogl-onscreen-glx.c +++ b/cogl/cogl/winsys/cogl-onscreen-glx.c @@ -38,6 +38,7 @@ #include "cogl/winsys/cogl-glx-display-private.h" #include "cogl/winsys/cogl-glx-renderer-private.h" #include "cogl/winsys/cogl-winsys-glx-private.h" +#include "mtk/mtk-x11.h" struct _CoglOnscreenGlx { @@ -114,7 +115,6 @@ cogl_onscreen_glx_allocate (CoglFramebuffer *framebuffer, { int width; int height; - CoglXlibTrapState state; XVisualInfo *xvisinfo; XSetWindowAttributes xattr; unsigned long mask; @@ -123,7 +123,7 @@ cogl_onscreen_glx_allocate (CoglFramebuffer *framebuffer, width = cogl_framebuffer_get_width (framebuffer); height = cogl_framebuffer_get_height (framebuffer); - _cogl_xlib_renderer_trap_errors (display->renderer, &state); + mtk_x11_error_trap_push (xlib_renderer->xdpy); xvisinfo = glx_renderer->glXGetVisualFromFBConfig (xlib_renderer->xdpy, fbconfig); @@ -162,7 +162,7 @@ cogl_onscreen_glx_allocate (CoglFramebuffer *framebuffer, XFree (xvisinfo); XSync (xlib_renderer->xdpy, False); - xerror = _cogl_xlib_renderer_untrap_errors (display->renderer, &state); + xerror = mtk_x11_error_trap_pop_with_return (xlib_renderer->xdpy); if (xerror) { char message[1000]; @@ -219,7 +219,6 @@ cogl_onscreen_glx_dispose (GObject *object) CoglXlibRenderer *xlib_renderer = _cogl_xlib_renderer_get_data (context->display->renderer); CoglGLXRenderer *glx_renderer = context->display->renderer->winsys; - CoglXlibTrapState old_state; GLXDrawable drawable; G_OBJECT_CLASS (cogl_onscreen_glx_parent_class)->dispose (object); @@ -229,7 +228,7 @@ cogl_onscreen_glx_dispose (GObject *object) if (onscreen_glx->glxwin != None || onscreen_glx->xwin != None) { - _cogl_xlib_renderer_trap_errors (context->display->renderer, &old_state); + mtk_x11_error_trap_push (xlib_renderer->xdpy); drawable = onscreen_glx->glxwin == None ? onscreen_glx->xwin : onscreen_glx->glxwin; @@ -272,8 +271,7 @@ cogl_onscreen_glx_dispose (GObject *object) XSync (xlib_renderer->xdpy, False); - _cogl_xlib_renderer_untrap_errors (context->display->renderer, - &old_state); + mtk_x11_error_trap_pop (xlib_renderer->xdpy); } } @@ -287,7 +285,6 @@ cogl_onscreen_glx_bind (CoglOnscreen *onscreen) CoglXlibRenderer *xlib_renderer = _cogl_xlib_renderer_get_data (context->display->renderer); CoglGLXRenderer *glx_renderer = context->display->renderer->winsys; - CoglXlibTrapState old_state; GLXDrawable drawable; drawable = @@ -296,7 +293,7 @@ cogl_onscreen_glx_bind (CoglOnscreen *onscreen) if (cogl_context_glx_get_current_drawable (context) == drawable) return; - _cogl_xlib_renderer_trap_errors (context->display->renderer, &old_state); + mtk_x11_error_trap_push (xlib_renderer->xdpy); COGL_NOTE (WINSYS, "MakeContextCurrent dpy: %p, window: 0x%x, context: %p", @@ -335,8 +332,7 @@ cogl_onscreen_glx_bind (CoglOnscreen *onscreen) XSync (xlib_renderer->xdpy, False); /* FIXME: We should be reporting a GError here */ - if (_cogl_xlib_renderer_untrap_errors (context->display->renderer, - &old_state)) + if (mtk_x11_error_trap_pop_with_return (xlib_renderer->xdpy)) { g_warning ("X Error received while making drawable 0x%08lX current", drawable); @@ -539,10 +535,8 @@ cogl_onscreen_glx_get_buffer_age (CoglOnscreen *onscreen) CoglOnscreenGlx *onscreen_glx = COGL_ONSCREEN_GLX (onscreen); CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen); CoglContext *context = cogl_framebuffer_get_context (framebuffer); - CoglDisplay *display = context->display; CoglXlibRenderer *xlib_renderer = _cogl_xlib_renderer_get_data (context->display->renderer); CoglGLXRenderer *glx_renderer = context->display->renderer->winsys; - CoglXlibTrapState old_state; GLXDrawable drawable; unsigned int age = 0; @@ -550,9 +544,9 @@ cogl_onscreen_glx_get_buffer_age (CoglOnscreen *onscreen) return 0; drawable = onscreen_glx->glxwin ? onscreen_glx->glxwin : onscreen_glx->xwin; - _cogl_xlib_renderer_trap_errors (display->renderer, &old_state); + mtk_x11_error_trap_push (xlib_renderer->xdpy); glx_renderer->glXQueryDrawable (xlib_renderer->xdpy, drawable, GLX_BACK_BUFFER_AGE_EXT, &age); - _cogl_xlib_renderer_untrap_errors (display->renderer, &old_state); + mtk_x11_error_trap_pop (xlib_renderer->xdpy); return age; } diff --git a/cogl/cogl/winsys/cogl-onscreen-xlib.c b/cogl/cogl/winsys/cogl-onscreen-xlib.c index 5568da194..50a320b7c 100644 --- a/cogl/cogl/winsys/cogl-onscreen-xlib.c +++ b/cogl/cogl/winsys/cogl-onscreen-xlib.c @@ -34,6 +34,7 @@ #include "cogl/cogl-xlib-renderer-private.h" #include "cogl/winsys/cogl-onscreen-egl.h" #include "cogl/winsys/cogl-winsys-egl-x11-private.h" +#include "mtk/mtk-x11.h" struct _CoglOnscreenXlib { @@ -68,7 +69,6 @@ create_xwindow (CoglOnscreenXlib *onscreen_xlib, Window xwin; int width; int height; - CoglXlibTrapState state; XVisualInfo *xvisinfo; XSetWindowAttributes xattr; unsigned long mask; @@ -77,7 +77,7 @@ create_xwindow (CoglOnscreenXlib *onscreen_xlib, width = cogl_framebuffer_get_width (framebuffer); height = cogl_framebuffer_get_height (framebuffer); - _cogl_xlib_renderer_trap_errors (display->renderer, &state); + mtk_x11_error_trap_push (xlib_renderer->xdpy); xvisinfo = cogl_display_xlib_get_visual_info (display, egl_config); if (xvisinfo == NULL) @@ -117,8 +117,7 @@ create_xwindow (CoglOnscreenXlib *onscreen_xlib, XFree (xvisinfo); XSync (xlib_renderer->xdpy, False); - xerror = - _cogl_xlib_renderer_untrap_errors (display->renderer, &state); + xerror = mtk_x11_error_trap_pop_with_return (xlib_renderer->xdpy); if (xerror) { char message[1000]; @@ -184,16 +183,14 @@ cogl_onscreen_xlib_dispose (GObject *object) CoglRenderer *renderer = context->display->renderer; CoglXlibRenderer *xlib_renderer = _cogl_xlib_renderer_get_data (renderer); - CoglXlibTrapState old_state; - _cogl_xlib_renderer_trap_errors (renderer, &old_state); + mtk_x11_error_trap_push (xlib_renderer->xdpy); XDestroyWindow (xlib_renderer->xdpy, onscreen_xlib->xwin); onscreen_xlib->xwin = None; XSync (xlib_renderer->xdpy, False); - if (_cogl_xlib_renderer_untrap_errors (renderer, - &old_state) != Success) + if (mtk_x11_error_trap_pop_with_return (xlib_renderer->xdpy)) g_warning ("X Error while destroying X window"); onscreen_xlib->xwin = None; diff --git a/cogl/cogl/winsys/cogl-winsys-glx.c b/cogl/cogl/winsys/cogl-winsys-glx.c index 86e580831..553fdc888 100644 --- a/cogl/cogl/winsys/cogl-winsys-glx.c +++ b/cogl/cogl/winsys/cogl-winsys-glx.c @@ -56,6 +56,7 @@ #include "cogl/winsys/cogl-onscreen-glx.h" #include "cogl/winsys/cogl-winsys-private.h" #include "cogl/winsys/cogl-winsys-glx-private.h" +#include "mtk/mtk-x11.h" #include #include @@ -642,16 +643,15 @@ create_gl3_context (CoglDisplay *display, DefaultScreen (xlib_renderer->xdpy)), "GLX_NV_robustness_video_memory_purge")) { - CoglXlibTrapState old_state; GLXContext ctx; - _cogl_xlib_renderer_trap_errors (display->renderer, &old_state); + mtk_x11_error_trap_push (xlib_renderer->xdpy); ctx = glx_renderer->glXCreateContextAttribs (xlib_renderer->xdpy, fb_config, NULL /* share_context */, True, /* direct */ attrib_list_reset_on_purge); - if (!_cogl_xlib_renderer_untrap_errors (display->renderer, &old_state) && ctx) + if (!mtk_x11_error_trap_pop_with_return (xlib_renderer->xdpy) && ctx) return ctx; } @@ -674,7 +674,6 @@ create_context (CoglDisplay *display, GError **error) XSetWindowAttributes attrs; XVisualInfo *xvisinfo; GLXDrawable dummy_drawable; - CoglXlibTrapState old_state; g_return_val_if_fail (glx_display->glx_context == NULL, TRUE); @@ -698,7 +697,7 @@ create_context (CoglDisplay *display, GError **error) COGL_NOTE (WINSYS, "Creating GLX Context (display: %p)", xlib_renderer->xdpy); - _cogl_xlib_renderer_trap_errors (display->renderer, &old_state); + mtk_x11_error_trap_push (xlib_renderer->xdpy); if (display->renderer->driver == COGL_DRIVER_GL3) glx_display->glx_context = create_gl3_context (display, config); @@ -710,7 +709,7 @@ create_context (CoglDisplay *display, GError **error) NULL, True); - if (_cogl_xlib_renderer_untrap_errors (display->renderer, &old_state) || + if (mtk_x11_error_trap_pop_with_return (xlib_renderer->xdpy) || glx_display->glx_context == NULL) { g_set_error_literal (error, COGL_WINSYS_ERROR, @@ -742,7 +741,7 @@ create_context (CoglDisplay *display, GError **error) return FALSE; } - _cogl_xlib_renderer_trap_errors (display->renderer, &old_state); + mtk_x11_error_trap_push (xlib_renderer->xdpy); attrs.override_redirect = True; attrs.colormap = XCreateColormap (xlib_renderer->xdpy, @@ -789,7 +788,7 @@ create_context (CoglDisplay *display, GError **error) xlib_renderer->xvisinfo = xvisinfo; - if (_cogl_xlib_renderer_untrap_errors (display->renderer, &old_state)) + if (mtk_x11_error_trap_pop_with_return (xlib_renderer->xdpy)) { g_set_error_literal (error, COGL_WINSYS_ERROR, COGL_WINSYS_ERROR_CREATE_CONTEXT, @@ -1052,7 +1051,6 @@ try_create_glx_pixmap (CoglContext *context, GLXFBConfig fb_config = (GLXFBConfig)0; int attribs[7]; int i = 0; - CoglXlibTrapState trap_state; unsigned int depth = tex_pixmap->depth; Visual* visual = tex_pixmap->visual; @@ -1101,7 +1099,7 @@ try_create_glx_pixmap (CoglContext *context, * upset if you try to create two GLXPixmaps for the same drawable. */ - _cogl_xlib_renderer_trap_errors (renderer, &trap_state); + mtk_x11_error_trap_push (xlib_renderer->xdpy); glx_tex_pixmap->glx_pixmap = glx_renderer->glXCreatePixmap (dpy, @@ -1112,13 +1110,13 @@ try_create_glx_pixmap (CoglContext *context, XSync (dpy, False); - if (_cogl_xlib_renderer_untrap_errors (renderer, &trap_state)) + if (mtk_x11_error_trap_pop_with_return (xlib_renderer->xdpy)) { COGL_NOTE (TEXTURE_PIXMAP, "Failed to create pixmap for %p", tex_pixmap); - _cogl_xlib_renderer_trap_errors (renderer, &trap_state); + mtk_x11_error_trap_push (xlib_renderer->xdpy); glx_renderer->glXDestroyPixmap (dpy, glx_tex_pixmap->glx_pixmap); XSync (dpy, False); - _cogl_xlib_renderer_untrap_errors (renderer, &trap_state); + mtk_x11_error_trap_pop (xlib_renderer->xdpy); glx_tex_pixmap->glx_pixmap = None; return FALSE; @@ -1169,7 +1167,6 @@ static void free_glx_pixmap (CoglContext *context, CoglTexturePixmapGLX *glx_tex_pixmap) { - CoglXlibTrapState trap_state; CoglRenderer *renderer; CoglXlibRenderer *xlib_renderer; CoglGLXRenderer *glx_renderer; @@ -1203,11 +1200,11 @@ free_glx_pixmap (CoglContext *context, * for reference, see: * http://bugzilla.clutter-project.org/show_bug.cgi?id=2324 */ - _cogl_xlib_renderer_trap_errors (renderer, &trap_state); + mtk_x11_error_trap_push (xlib_renderer->xdpy); glx_renderer->glXDestroyPixmap (xlib_renderer->xdpy, glx_tex_pixmap->glx_pixmap); XSync (xlib_renderer->xdpy, False); - _cogl_xlib_renderer_untrap_errors (renderer, &trap_state); + mtk_x11_error_trap_pop (xlib_renderer->xdpy); glx_tex_pixmap->glx_pixmap = None; glx_tex_pixmap->left.pixmap_bound = FALSE;