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 <info@metux.net>
This commit is contained in:
Enrico Weigelt, metux IT consult 2024-10-04 19:05:46 +02:00
parent f39bbe58d6
commit cece84fa93
3 changed files with 20 additions and 37 deletions

View File

@ -616,6 +616,11 @@ glamor_setup_formats(ScreenPtr screen)
glamor_priv->cbcr_format.texture_only = FALSE; glamor_priv->cbcr_format.texture_only = FALSE;
} }
static void glamor_pixmap_destroy(CallbackListPtr *pcbl, ScreenPtr pScreen, PixmapPtr pPixmap)
{
glamor_pixmap_destroy_fbo(pPixmap);
}
/* This function is used to free the glamor private screen's /* This function is used to free the glamor private screen's
* resources. If the DDX driver is not set GLAMOR_USE_SCREEN, * resources. If the DDX driver is not set GLAMOR_USE_SCREEN,
* then, DDX need to call this function at proper stage, if * then, DDX need to call this function at proper stage, if
@ -651,7 +656,7 @@ glamor_init(ScreenPtr screen, unsigned int flags)
LogMessage(X_WARNING, LogMessage(X_WARNING,
"glamor%d: Failed to allocate screen private\n", "glamor%d: Failed to allocate screen private\n",
screen->myNum); screen->myNum);
goto free_glamor_private; goto fail;
} }
glamor_set_screen_private(screen, glamor_priv); glamor_set_screen_private(screen, glamor_priv);
@ -661,7 +666,7 @@ glamor_init(ScreenPtr screen, unsigned int flags)
LogMessage(X_WARNING, LogMessage(X_WARNING,
"glamor%d: Failed to allocate pixmap private\n", "glamor%d: Failed to allocate pixmap private\n",
screen->myNum); screen->myNum);
goto free_glamor_private; goto fail;
} }
if (!dixRegisterPrivateKey(&glamor_gc_private_key, PRIVATE_GC, if (!dixRegisterPrivateKey(&glamor_gc_private_key, PRIVATE_GC,
@ -669,12 +674,9 @@ glamor_init(ScreenPtr screen, unsigned int flags)
LogMessage(X_WARNING, LogMessage(X_WARNING,
"glamor%d: Failed to allocate gc private\n", "glamor%d: Failed to allocate gc private\n",
screen->myNum); screen->myNum);
goto free_glamor_private; goto fail;
} }
glamor_priv->saved_procs.destroy_pixmap = screen->DestroyPixmap;
screen->DestroyPixmap = glamor_destroy_pixmap;
/* If we are using egl screen, call egl screen init to /* If we are using egl screen, call egl screen init to
* register correct close screen function. */ * register correct close screen function. */
if (flags & GLAMOR_USE_EGL_SCREEN) { if (flags & GLAMOR_USE_EGL_SCREEN) {
@ -895,14 +897,11 @@ glamor_init(ScreenPtr screen, unsigned int flags)
glamor_priv->screen = screen; glamor_priv->screen = screen;
dixScreenHookClose(screen, glamor_close_screen); dixScreenHookClose(screen, glamor_close_screen);
dixScreenHookPixmapDestroy(screen, glamor_pixmap_destroy);
return TRUE; return TRUE;
fail: fail:
/* Restore default DestroyPixmap handler */
screen->DestroyPixmap = glamor_priv->saved_procs.destroy_pixmap;
free_glamor_private:
free(glamor_priv); free(glamor_priv);
glamor_set_screen_private(screen, NULL); glamor_set_screen_private(screen, NULL);
return FALSE; return FALSE;
@ -932,10 +931,10 @@ static void glamor_close_screen(CallbackListPtr *pcbl, ScreenPtr screen, void *u
glamor_set_glvnd_vendor(screen, NULL); glamor_set_glvnd_vendor(screen, NULL);
dixScreenUnhookClose(screen, glamor_close_screen); dixScreenUnhookClose(screen, glamor_close_screen);
dixScreenUnhookPixmapDestroy(screen, glamor_pixmap_destroy);
screen->CreateGC = glamor_priv->saved_procs.create_gc; screen->CreateGC = glamor_priv->saved_procs.create_gc;
screen->CreatePixmap = glamor_priv->saved_procs.create_pixmap; 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->GetSpans = glamor_priv->saved_procs.get_spans;
screen->ChangeWindowAttributes = screen->ChangeWindowAttributes =
glamor_priv->saved_procs.change_window_attributes; glamor_priv->saved_procs.change_window_attributes;

View File

@ -60,7 +60,6 @@ struct glamor_egl_screen_private {
int dmabuf_capable; int dmabuf_capable;
Bool force_vendor; /* if GLVND vendor is forced from options */ Bool force_vendor; /* if GLVND vendor is forced from options */
DestroyPixmapProcPtr saved_destroy_pixmap;
xf86FreeScreenProc *saved_free_screen; xf86FreeScreenProc *saved_free_screen;
}; };
@ -744,35 +743,22 @@ glamor_egl_get_driver_name(ScreenPtr screen)
return NULL; return NULL;
} }
static void glamor_egl_pixmap_destroy(CallbackListPtr *pcbl, ScreenPtr pScreen, PixmapPtr pixmap)
static Bool
glamor_egl_destroy_pixmap(PixmapPtr pixmap)
{ {
ScreenPtr screen = pixmap->drawable.pScreen; ScreenPtr screen = pixmap->drawable.pScreen;
ScrnInfoPtr scrn = xf86ScreenToScrn(screen); ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
struct glamor_egl_screen_private *glamor_egl = struct glamor_egl_screen_private *glamor_egl =
glamor_egl_get_screen_private(scrn); glamor_egl_get_screen_private(scrn);
Bool ret = TRUE;
if (pixmap->refcnt == 1) {
struct glamor_pixmap_private *pixmap_priv = struct glamor_pixmap_private *pixmap_priv =
glamor_get_pixmap_private(pixmap); glamor_get_pixmap_private(pixmap);
BUG_RETURN_VAL(!pixmap_priv, FALSE); BUG_RETURN(!pixmap_priv);
if (pixmap_priv->image) if (pixmap_priv->image)
eglDestroyImageKHR(glamor_egl->display, 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;
}
void void
glamor_egl_exchange_buffers(PixmapPtr front, PixmapPtr back) glamor_egl_exchange_buffers(PixmapPtr front, PixmapPtr back)
{ {
@ -810,12 +796,13 @@ static void glamor_egl_close_screen(CallbackListPtr *pcbl, ScreenPtr screen, voi
screen_pixmap = screen->GetScreenPixmap(screen); screen_pixmap = screen->GetScreenPixmap(screen);
pixmap_priv = glamor_get_pixmap_private(screen_pixmap); pixmap_priv = glamor_get_pixmap_private(screen_pixmap);
BUG_RETURN_VAL(!pixmap_priv, FALSE); BUG_RETURN(!pixmap_priv);
eglDestroyImageKHR(glamor_egl->display, pixmap_priv->image); eglDestroyImageKHR(glamor_egl->display, pixmap_priv->image);
pixmap_priv->image = NULL; pixmap_priv->image = NULL;
dixScreenUnhookClose(screen, glamor_egl_close_screen); dixScreenUnhookClose(screen, glamor_egl_close_screen);
dixScreenUnhookPixmapDestroy(screen, glamor_egl_pixmap_destroy);
} }
#ifdef DRI3 #ifdef DRI3
@ -896,9 +883,7 @@ glamor_egl_screen_init(ScreenPtr screen, struct glamor_context *glamor_ctx)
const char *gbm_backend_name; const char *gbm_backend_name;
dixScreenHookClose(screen, glamor_egl_close_screen); dixScreenHookClose(screen, glamor_egl_close_screen);
dixScreenHookPixmapDestroy(screen, glamor_egl_pixmap_destroy);
glamor_egl->saved_destroy_pixmap = screen->DestroyPixmap;
screen->DestroyPixmap = glamor_egl_destroy_pixmap;
glamor_ctx->ctx = glamor_egl->context; glamor_ctx->ctx = glamor_egl->context;
glamor_ctx->display = glamor_egl->display; glamor_ctx->display = glamor_egl->display;

View File

@ -217,7 +217,6 @@ struct glamor_format {
struct glamor_saved_procs { struct glamor_saved_procs {
CreateGCProcPtr create_gc; CreateGCProcPtr create_gc;
CreatePixmapProcPtr create_pixmap; CreatePixmapProcPtr create_pixmap;
DestroyPixmapProcPtr destroy_pixmap;
GetSpansProcPtr get_spans; GetSpansProcPtr get_spans;
GetImageProcPtr get_image; GetImageProcPtr get_image;
CompositeProcPtr composite; CompositeProcPtr composite;