(!1714) exa: 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 17:56:04 +02:00
parent 987f37270b
commit c248346e78
5 changed files with 52 additions and 94 deletions

View File

@ -740,6 +740,11 @@ exaCloseScreen(ScreenPtr pScreen)
ExaScreenPriv(pScreen); ExaScreenPriv(pScreen);
PictureScreenPtr ps = GetPictureScreenIfSet(pScreen); PictureScreenPtr ps = GetPictureScreenIfSet(pScreen);
/* doesn't matter which one actually was registered */
dixScreenUnhookPixmapDestroy(pScreen, exaPixmapDestroy_classic, 0);
dixScreenUnhookPixmapDestroy(pScreen, exaPixmapDestroy_driver, 0);
dixScreenUnhookPixmapDestroy(pScreen, exaPixmapDestroy_mixed, 0);
if (ps->Glyphs == exaGlyphs) if (ps->Glyphs == exaGlyphs)
exaGlyphsFini(pScreen); exaGlyphsFini(pScreen);
@ -753,8 +758,6 @@ exaCloseScreen(ScreenPtr pScreen)
unwrap(pExaScr, pScreen, GetSpans); unwrap(pExaScr, pScreen, GetSpans);
if (pExaScr->SavedCreatePixmap) if (pExaScr->SavedCreatePixmap)
unwrap(pExaScr, pScreen, CreatePixmap); unwrap(pExaScr, pScreen, CreatePixmap);
if (pExaScr->SavedDestroyPixmap)
unwrap(pExaScr, pScreen, DestroyPixmap);
if (pExaScr->SavedModifyPixmapHeader) if (pExaScr->SavedModifyPixmapHeader)
unwrap(pExaScr, pScreen, ModifyPixmapHeader); unwrap(pExaScr, pScreen, ModifyPixmapHeader);
unwrap(pExaScr, pScreen, CopyWindow); unwrap(pExaScr, pScreen, CopyWindow);
@ -955,8 +958,9 @@ exaDriverInit(ScreenPtr pScreen, ExaDriverPtr pScreenInfo)
} }
if (pExaScr->info->flags & EXA_HANDLES_PIXMAPS) { if (pExaScr->info->flags & EXA_HANDLES_PIXMAPS) {
if (pExaScr->info->flags & EXA_MIXED_PIXMAPS) { if (pExaScr->info->flags & EXA_MIXED_PIXMAPS) {
dixScreenHookPixmapDestroy(pScreen, exaPixmapDestroy_mixed, 0);
wrap(pExaScr, pScreen, CreatePixmap, exaCreatePixmap_mixed); wrap(pExaScr, pScreen, CreatePixmap, exaCreatePixmap_mixed);
wrap(pExaScr, pScreen, DestroyPixmap, exaDestroyPixmap_mixed);
wrap(pExaScr, pScreen, ModifyPixmapHeader, wrap(pExaScr, pScreen, ModifyPixmapHeader,
exaModifyPixmapHeader_mixed); exaModifyPixmapHeader_mixed);
wrap(pExaScr, pScreen, SharePixmapBacking, exaSharePixmapBacking_mixed); wrap(pExaScr, pScreen, SharePixmapBacking, exaSharePixmapBacking_mixed);
@ -969,8 +973,9 @@ exaDriverInit(ScreenPtr pScreen, ExaDriverPtr pScreenInfo)
pExaScr->prepare_access_reg = exaPrepareAccessReg_mixed; pExaScr->prepare_access_reg = exaPrepareAccessReg_mixed;
} }
else { else {
dixScreenHookPixmapDestroy(pScreen, exaPixmapDestroy_driver, 0);
wrap(pExaScr, pScreen, CreatePixmap, exaCreatePixmap_driver); wrap(pExaScr, pScreen, CreatePixmap, exaCreatePixmap_driver);
wrap(pExaScr, pScreen, DestroyPixmap, exaDestroyPixmap_driver);
wrap(pExaScr, pScreen, ModifyPixmapHeader, wrap(pExaScr, pScreen, ModifyPixmapHeader,
exaModifyPixmapHeader_driver); exaModifyPixmapHeader_driver);
pExaScr->do_migration = NULL; pExaScr->do_migration = NULL;
@ -981,8 +986,9 @@ exaDriverInit(ScreenPtr pScreen, ExaDriverPtr pScreenInfo)
} }
} }
else { else {
dixScreenHookPixmapDestroy(pScreen, exaPixmapDestroy_classic, 0);
wrap(pExaScr, pScreen, CreatePixmap, exaCreatePixmap_classic); wrap(pExaScr, pScreen, CreatePixmap, exaCreatePixmap_classic);
wrap(pExaScr, pScreen, DestroyPixmap, exaDestroyPixmap_classic);
wrap(pExaScr, pScreen, ModifyPixmapHeader, wrap(pExaScr, pScreen, ModifyPixmapHeader,
exaModifyPixmapHeader_classic); exaModifyPixmapHeader_classic);
pExaScr->do_migration = exaDoMigration_classic; pExaScr->do_migration = exaDoMigration_classic;

View File

@ -206,18 +206,11 @@ exaModifyPixmapHeader_classic(PixmapPtr pPixmap, int width, int height,
return ret; return ret;
} }
Bool void exaPixmapDestroy_classic(ScreenPtr pScreen, PixmapPtr pPixmap, void *arg)
exaDestroyPixmap_classic(PixmapPtr pPixmap)
{ {
ScreenPtr pScreen = pPixmap->drawable.pScreen;
ExaScreenPriv(pScreen);
Bool ret = TRUE;
if (pPixmap->refcnt == 1) {
ExaPixmapPriv(pPixmap); ExaPixmapPriv(pPixmap);
if (!pExaPixmap) // we're called on an error path if (!pExaPixmap) // we're called on an error path
goto out; return;
exaDestroyPixmap(pPixmap); exaDestroyPixmap(pPixmap);
@ -235,15 +228,6 @@ exaDestroyPixmap_classic(PixmapPtr pPixmap)
RegionUninit(&pExaPixmap->validFB); RegionUninit(&pExaPixmap->validFB);
} }
out:
// restore original (screen driver's) DestroyPixmap() handler and call it
swap(pExaScr, pScreen, DestroyPixmap);
dixDestroyPixmap(pPixmap, 0);
swap(pExaScr, pScreen, DestroyPixmap);
return ret;
}
Bool Bool
exaPixmapHasGpuCopy_classic(PixmapPtr pPixmap) exaPixmapHasGpuCopy_classic(PixmapPtr pPixmap)
{ {

View File

@ -185,18 +185,13 @@ exaModifyPixmapHeader_driver(PixmapPtr pPixmap, int width, int height,
return ret; return ret;
} }
Bool void exaPixmapDestroy_driver(ScreenPtr pScreen, PixmapPtr pPixmap, void *arg)
exaDestroyPixmap_driver(PixmapPtr pPixmap)
{ {
ScreenPtr pScreen = pPixmap->drawable.pScreen;
ExaScreenPriv(pScreen); ExaScreenPriv(pScreen);
Bool ret = TRUE;
if (pPixmap->refcnt == 1) {
ExaPixmapPriv(pPixmap); ExaPixmapPriv(pPixmap);
if (!pExaPixmap) // we're called on an error path if (!pExaPixmap) // we're called on an error path
goto out; return;
exaDestroyPixmap(pPixmap); exaDestroyPixmap(pPixmap);
@ -205,15 +200,6 @@ exaDestroyPixmap_driver(PixmapPtr pPixmap)
pExaPixmap->driverPriv = NULL; pExaPixmap->driverPriv = NULL;
} }
out:
// restore original (screen driver's) DestroyPixmap() handler and call it
swap(pExaScr, pScreen, DestroyPixmap);
dixDestroyPixmap(pPixmap, 0);
swap(pExaScr, pScreen, DestroyPixmap);
return ret;
}
Bool Bool
exaPixmapHasGpuCopy_driver(PixmapPtr pPixmap) exaPixmapHasGpuCopy_driver(PixmapPtr pPixmap)
{ {

View File

@ -239,18 +239,13 @@ exaModifyPixmapHeader_mixed(PixmapPtr pPixmap, int width, int height, int depth,
return ret; return ret;
} }
Bool void exaPixmapDestroy_mixed(ScreenPtr pScreen, PixmapPtr pPixmap, void *arg)
exaDestroyPixmap_mixed(PixmapPtr pPixmap)
{ {
ScreenPtr pScreen = pPixmap->drawable.pScreen;
ExaScreenPriv(pScreen); ExaScreenPriv(pScreen);
Bool ret = TRUE;
if (pPixmap->refcnt == 1) {
ExaPixmapPriv(pPixmap); ExaPixmapPriv(pPixmap);
if (!pExaPixmap) if (!pExaPixmap) // we're called on an error path
goto out; // we're called on an error path return;
exaDestroyPixmap(pPixmap); exaDestroyPixmap(pPixmap);
@ -268,15 +263,6 @@ exaDestroyPixmap_mixed(PixmapPtr pPixmap)
} }
} }
out:
// restore original (screen driver's) DestroyPixmap() handler and call it
swap(pExaScr, pScreen, DestroyPixmap);
dixDestroyPixmap(pPixmap, 0);
swap(pExaScr, pScreen, DestroyPixmap);
return ret;
}
Bool Bool
exaPixmapHasGpuCopy_mixed(PixmapPtr pPixmap) exaPixmapHasGpuCopy_mixed(PixmapPtr pPixmap)
{ {

View File

@ -156,7 +156,6 @@ typedef struct {
GetImageProcPtr SavedGetImage; GetImageProcPtr SavedGetImage;
GetSpansProcPtr SavedGetSpans; GetSpansProcPtr SavedGetSpans;
CreatePixmapProcPtr SavedCreatePixmap; CreatePixmapProcPtr SavedCreatePixmap;
DestroyPixmapProcPtr SavedDestroyPixmap;
CopyWindowProcPtr SavedCopyWindow; CopyWindowProcPtr SavedCopyWindow;
ChangeWindowAttributesProcPtr SavedChangeWindowAttributes; ChangeWindowAttributesProcPtr SavedChangeWindowAttributes;
BitmapToRegionProcPtr SavedBitmapToRegion; BitmapToRegionProcPtr SavedBitmapToRegion;
@ -590,8 +589,7 @@ exaModifyPixmapHeader_classic(PixmapPtr pPixmap, int width, int height,
int depth, int bitsPerPixel, int devKind, int depth, int bitsPerPixel, int devKind,
void *pPixData); void *pPixData);
Bool void exaPixmapDestroy_classic(ScreenPtr pScreen, PixmapPtr pPixmap, void *arg);
exaDestroyPixmap_classic(PixmapPtr pPixmap);
Bool Bool
exaPixmapHasGpuCopy_classic(PixmapPtr pPixmap); exaPixmapHasGpuCopy_classic(PixmapPtr pPixmap);
@ -608,8 +606,7 @@ exaModifyPixmapHeader_driver(PixmapPtr pPixmap, int width, int height,
int depth, int bitsPerPixel, int devKind, int depth, int bitsPerPixel, int devKind,
void *pPixData); void *pPixData);
Bool void exaPixmapDestroy_driver(ScreenPtr pScreen, PixmapPtr pPixmap, void *arg);
exaDestroyPixmap_driver(PixmapPtr pPixmap);
Bool Bool
exaPixmapHasGpuCopy_driver(PixmapPtr pPixmap); exaPixmapHasGpuCopy_driver(PixmapPtr pPixmap);
@ -625,8 +622,7 @@ Bool
exaModifyPixmapHeader_mixed(PixmapPtr pPixmap, int width, int height, int depth, exaModifyPixmapHeader_mixed(PixmapPtr pPixmap, int width, int height, int depth,
int bitsPerPixel, int devKind, void *pPixData); int bitsPerPixel, int devKind, void *pPixData);
Bool void exaPixmapDestroy_mixed(ScreenPtr pScreen, PixmapPtr pPixmap, void *arg);
exaDestroyPixmap_mixed(PixmapPtr pPixmap);
Bool Bool
exaPixmapHasGpuCopy_mixed(PixmapPtr pPixmap); exaPixmapHasGpuCopy_mixed(PixmapPtr pPixmap);