Add a "dirty" flag to the pixmap private. Clear it when setting up an

offscreen pixmap area, and set it when any rendering occurs. When
    moving a pixmap out of offscreen, don't read data back if it wasn't
    dirtied (compared to the system memory copy).
This commit is contained in:
Eric Anholt 2004-07-03 09:16:30 +00:00
parent fd594b0559
commit 0207015669
4 changed files with 43 additions and 4 deletions

View File

@ -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

View File

@ -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);

View File

@ -296,6 +296,7 @@ kaaTryDriverSolidFill(PicturePtr pSrc,
(*pKaaScr->info->DoneSolid) ();
KdMarkSync(pDst->pDrawable->pScreen);
kaaDrawableDirty (pDst->pDrawable);
REGION_UNINIT(pDst->pDrawable->pScreen, &region);
return 1;
@ -382,6 +383,7 @@ kaaTryDriverBlend(CARD8 op,
(*pKaaScr->info->DoneBlend) ();
KdMarkSync(pDst->pDrawable->pScreen);
kaaDrawableDirty (pDst->pDrawable);
REGION_UNINIT(pDst->pDrawable->pScreen, &region);
return 1;
@ -503,6 +505,7 @@ kaaTryDriverComposite(CARD8 op,
(*pKaaScr->info->DoneComposite) ();
KdMarkSync(pDst->pDrawable->pScreen);
kaaDrawableDirty (pDst->pDrawable);
REGION_UNINIT(pDst->pDrawable->pScreen, &region);
return 1;

View File

@ -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);
}