diff options
Diffstat (limited to 'exa/exa.c')
-rw-r--r-- | exa/exa.c | 42 |
1 files changed, 39 insertions, 3 deletions
@@ -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; } |