From a6a17034f353e118132f7f6c55a9b3230cf7346b Mon Sep 17 00:00:00 2001 From: "Enrico Weigelt, metux IT consult" Date: Fri, 25 Apr 2025 19:41:48 +0200 Subject: [PATCH] glamor: use CloseScreen hook Wrapping ScreenRec's function pointers is problematic for many reasons, so use the new screen close notify hook instead. Signed-off-by: Enrico Weigelt, metux IT consult --- glamor/glamor.c | 28 ++++++++++++++++++---------- glamor/glamor.h | 1 - glamor/glamor_egl.c | 13 ++++--------- glamor/glamor_priv.h | 1 - 4 files changed, 22 insertions(+), 21 deletions(-) diff --git a/glamor/glamor.c b/glamor/glamor.c index 369edb8eb..303f3f9fa 100644 --- a/glamor/glamor.c +++ b/glamor/glamor.c @@ -36,6 +36,7 @@ #include #include +#include "dix/screen_hooks_priv.h" #include "os/bug_priv.h" #include "glamor_priv.h" @@ -615,6 +616,17 @@ glamor_setup_formats(ScreenPtr screen) glamor_priv->cbcr_format.texture_only = FALSE; } +/* This function is used to free the glamor private screen's + * resources. If the DDX driver is not set GLAMOR_USE_SCREEN, + * then, DDX need to call this function at proper stage, if + * it is the xorg DDX driver,then it should be called at free + * screen stage not the close screen stage. The reason is after + * call to this function, the xorg DDX may need to destroy the + * screen pixmap which must be a glamor pixmap and requires + * the internal data structure still exist at that time. + * Otherwise, the glamor internal structure will not be freed.*/ +static void glamor_close_screen(CallbackListPtr *pcbl, ScreenPtr screen, void *unused); + /** Set up glamor for an already-configured GL context. */ Bool glamor_init(ScreenPtr screen, unsigned int flags) @@ -660,9 +672,6 @@ glamor_init(ScreenPtr screen, unsigned int flags) goto free_glamor_private; } - glamor_priv->saved_procs.close_screen = screen->CloseScreen; - screen->CloseScreen = glamor_close_screen; - glamor_priv->saved_procs.destroy_pixmap = screen->DestroyPixmap; screen->DestroyPixmap = glamor_destroy_pixmap; @@ -885,11 +894,12 @@ glamor_init(ScreenPtr screen, unsigned int flags) glamor_priv->screen = screen; + dixScreenHookClose(screen, glamor_close_screen); + return TRUE; fail: - /* Restore default CloseScreen and DestroyPixmap handlers */ - screen->CloseScreen = glamor_priv->saved_procs.close_screen; + /* Restore default DestroyPixmap handler */ screen->DestroyPixmap = glamor_priv->saved_procs.destroy_pixmap; free_glamor_private: @@ -911,8 +921,7 @@ glamor_release_screen_priv(ScreenPtr screen) glamor_set_screen_private(screen, NULL); } -Bool -glamor_close_screen(ScreenPtr screen) +static void glamor_close_screen(CallbackListPtr *pcbl, ScreenPtr screen, void *unused) { glamor_screen_private *glamor_priv; PixmapPtr screen_pixmap; @@ -921,7 +930,8 @@ glamor_close_screen(ScreenPtr screen) glamor_sync_close(screen); glamor_composite_glyphs_fini(screen); glamor_set_glvnd_vendor(screen, NULL); - screen->CloseScreen = glamor_priv->saved_procs.close_screen; + + dixScreenUnhookClose(screen, glamor_close_screen); screen->CreateGC = glamor_priv->saved_procs.create_gc; screen->CreatePixmap = glamor_priv->saved_procs.create_pixmap; @@ -946,8 +956,6 @@ glamor_close_screen(ScreenPtr screen) glamor_pixmap_destroy_fbo(screen_pixmap); glamor_release_screen_priv(screen); - - return screen->CloseScreen(screen); } void diff --git a/glamor/glamor.h b/glamor/glamor.h index dbb5d82db..e95c5fb13 100644 --- a/glamor/glamor.h +++ b/glamor/glamor.h @@ -106,7 +106,6 @@ extern _X_EXPORT void glamor_fini(ScreenPtr screen); * screen pixmap which must be a glamor pixmap and requires * the internal data structure still exist at that time. * Otherwise, the glamor internal structure will not be freed.*/ -extern _X_EXPORT Bool glamor_close_screen(ScreenPtr screen); extern _X_EXPORT uint32_t glamor_get_pixmap_texture(PixmapPtr pixmap); diff --git a/glamor/glamor_egl.c b/glamor/glamor_egl.c index 6b594e292..9de589ab5 100644 --- a/glamor/glamor_egl.c +++ b/glamor/glamor_egl.c @@ -42,6 +42,7 @@ #include #include +#include "dix/screen_hooks_priv.h" #include "glamor/glamor_priv.h" #include "os/bug_priv.h" @@ -54,13 +55,11 @@ struct glamor_egl_screen_private { EGLContext context; char *device_path; - CloseScreenProcPtr CloseScreen; int fd; struct gbm_device *gbm; int dmabuf_capable; Bool force_vendor; /* if GLVND vendor is forced from options */ - CloseScreenProcPtr saved_close_screen; DestroyPixmapProcPtr saved_destroy_pixmap; xf86FreeScreenProc *saved_free_screen; }; @@ -799,8 +798,7 @@ glamor_egl_exchange_buffers(PixmapPtr front, PixmapPtr back) glamor_set_pixmap_type(back, GLAMOR_TEXTURE_DRM); } -static Bool -glamor_egl_close_screen(ScreenPtr screen) +static void glamor_egl_close_screen(CallbackListPtr *pcbl, ScreenPtr screen, void *unused) { ScrnInfoPtr scrn; struct glamor_egl_screen_private *glamor_egl; @@ -817,9 +815,7 @@ glamor_egl_close_screen(ScreenPtr screen) eglDestroyImageKHR(glamor_egl->display, pixmap_priv->image); pixmap_priv->image = NULL; - screen->CloseScreen = glamor_egl->saved_close_screen; - - return screen->CloseScreen(screen); + dixScreenUnhookClose(screen, glamor_egl_close_screen); } #ifdef DRI3 @@ -899,8 +895,7 @@ glamor_egl_screen_init(ScreenPtr screen, struct glamor_context *glamor_ctx) #endif const char *gbm_backend_name; - glamor_egl->saved_close_screen = screen->CloseScreen; - screen->CloseScreen = glamor_egl_close_screen; + dixScreenHookClose(screen, glamor_egl_close_screen); glamor_egl->saved_destroy_pixmap = screen->DestroyPixmap; screen->DestroyPixmap = glamor_egl_destroy_pixmap; diff --git a/glamor/glamor_priv.h b/glamor/glamor_priv.h index 278b305a3..1f31923f0 100644 --- a/glamor/glamor_priv.h +++ b/glamor/glamor_priv.h @@ -215,7 +215,6 @@ struct glamor_format { }; struct glamor_saved_procs { - CloseScreenProcPtr close_screen; CreateGCProcPtr create_gc; CreatePixmapProcPtr create_pixmap; DestroyPixmapProcPtr destroy_pixmap;