From 09bb70272f18f5df93f3fceb6749ed00c653926f Mon Sep 17 00:00:00 2001 From: "Enrico Weigelt, metux IT consult" Date: Fri, 4 Oct 2024 19:05:46 +0200 Subject: [PATCH] (!1714) glamor: use PixmapDestroy hook Wrapping ScreenRec's function pointers is problematic for many reasons, so use the new pixmap destroy notify hook instead. Signed-off-by: Enrico Weigelt, metux IT consult --- glamor/glamor.c | 13 +++++++++---- glamor/glamor_egl.c | 28 +++++++--------------------- glamor/glamor_priv.h | 1 - 3 files changed, 16 insertions(+), 26 deletions(-) diff --git a/glamor/glamor.c b/glamor/glamor.c index 914c414a1..bb46fbd46 100644 --- a/glamor/glamor.c +++ b/glamor/glamor.c @@ -604,6 +604,11 @@ glamor_setup_formats(ScreenPtr screen) glamor_priv->cbcr_format.texture_only = FALSE; } +static void glamor_pixmap_destroy(ScreenPtr pScreen, PixmapPtr pPixmap, void *arg) +{ + glamor_pixmap_destroy_fbo(pPixmap); +} + /** Set up glamor for an already-configured GL context. */ Bool glamor_init(ScreenPtr screen, unsigned int flags) @@ -652,8 +657,7 @@ glamor_init(ScreenPtr screen, unsigned int flags) 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; + dixScreenHookPixmapDestroy(screen, glamor_pixmap_destroy, NULL); /* If we are using egl screen, call egl screen init to * register correct close screen function. */ @@ -879,7 +883,7 @@ glamor_init(ScreenPtr screen, unsigned int flags) fail: /* Restore default CloseScreen and DestroyPixmap handlers */ screen->CloseScreen = glamor_priv->saved_procs.close_screen; - screen->DestroyPixmap = glamor_priv->saved_procs.destroy_pixmap; + dixScreenUnhookPixmapDestroy(screen, glamor_pixmap_destroy, NULL); free_glamor_private: free(glamor_priv); @@ -913,9 +917,10 @@ glamor_close_screen(ScreenPtr screen) glamor_set_glvnd_vendor(screen, NULL); screen->CloseScreen = glamor_priv->saved_procs.close_screen; + dixScreenUnhookPixmapDestroy(screen, glamor_pixmap_destroy, NULL); + screen->CreateGC = glamor_priv->saved_procs.create_gc; screen->CreatePixmap = glamor_priv->saved_procs.create_pixmap; - screen->DestroyPixmap = glamor_priv->saved_procs.destroy_pixmap; screen->GetSpans = glamor_priv->saved_procs.get_spans; screen->ChangeWindowAttributes = glamor_priv->saved_procs.change_window_attributes; diff --git a/glamor/glamor_egl.c b/glamor/glamor_egl.c index b4244cd9f..9924eb944 100644 --- a/glamor/glamor_egl.c +++ b/glamor/glamor_egl.c @@ -62,7 +62,6 @@ struct glamor_egl_screen_private { Bool force_vendor; /* if GLVND vendor is forced from options */ CloseScreenProcPtr saved_close_screen; - DestroyPixmapProcPtr saved_destroy_pixmap; xf86FreeScreenProc *saved_free_screen; }; @@ -749,31 +748,18 @@ glamor_egl_get_driver_name(ScreenPtr screen) return NULL; } - -static Bool -glamor_egl_destroy_pixmap(PixmapPtr pixmap) +static void glamor_egl_pixmap_destroy(ScreenPtr pScreen, PixmapPtr pixmap, void *arg) { ScreenPtr screen = pixmap->drawable.pScreen; ScrnInfoPtr scrn = xf86ScreenToScrn(screen); struct glamor_egl_screen_private *glamor_egl = glamor_egl_get_screen_private(scrn); - Bool ret = TRUE; - if (pixmap->refcnt == 1) { - struct glamor_pixmap_private *pixmap_priv = - glamor_get_pixmap_private(pixmap); + struct glamor_pixmap_private *pixmap_priv = + glamor_get_pixmap_private(pixmap); - if (pixmap_priv->image) - eglDestroyImageKHR(glamor_egl->display, pixmap_priv->image); - } - - screen->DestroyPixmap = glamor_egl->saved_destroy_pixmap; - if (screen->DestroyPixmap) - ret = screen->DestroyPixmap(pixmap); - glamor_egl->saved_destroy_pixmap = screen->DestroyPixmap; - screen->DestroyPixmap = glamor_egl_destroy_pixmap; - - return ret; + if (pixmap_priv->image) + eglDestroyImageKHR(glamor_egl->display, pixmap_priv->image); } void @@ -815,6 +801,7 @@ glamor_egl_close_screen(ScreenPtr screen) eglDestroyImageKHR(glamor_egl->display, pixmap_priv->image); pixmap_priv->image = NULL; + dixScreenUnhookPixmapDestroy(screen, glamor_egl_pixmap_destroy, NULL); screen->CloseScreen = glamor_egl->saved_close_screen; return screen->CloseScreen(screen); @@ -900,8 +887,7 @@ glamor_egl_screen_init(ScreenPtr screen, struct glamor_context *glamor_ctx) glamor_egl->saved_close_screen = screen->CloseScreen; screen->CloseScreen = glamor_egl_close_screen; - glamor_egl->saved_destroy_pixmap = screen->DestroyPixmap; - screen->DestroyPixmap = glamor_egl_destroy_pixmap; + dixScreenHookPixmapDestroy(screen, glamor_egl_pixmap_destroy, NULL); glamor_ctx->ctx = glamor_egl->context; glamor_ctx->display = glamor_egl->display; diff --git a/glamor/glamor_priv.h b/glamor/glamor_priv.h index f80aab74b..76e6d9691 100644 --- a/glamor/glamor_priv.h +++ b/glamor/glamor_priv.h @@ -209,7 +209,6 @@ struct glamor_saved_procs { CloseScreenProcPtr close_screen; CreateGCProcPtr create_gc; CreatePixmapProcPtr create_pixmap; - DestroyPixmapProcPtr destroy_pixmap; GetSpansProcPtr get_spans; GetImageProcPtr get_image; CompositeProcPtr composite;