exa: use proper wrapping in exa.c

This commit is contained in:
Maarten Maathuis 2009-01-31 19:25:20 +01:00
parent 015c99a4ad
commit 6fabf24949

141
exa/exa.c
View File

@ -188,6 +188,7 @@ exaDestroyPixmap (PixmapPtr pPixmap)
{ {
ScreenPtr pScreen = pPixmap->drawable.pScreen; ScreenPtr pScreen = pPixmap->drawable.pScreen;
ExaScreenPriv(pScreen); ExaScreenPriv(pScreen);
Bool ret;
if (pPixmap->refcnt == 1) if (pPixmap->refcnt == 1)
{ {
@ -213,7 +214,12 @@ exaDestroyPixmap (PixmapPtr pPixmap)
REGION_UNINIT(pPixmap->drawable.pScreen, &pExaPixmap->validSys); REGION_UNINIT(pPixmap->drawable.pScreen, &pExaPixmap->validSys);
REGION_UNINIT(pPixmap->drawable.pScreen, &pExaPixmap->validFB); REGION_UNINIT(pPixmap->drawable.pScreen, &pExaPixmap->validFB);
} }
return fbDestroyPixmap (pPixmap);
swap(pExaScr, pScreen, DestroyPixmap);
ret = pScreen->DestroyPixmap (pPixmap);
swap(pExaScr, pScreen, DestroyPixmap);
return ret;
} }
static int static int
@ -286,12 +292,14 @@ exaCreatePixmap(ScreenPtr pScreen, int w, int h, int depth,
if (w > 32767 || h > 32767) if (w > 32767 || h > 32767)
return NullPixmap; return NullPixmap;
swap(pExaScr, pScreen, CreatePixmap);
if (!pExaScr->info->CreatePixmap) { if (!pExaScr->info->CreatePixmap) {
pPixmap = fbCreatePixmap (pScreen, w, h, depth, usage_hint); pPixmap = pScreen->CreatePixmap (pScreen, w, h, depth, usage_hint);
} else { } else {
driver_alloc = 1; driver_alloc = 1;
pPixmap = fbCreatePixmap(pScreen, 0, 0, depth, usage_hint); pPixmap = pScreen->CreatePixmap(pScreen, 0, 0, depth, usage_hint);
} }
swap(pExaScr, pScreen, CreatePixmap);
if (!pPixmap) if (!pPixmap)
return NULL; return NULL;
@ -322,8 +330,10 @@ exaCreatePixmap(ScreenPtr pScreen, int w, int h, int depth,
pExaPixmap->driverPriv = pExaScr->info->CreatePixmap(pScreen, datasize, 0); pExaPixmap->driverPriv = pExaScr->info->CreatePixmap(pScreen, datasize, 0);
if (!pExaPixmap->driverPriv) { if (!pExaPixmap->driverPriv) {
fbDestroyPixmap(pPixmap); swap(pExaScr, pScreen, DestroyPixmap);
return NULL; pScreen->DestroyPixmap (pPixmap);
swap(pExaScr, pScreen, DestroyPixmap);
return NULL;
} }
(*pScreen->ModifyPixmapHeader)(pPixmap, w, h, 0, 0, (*pScreen->ModifyPixmapHeader)(pPixmap, w, h, 0, 0,
@ -354,8 +364,10 @@ exaCreatePixmap(ScreenPtr pScreen, int w, int h, int depth,
pExaPixmap->fb_size = pExaPixmap->fb_pitch * h; pExaPixmap->fb_size = pExaPixmap->fb_pitch * h;
if (pExaPixmap->fb_pitch > 131071) { if (pExaPixmap->fb_pitch > 131071) {
fbDestroyPixmap(pPixmap); swap(pExaScr, pScreen, DestroyPixmap);
return NULL; pScreen->DestroyPixmap (pPixmap);
swap(pExaScr, pScreen, DestroyPixmap);
return NULL;
} }
/* Set up damage tracking */ /* Set up damage tracking */
@ -364,7 +376,9 @@ exaCreatePixmap(ScreenPtr pScreen, int w, int h, int depth,
pScreen, pPixmap); pScreen, pPixmap);
if (pExaPixmap->pDamage == NULL) { if (pExaPixmap->pDamage == NULL) {
fbDestroyPixmap (pPixmap); swap(pExaScr, pScreen, DestroyPixmap);
pScreen->DestroyPixmap (pPixmap);
swap(pExaScr, pScreen, DestroyPixmap);
return NULL; return NULL;
} }
@ -774,6 +788,8 @@ static Bool
exaChangeWindowAttributes(WindowPtr pWin, unsigned long mask) exaChangeWindowAttributes(WindowPtr pWin, unsigned long mask)
{ {
Bool ret; Bool ret;
ScreenPtr pScreen = pWin->drawable.pScreen;
ExaScreenPriv(pScreen);
if ((mask & CWBackPixmap) && pWin->backgroundState == BackgroundPixmap) if ((mask & CWBackPixmap) && pWin->backgroundState == BackgroundPixmap)
exaPrepareAccess(&pWin->background.pixmap->drawable, EXA_PREPARE_SRC); exaPrepareAccess(&pWin->background.pixmap->drawable, EXA_PREPARE_SRC);
@ -781,7 +797,9 @@ exaChangeWindowAttributes(WindowPtr pWin, unsigned long mask)
if ((mask & CWBorderPixmap) && pWin->borderIsPixel == FALSE) if ((mask & CWBorderPixmap) && pWin->borderIsPixel == FALSE)
exaPrepareAccess(&pWin->border.pixmap->drawable, EXA_PREPARE_MASK); exaPrepareAccess(&pWin->border.pixmap->drawable, EXA_PREPARE_MASK);
ret = fbChangeWindowAttributes(pWin, mask); swap(pExaScr, pScreen, ChangeWindowAttributes);
ret = pScreen->ChangeWindowAttributes(pWin, mask);
swap(pExaScr, pScreen, ChangeWindowAttributes);
if ((mask & CWBorderPixmap) && pWin->borderIsPixel == FALSE) if ((mask & CWBorderPixmap) && pWin->borderIsPixel == FALSE)
exaFinishAccess(&pWin->border.pixmap->drawable, EXA_PREPARE_MASK); exaFinishAccess(&pWin->border.pixmap->drawable, EXA_PREPARE_MASK);
@ -796,9 +814,15 @@ static RegionPtr
exaBitmapToRegion(PixmapPtr pPix) exaBitmapToRegion(PixmapPtr pPix)
{ {
RegionPtr ret; RegionPtr ret;
ScreenPtr pScreen = pPix->drawable.pScreen;
ExaScreenPriv(pScreen);
exaPrepareAccess(&pPix->drawable, EXA_PREPARE_SRC); exaPrepareAccess(&pPix->drawable, EXA_PREPARE_SRC);
ret = fbPixmapToRegion(pPix); swap(pExaScr, pScreen, BitmapToRegion);
ret = pScreen->BitmapToRegion(pPix);
swap(pExaScr, pScreen, BitmapToRegion);
exaFinishAccess(&pPix->drawable, EXA_PREPARE_SRC); exaFinishAccess(&pPix->drawable, EXA_PREPARE_SRC);
return ret; return ret;
} }
@ -809,9 +833,9 @@ exaCreateScreenResources(ScreenPtr pScreen)
PixmapPtr pScreenPixmap; PixmapPtr pScreenPixmap;
Bool b; Bool b;
pScreen->CreateScreenResources = pExaScr->SavedCreateScreenResources; swap(pExaScr, pScreen, CreateScreenResources);
b = pScreen->CreateScreenResources(pScreen); b = pScreen->CreateScreenResources(pScreen);
pScreen->CreateScreenResources = exaCreateScreenResources; swap(pExaScr, pScreen, CreateScreenResources);
if (!b) if (!b)
return FALSE; return FALSE;
@ -845,23 +869,26 @@ exaCloseScreen(int i, ScreenPtr pScreen)
if (ps->Glyphs == exaGlyphs) if (ps->Glyphs == exaGlyphs)
exaGlyphsFini(pScreen); exaGlyphsFini(pScreen);
pScreen->CreateGC = pExaScr->SavedCreateGC; unwrap(pExaScr, pScreen, CreateGC);
pScreen->CloseScreen = pExaScr->SavedCloseScreen; unwrap(pExaScr, pScreen, CloseScreen);
pScreen->GetImage = pExaScr->SavedGetImage; unwrap(pExaScr, pScreen, GetImage);
pScreen->GetSpans = pExaScr->SavedGetSpans; unwrap(pExaScr, pScreen, GetSpans);
pScreen->CreatePixmap = pExaScr->SavedCreatePixmap; if (pExaScr->SavedCreatePixmap)
pScreen->DestroyPixmap = pExaScr->SavedDestroyPixmap; unwrap(pExaScr, pScreen, CreatePixmap);
pScreen->CopyWindow = pExaScr->SavedCopyWindow; if (pExaScr->SavedDestroyPixmap)
pScreen->ChangeWindowAttributes = pExaScr->SavedChangeWindowAttributes; unwrap(pExaScr, pScreen, DestroyPixmap);
pScreen->BitmapToRegion = pExaScr->SavedBitmapToRegion; unwrap(pExaScr, pScreen, CopyWindow);
pScreen->CreateScreenResources = pExaScr->SavedCreateScreenResources; unwrap(pExaScr, pScreen, ChangeWindowAttributes);
unwrap(pExaScr, pScreen, BitmapToRegion);
unwrap(pExaScr, pScreen, CreateScreenResources);
#ifdef RENDER #ifdef RENDER
if (ps) { if (ps) {
ps->Composite = pExaScr->SavedComposite; unwrap(pExaScr, ps, Composite);
ps->Glyphs = pExaScr->SavedGlyphs; if (pExaScr->SavedGlyphs)
ps->Trapezoids = pExaScr->SavedTrapezoids; unwrap(pExaScr, ps, Glyphs);
ps->Triangles = pExaScr->SavedTriangles; unwrap(pExaScr, ps, Trapezoids);
ps->AddTraps = pExaScr->SavedAddTraps; unwrap(pExaScr, ps, Triangles);
unwrap(pExaScr, ps, AddTraps);
} }
#endif #endif
@ -1001,48 +1028,23 @@ exaDriverInit (ScreenPtr pScreen,
/* /*
* Replace various fb screen functions * Replace various fb screen functions
*/ */
pExaScr->SavedCloseScreen = pScreen->CloseScreen; wrap(pExaScr, pScreen, CreateGC, exaCreateGC);
pScreen->CloseScreen = exaCloseScreen; wrap(pExaScr, pScreen, CloseScreen, exaCloseScreen);
wrap(pExaScr, pScreen, GetImage, exaGetImage);
pExaScr->SavedCreateGC = pScreen->CreateGC; wrap(pExaScr, pScreen, GetSpans, ExaCheckGetSpans);
pScreen->CreateGC = exaCreateGC; wrap(pExaScr, pScreen, CopyWindow, exaCopyWindow);
wrap(pExaScr, pScreen, ChangeWindowAttributes, exaChangeWindowAttributes);
pExaScr->SavedGetImage = pScreen->GetImage; wrap(pExaScr, pScreen, BitmapToRegion, exaBitmapToRegion);
pScreen->GetImage = exaGetImage; wrap(pExaScr, pScreen, CreateScreenResources, exaCreateScreenResources);
pExaScr->SavedGetSpans = pScreen->GetSpans;
pScreen->GetSpans = ExaCheckGetSpans;
pExaScr->SavedCopyWindow = pScreen->CopyWindow;
pScreen->CopyWindow = exaCopyWindow;
pExaScr->SavedChangeWindowAttributes = pScreen->ChangeWindowAttributes;
pScreen->ChangeWindowAttributes = exaChangeWindowAttributes;
pExaScr->SavedBitmapToRegion = pScreen->BitmapToRegion;
pScreen->BitmapToRegion = exaBitmapToRegion;
pExaScr->SavedCreateScreenResources = pScreen->CreateScreenResources;
pScreen->CreateScreenResources = exaCreateScreenResources;
#ifdef RENDER #ifdef RENDER
if (ps) { if (ps) {
pExaScr->SavedComposite = ps->Composite; wrap(pExaScr, ps, Composite, exaComposite);
ps->Composite = exaComposite; if (pScreenInfo->PrepareComposite)
wrap(pExaScr, ps, Glyphs, exaGlyphs);
if (pScreenInfo->PrepareComposite) { wrap(pExaScr, ps, Trapezoids, exaTrapezoids);
pExaScr->SavedGlyphs = ps->Glyphs; wrap(pExaScr, ps, Triangles, exaTriangles);
ps->Glyphs = exaGlyphs; wrap(pExaScr, ps, AddTraps, ExaCheckAddTraps);
}
pExaScr->SavedTriangles = ps->Triangles;
ps->Triangles = exaTriangles;
pExaScr->SavedTrapezoids = ps->Trapezoids;
ps->Trapezoids = exaTrapezoids;
pExaScr->SavedAddTraps = ps->AddTraps;
ps->AddTraps = ExaCheckAddTraps;
} }
#endif #endif
@ -1063,11 +1065,8 @@ exaDriverInit (ScreenPtr pScreen,
pScreen->myNum); pScreen->myNum);
return FALSE; return FALSE;
} }
pExaScr->SavedCreatePixmap = pScreen->CreatePixmap; wrap(pExaScr, pScreen, CreatePixmap, exaCreatePixmap);
pScreen->CreatePixmap = exaCreatePixmap; wrap(pExaScr, pScreen, DestroyPixmap, exaDestroyPixmap);
pExaScr->SavedDestroyPixmap = pScreen->DestroyPixmap;
pScreen->DestroyPixmap = exaDestroyPixmap;
pExaScr->SavedModifyPixmapHeader = pScreen->ModifyPixmapHeader; pExaScr->SavedModifyPixmapHeader = pScreen->ModifyPixmapHeader;
pScreen->ModifyPixmapHeader = exaModifyPixmapHeader; pScreen->ModifyPixmapHeader = exaModifyPixmapHeader;