diff options
author | Dave Airlie <airlied@linux.ie> | 2007-07-17 17:16:51 +1000 |
---|---|---|
committer | Michel Dänzer <michel@tungstengraphics.com> | 2007-09-07 17:58:49 +0200 |
commit | 3a4873a46093c37a707e6be0c336a57ab67115ab (patch) | |
tree | 0e0d8adcc0aaefd0934df2a65f99274685d305ab | |
parent | aa7ed1f5f35cd043bc38d985500aa0a32e857e84 (diff) |
EXA: Add a couple of missing exaPrepare/FinishAccess calls.
-rw-r--r-- | exa/exa.c | 57 | ||||
-rw-r--r-- | exa/exa_priv.h | 9 | ||||
-rw-r--r-- | exa/exa_unaccel.c | 7 |
3 files changed, 69 insertions, 4 deletions
@@ -452,11 +452,9 @@ exaValidateGC (GCPtr pGC, unsigned long changes, DrawablePtr pDrawable) if (!pGC->tileIsPixel && FbEvenTile (pGC->tile.pixmap->drawable.width * pDrawable->bitsPerPixel)) { - /* XXX This fixes corruption with tiled pixmaps, but may just be a - * workaround for broken drivers - */ - exaMoveOutPixmap(pGC->tile.pixmap); + exaPrepareAccess(&pGC->tile.pixmap->drawable, EXA_PREPARE_SRC); fbPadPixmap (pGC->tile.pixmap); + exaFinishAccess(&pGC->tile.pixmap->drawable, EXA_PREPARE_SRC); exaPixmapDirty(pGC->tile.pixmap, 0, 0, pGC->tile.pixmap->drawable.width, pGC->tile.pixmap->drawable.height); @@ -467,7 +465,9 @@ exaValidateGC (GCPtr pGC, unsigned long changes, DrawablePtr pDrawable) changes &= ~GCTile; } + exaPrepareAccessGC(pGC); fbValidateGC (pGC, changes, pDrawable); + exaFinishAccessGC(pGC); pGC->ops = (GCOps *) &exaOps; } @@ -497,6 +497,47 @@ exaCreateGC (GCPtr pGC) return TRUE; } +void +exaPrepareAccessWindow(WindowPtr pWin) +{ + if (pWin->backgroundState == BackgroundPixmap) + exaPrepareAccess(&pWin->background.pixmap->drawable, EXA_PREPARE_SRC); + + if (pWin->borderIsPixel == FALSE) + exaPrepareAccess(&pWin->border.pixmap->drawable, EXA_PREPARE_SRC); +} + +void +exaFinishAccessWindow(WindowPtr pWin) +{ + if (pWin->backgroundState == BackgroundPixmap) + exaFinishAccess(&pWin->background.pixmap->drawable, EXA_PREPARE_SRC); + + if (pWin->borderIsPixel == FALSE) + exaFinishAccess(&pWin->border.pixmap->drawable, EXA_PREPARE_SRC); +} + +static Bool +exaChangeWindowAttributes(WindowPtr pWin, unsigned long mask) +{ + Bool ret; + + exaPrepareAccessWindow(pWin); + ret = fbChangeWindowAttributes(pWin, mask); + exaFinishAccessWindow(pWin); + return ret; +} + +static RegionPtr +exaBitmapToRegion(PixmapPtr pPix) +{ + RegionPtr ret; + exaPrepareAccess(&pPix->drawable, EXA_PREPARE_SRC); + ret = fbPixmapToRegion(pPix); + exaFinishAccess(&pPix->drawable, EXA_PREPARE_SRC); + return ret; +} + /** * exaCloseScreen() unwraps its wrapped screen functions and tears down EXA's * screen private, before calling down to the next CloseSccreen. @@ -518,6 +559,8 @@ exaCloseScreen(int i, ScreenPtr pScreen) pScreen->CreatePixmap = pExaScr->SavedCreatePixmap; pScreen->DestroyPixmap = pExaScr->SavedDestroyPixmap; pScreen->CopyWindow = pExaScr->SavedCopyWindow; + pScreen->ChangeWindowAttributes = pExaScr->SavedChangeWindowAttributes; + pScreen->BitmapToRegion = pExaScr->SavedBitmapToRegion; #ifdef RENDER if (ps) { ps->Composite = pExaScr->SavedComposite; @@ -660,6 +703,12 @@ exaDriverInit (ScreenPtr pScreen, pExaScr->SavedCopyWindow = pScreen->CopyWindow; pScreen->CopyWindow = exaCopyWindow; + pExaScr->SavedChangeWindowAttributes = pScreen->ChangeWindowAttributes; + pScreen->ChangeWindowAttributes = exaChangeWindowAttributes; + + pExaScr->SavedBitmapToRegion = pScreen->BitmapToRegion; + pScreen->BitmapToRegion = exaBitmapToRegion; + pExaScr->SavedPaintWindowBackground = pScreen->PaintWindowBackground; pScreen->PaintWindowBackground = exaPaintWindow; diff --git a/exa/exa_priv.h b/exa/exa_priv.h index a456da05e..a08acfa69 100644 --- a/exa/exa_priv.h +++ b/exa/exa_priv.h @@ -106,6 +106,8 @@ typedef struct { DestroyPixmapProcPtr SavedDestroyPixmap; PaintWindowBorderProcPtr SavedPaintWindowBorder; CopyWindowProcPtr SavedCopyWindow; + ChangeWindowAttributesProcPtr SavedChangeWindowAttributes; + BitmapToRegionProcPtr SavedBitmapToRegion; #ifdef RENDER CompositeProcPtr SavedComposite; RasterizeTrapezoidProcPtr SavedRasterizeTrapezoid; @@ -113,6 +115,7 @@ typedef struct { GlyphsProcPtr SavedGlyphs; TrapezoidsProcPtr SavedTrapezoids; #endif + Bool swappedOut; enum ExaMigrationHeuristic migration; Bool hideOffscreenPixmapData; @@ -190,6 +193,12 @@ typedef struct _ExaMigrationRec { */ void exaDDXDriverInit (ScreenPtr pScreen); +void +exaPrepareAccessWindow(WindowPtr pWin); + +void +exaFinishAccessWindow(WindowPtr pWin); + /* exa_unaccel.c */ void exaPrepareAccessGC(GCPtr pGC); diff --git a/exa/exa_unaccel.c b/exa/exa_unaccel.c index d793ec2b9..8db28667f 100644 --- a/exa/exa_unaccel.c +++ b/exa/exa_unaccel.c @@ -35,10 +35,13 @@ * * Solid doesn't use an extra pixmap source, and Stippled/OpaqueStippled are * 1bpp and never in fb, so we don't worry about them. + * We should worry about them for completeness sake and going forward. */ void exaPrepareAccessGC(GCPtr pGC) { + if (pGC->stipple) + exaPrepareAccess(&pGC->stipple->drawable, EXA_PREPARE_SRC); if (pGC->fillStyle == FillTiled) exaPrepareAccess(&pGC->tile.pixmap->drawable, EXA_PREPARE_SRC); } @@ -51,6 +54,8 @@ exaFinishAccessGC(GCPtr pGC) { if (pGC->fillStyle == FillTiled) exaFinishAccess(&pGC->tile.pixmap->drawable, EXA_PREPARE_SRC); + if (pGC->stipple) + exaFinishAccess(&pGC->stipple->drawable, EXA_PREPARE_SRC); } #if DEBUG_TRACE_FALL @@ -294,7 +299,9 @@ ExaCheckPaintWindow (WindowPtr pWin, RegionPtr pRegion, int what) EXA_FALLBACK(("from %p (%c)\n", pWin, exaDrawableLocation(&pWin->drawable))); exaPrepareAccess (&pWin->drawable, EXA_PREPARE_DEST); + exaPrepareAccessWindow(pWin); fbPaintWindow (pWin, pRegion, what); + exaFinishAccessWindow(pWin); exaFinishAccess (&pWin->drawable, EXA_PREPARE_DEST); } |