Wrap AddTraps in exa and damage.

This fine (and unused) function wasn't ever wrapped which made it not work
under exa.
This commit is contained in:
Keith Packard 2008-04-04 12:11:14 -07:00
parent 436a549e73
commit 06e7e1d048
5 changed files with 80 additions and 0 deletions

View File

@ -700,6 +700,7 @@ exaCloseScreen(int i, ScreenPtr pScreen)
if (ps) {
ps->Composite = pExaScr->SavedComposite;
ps->Trapezoids = pExaScr->SavedTrapezoids;
ps->AddTraps = pExaScr->SavedAddTraps;
}
#endif
@ -863,6 +864,9 @@ exaDriverInit (ScreenPtr pScreen,
pExaScr->SavedTrapezoids = ps->Trapezoids;
ps->Trapezoids = exaTrapezoids;
pExaScr->SavedAddTraps = ps->AddTraps;
ps->AddTraps = ExaCheckAddTraps;
}
#endif

View File

@ -113,6 +113,7 @@ typedef struct {
TrianglesProcPtr SavedTriangles;
GlyphsProcPtr SavedGlyphs;
TrapezoidsProcPtr SavedTrapezoids;
AddTrapsProcPtr SavedAddTraps;
#endif
Bool swappedOut;
@ -291,6 +292,13 @@ ExaCheckGetSpans (DrawablePtr pDrawable,
int nspans,
char *pdstStart);
void
ExaCheckAddTraps (PicturePtr pPicture,
INT16 x_off,
INT16 y_off,
int ntrap,
xTrap *traps);
/* exa_accel.c */
static _X_INLINE Bool

View File

@ -350,6 +350,20 @@ ExaCheckComposite (CARD8 op,
REGION_UNINIT(pScreen, &region);
}
void
ExaCheckAddTraps (PicturePtr pPicture,
INT16 x_off,
INT16 y_off,
int ntrap,
xTrap *traps)
{
EXA_FALLBACK(("to pict %p (%c)\n",
exaDrawableLocation(pPicture->pDrawable)));
exaPrepareAccess(pPicture->pDrawable, EXA_PREPARE_DEST);
fbAddTraps (pPicture, x_off, y_off, ntrap, traps);
exaFinishAccess(pPicture->pDrawable, EXA_PREPARE_DEST);
}
/**
* Gets the 0,0 pixel of a pixmap. Used for doing solid fills of tiled pixmaps
* that happen to be 1x1. Pixmap must be at least 8bpp.

View File

@ -655,6 +655,58 @@ damageGlyphs (CARD8 op,
damageReportPostOp (pDst->pDrawable);
wrap (pScrPriv, ps, Glyphs, damageGlyphs);
}
static void
damageAddTraps (PicturePtr pPicture,
INT16 x_off,
INT16 y_off,
int ntrap,
xTrap *traps)
{
ScreenPtr pScreen = pPicture->pDrawable->pScreen;
PictureScreenPtr ps = GetPictureScreen(pScreen);
damageScrPriv(pScreen);
if (checkPictureDamage (pPicture))
{
BoxRec box;
int i;
int x, y;
xTrap *t = traps;
box.x1 = 32767;
box.y1 = 32767;
box.x2 = -32767;
box.y2 = -32767;
x = pPicture->pDrawable->x + x_off;
y = pPicture->pDrawable->y + y_off;
for (i = 0; i < ntrap; i++)
{
pixman_fixed_t l = min (t->top.l, t->bot.l);
pixman_fixed_t r = max (t->top.r, t->bot.r);
int x1 = x + pixman_fixed_to_int (l);
int x2 = x + pixman_fixed_to_int (pixman_fixed_ceil (r));
int y1 = y + pixman_fixed_to_int (t->top.y);
int y2 = y + pixman_fixed_to_int (pixman_fixed_ceil (t->bot.y));
if (x1 < box.x1)
box.x1 = x1;
if (x2 > box.x2)
box.x2 = x2;
if (y1 < box.y1)
box.y1 = y1;
if (y2 > box.y2)
box.y2 = y2;
}
TRIM_PICTURE_BOX (box, pPicture);
if (BOX_NOT_EMPTY(box))
damageDamageBox (pPicture->pDrawable, &box, pPicture->subWindowMode);
}
unwrap (pScrPriv, ps, AddTraps);
(*ps->AddTraps) (pPicture, x_off, y_off, ntrap, traps);
damageReportPostOp (pPicture->pDrawable);
wrap (pScrPriv, ps, AddTraps, damageAddTraps);
}
#endif
/**********************************************************/
@ -1767,6 +1819,7 @@ DamageSetup (ScreenPtr pScreen)
if (ps) {
wrap (pScrPriv, ps, Glyphs, damageGlyphs);
wrap (pScrPriv, ps, Composite, damageComposite);
wrap (pScrPriv, ps, AddTraps, damageAddTraps);
}
#endif

View File

@ -70,6 +70,7 @@ typedef struct _damageScrPriv {
#ifdef RENDER
CompositeProcPtr Composite;
GlyphsProcPtr Glyphs;
AddTrapsProcPtr AddTraps;
#endif
} DamageScrPrivRec, *DamageScrPrivPtr;