Wrap AddTraps in exa and damage.

This fine (and unused) function wasn't ever wrapped which made it not work
under exa.

(cherry picked from commit 06e7e1d048)
This commit is contained in:
Keith Packard 2008-04-04 12:11:14 -07:00 committed by Adam Jackson
parent 4c926dbac6
commit 8767fc8d47
5 changed files with 80 additions and 0 deletions

View File

@ -757,6 +757,7 @@ exaCloseScreen(int i, ScreenPtr pScreen)
ps->Glyphs = pExaScr->SavedGlyphs;
ps->Trapezoids = pExaScr->SavedTrapezoids;
ps->Triangles = pExaScr->SavedTriangles;
ps->AddTraps = pExaScr->SavedAddTraps;
}
#endif
@ -928,6 +929,9 @@ exaDriverInit (ScreenPtr pScreen,
pExaScr->SavedTrapezoids = ps->Trapezoids;
ps->Trapezoids = exaTrapezoids;
pExaScr->SavedAddTraps = ps->AddTraps;
ps->AddTraps = ExaCheckAddTraps;
}
#endif

View File

@ -147,6 +147,7 @@ typedef struct {
TrianglesProcPtr SavedTriangles;
GlyphsProcPtr SavedGlyphs;
TrapezoidsProcPtr SavedTrapezoids;
AddTrapsProcPtr SavedAddTraps;
#endif
Bool swappedOut;
@ -331,6 +332,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

@ -353,6 +353,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

@ -722,6 +722,58 @@ damageGlyphs (CARD8 op,
damageRegionProcessPending (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
/**********************************************************/
@ -1838,6 +1890,7 @@ DamageSetup (ScreenPtr pScreen)
if (ps) {
wrap (pScrPriv, ps, Glyphs, damageGlyphs);
wrap (pScrPriv, ps, Composite, damageComposite);
wrap (pScrPriv, ps, AddTraps, damageAddTraps);
}
#endif

View File

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