diff --git a/hw/kdrive/src/kaa.c b/hw/kdrive/src/kaa.c index 50a5a748d..0555f0307 100644 --- a/hw/kdrive/src/kaa.c +++ b/hw/kdrive/src/kaa.c @@ -57,6 +57,21 @@ int kaaPixmapPrivateIndex; #define KAA_PIXMAP_SCORE_PINNED 1000 #define MIN_OFFPIX_SIZE (4096) +void +kaaDrawableDirty (DrawablePtr pDrawable) +{ + PixmapPtr pPixmap; + KaaPixmapPrivPtr pKaaPixmap; + + if (pDrawable->type == DRAWABLE_WINDOW) + pPixmap = (*pDrawable->pScreen->GetWindowPixmap)((WindowPtr) pDrawable); + else + pPixmap = (PixmapPtr)pDrawable; + + pKaaPixmap = KaaGetPixmapPriv(pPixmap); + if (pKaaPixmap != NULL) + pKaaPixmap->dirty = TRUE; +} static void kaaPixmapSave (ScreenPtr pScreen, KdOffscreenArea *area) @@ -74,8 +89,6 @@ kaaPixmapSave (ScreenPtr pScreen, KdOffscreenArea *area) pPixmap->drawable.width, pPixmap->drawable.height)); - KdCheckSync (pPixmap->drawable.pScreen); - src_pitch = pPixmap->devKind; dst_pitch = pKaaPixmap->devKind; @@ -86,7 +99,12 @@ kaaPixmapSave (ScreenPtr pScreen, KdOffscreenArea *area) pPixmap->devPrivate.ptr = dst; pPixmap->drawable.serialNumber = NEXT_SERIAL_NUMBER; pKaaPixmap->area = NULL; - + + if (!pKaaPixmap->dirty) + return; + + KdCheckSync (pPixmap->drawable.pScreen); + bytes = src_pitch < dst_pitch ? src_pitch : dst_pitch; i = pPixmap->drawable.height; @@ -152,6 +170,7 @@ kaaMoveInPixmap (PixmapPtr pPixmap) { ScreenPtr pScreen = pPixmap->drawable.pScreen; KaaScreenPriv (pScreen); + KaaPixmapPriv (pPixmap); int dst_pitch, src_pitch, bytes; unsigned char *dst, *src; int i; @@ -168,7 +187,9 @@ kaaMoveInPixmap (PixmapPtr pPixmap) if (!kaaPixmapAllocArea (pPixmap)) return; - + + pKaaPixmap->dirty = FALSE; + if (pKaaScr->info->UploadToScreen) { if (pKaaScr->info->UploadToScreen(pPixmap, src, src_pitch)) @@ -301,6 +322,8 @@ kaaCreatePixmap(ScreenPtr pScreen, int w, int h, int depth) if (pKaaPixmap->score != KAA_PIXMAP_SCORE_PINNED && (pPixmap->devKind * h) >= MIN_OFFPIX_SIZE) kaaPixmapAllocArea (pPixmap); + pKaaPixmap->dirty = FALSE; + return pPixmap; } @@ -437,6 +460,7 @@ kaaFillSpans(DrawablePtr pDrawable, GCPtr pGC, int n, } } (*pKaaScr->info->DoneSolid) (); + kaaDrawableDirty (pDrawable); KdMarkSync(pDrawable->pScreen); } @@ -496,6 +520,7 @@ kaaCopyNtoN (DrawablePtr pSrcDrawable, pbox, nbox, dx, dy, reverse, upsidedown, bitplane, closure); } + kaaDrawableDirty (pDstDrawable); } static RegionPtr @@ -605,6 +630,7 @@ kaaPolyFillRect(DrawablePtr pDrawable, } } (*pKaaScr->info->DoneSolid) (); + kaaDrawableDirty (pDrawable); KdMarkSync(pDrawable->pScreen); } @@ -635,6 +661,7 @@ kaaSolidBoxClipped (DrawablePtr pDrawable, fbSolidBoxClipped (pDrawable, pClip, x1, y1, x2, y2, fbAnd (GXcopy, fg, pm), fbXor (GXcopy, fg, pm)); + kaaDrawableDirty (pDrawable); return; } for (nbox = REGION_NUM_RECTS(pClip), pbox = REGION_RECTS(pClip); @@ -667,6 +694,7 @@ kaaSolidBoxClipped (DrawablePtr pDrawable, partX2 + xoff, partY2 + yoff); } (*pKaaScr->info->DoneSolid) (); + kaaDrawableDirty (pDrawable); KdMarkSync(pDrawable->pScreen); } @@ -754,6 +782,7 @@ kaaImageGlyphBlt (DrawablePtr pDrawable, } KdCheckSync (pDrawable->pScreen); + kaaDrawableDirty (pDrawable); ppci = ppciInit; while (nglyph--) @@ -919,6 +948,7 @@ kaaFillRegionSolid (DrawablePtr pDrawable, fbFillRegionSolid (pDrawable, pRegion, 0, fbReplicatePixel (pixel, pDrawable->bitsPerPixel)); } + kaaDrawableDirty (pDrawable); } static void diff --git a/hw/kdrive/src/kaa.h b/hw/kdrive/src/kaa.h index b6ab4237a..c3766f174 100644 --- a/hw/kdrive/src/kaa.h +++ b/hw/kdrive/src/kaa.h @@ -43,6 +43,7 @@ typedef struct { int score; int devKind; DevUnion devPrivate; + Bool dirty; } KaaPixmapPrivRec, *KaaPixmapPrivPtr; extern int kaaScreenPrivateIndex; @@ -55,6 +56,9 @@ kaaPixmapUseScreen (PixmapPtr pPixmap); void kaaPixmapUseMemory (PixmapPtr pPixmap); +void +kaaDrawableDirty(DrawablePtr pDrawable); + Bool kaaDrawableIsOffscreen (DrawablePtr pDrawable); diff --git a/hw/kdrive/src/kaapict.c b/hw/kdrive/src/kaapict.c index 34647a91f..cccbcb7ce 100644 --- a/hw/kdrive/src/kaapict.c +++ b/hw/kdrive/src/kaapict.c @@ -296,6 +296,7 @@ kaaTryDriverSolidFill(PicturePtr pSrc, (*pKaaScr->info->DoneSolid) (); KdMarkSync(pDst->pDrawable->pScreen); + kaaDrawableDirty (pDst->pDrawable); REGION_UNINIT(pDst->pDrawable->pScreen, ®ion); return 1; @@ -382,6 +383,7 @@ kaaTryDriverBlend(CARD8 op, (*pKaaScr->info->DoneBlend) (); KdMarkSync(pDst->pDrawable->pScreen); + kaaDrawableDirty (pDst->pDrawable); REGION_UNINIT(pDst->pDrawable->pScreen, ®ion); return 1; @@ -503,6 +505,7 @@ kaaTryDriverComposite(CARD8 op, (*pKaaScr->info->DoneComposite) (); KdMarkSync(pDst->pDrawable->pScreen); + kaaDrawableDirty (pDst->pDrawable); REGION_UNINIT(pDst->pDrawable->pScreen, ®ion); return 1; diff --git a/hw/kdrive/src/kpict.c b/hw/kdrive/src/kpict.c index d1709b68e..dbb63f929 100644 --- a/hw/kdrive/src/kpict.c +++ b/hw/kdrive/src/kpict.c @@ -45,6 +45,7 @@ KdCheckComposite (CARD8 op, CARD16 height) { KdCheckSync (pDst->pDrawable->pScreen); + kaaDrawableDirty (pDst->pDrawable); fbComposite (op, pSrc, pMask, @@ -66,6 +67,7 @@ KdCheckRasterizeTrapezoid(PicturePtr pMask, int y_off) { KdCheckSync (pMask->pDrawable->pScreen); + kaaDrawableDirty (pMask->pDrawable); fbRasterizeTrapezoid (pMask, trap, x_off, y_off); }