summaryrefslogtreecommitdiff
path: root/exa/exa.c
diff options
context:
space:
mode:
Diffstat (limited to 'exa/exa.c')
-rw-r--r--exa/exa.c42
1 files changed, 39 insertions, 3 deletions
diff --git a/exa/exa.c b/exa/exa.c
index 98e275daa..8e9d8d8a1 100644
--- a/exa/exa.c
+++ b/exa/exa.c
@@ -58,9 +58,16 @@ unsigned long
exaGetPixmapOffset(PixmapPtr pPix)
{
ExaScreenPriv (pPix->drawable.pScreen);
+ ExaPixmapPriv (pPix);
+ void *ptr;
- return ((unsigned long)pPix->devPrivate.ptr -
- (unsigned long)pExaScr->info->memoryBase);
+ /* Return the offscreen pointer if we've hidden the data. */
+ if (pPix->devPrivate.ptr == NULL)
+ ptr = pExaPixmap->fb_ptr;
+ else
+ ptr = pPix->devPrivate.ptr;
+
+ return ((unsigned long)ptr - (unsigned long)pExaScr->info->memoryBase);
}
/**
@@ -232,6 +239,11 @@ exaPixmapIsOffscreen(PixmapPtr p)
ScreenPtr pScreen = p->drawable.pScreen;
ExaScreenPriv(pScreen);
+ /* If the devPrivate.ptr is NULL, it's offscreen but we've hidden the data.
+ */
+ if (p->devPrivate.ptr == NULL)
+ return TRUE;
+
return ((unsigned long) ((CARD8 *) p->devPrivate.ptr -
(CARD8 *) pExaScr->info->memoryBase) <
pExaScr->info->memorySize);
@@ -301,6 +313,13 @@ exaPrepareAccess(DrawablePtr pDrawable, int index)
else
return;
+ /* Unhide pixmap pointer */
+ if (pPixmap->devPrivate.ptr == NULL) {
+ ExaPixmapPriv (pPixmap);
+
+ pPixmap->devPrivate.ptr = pExaPixmap->fb_ptr;
+ }
+
if (pExaScr->info->PrepareAccess == NULL)
return;
@@ -324,14 +343,25 @@ exaFinishAccess(DrawablePtr pDrawable, int index)
ScreenPtr pScreen = pDrawable->pScreen;
ExaScreenPriv (pScreen);
PixmapPtr pPixmap;
+ ExaPixmapPrivPtr pExaPixmap;
if (index == EXA_PREPARE_DEST)
exaDrawableDirty (pDrawable);
+ pPixmap = exaGetDrawablePixmap (pDrawable);
+
+ pExaPixmap = ExaGetPixmapPriv(pPixmap);
+
+ /* Rehide pixmap pointer if we're doing that. */
+ if (pExaPixmap != NULL && pExaScr->hideOffscreenPixmapData &&
+ pExaPixmap->fb_ptr == pPixmap->devPrivate.ptr)
+ {
+ pPixmap->devPrivate.ptr = pExaPixmap->fb_ptr;
+ }
+
if (pExaScr->info->FinishAccess == NULL)
return;
- pPixmap = exaGetDrawablePixmap (pDrawable);
if (!exaPixmapIsOffscreen (pPixmap))
return;
@@ -508,6 +538,12 @@ exaDriverInit (ScreenPtr pScreen,
pExaScr->SavedComposite = ps->Composite;
ps->Composite = exaComposite;
+ pExaScr->SavedRasterizeTrapezoid = ps->RasterizeTrapezoid;
+ ps->RasterizeTrapezoid = exaRasterizeTrapezoid;
+
+ pExaScr->SavedAddTriangles = ps->AddTriangles;
+ ps->AddTriangles = exaAddTriangles;
+
pExaScr->SavedGlyphs = ps->Glyphs;
ps->Glyphs = exaGlyphs;
}