mirror of
https://gitlab.freedesktop.org/xorg/xserver.git
synced 2026-02-04 10:40:29 +01:00
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:
parent
4c926dbac6
commit
8767fc8d47
5 changed files with 80 additions and 0 deletions
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -353,6 +353,20 @@ ExaCheckComposite (CARD8 op,
|
|||
REGION_UNINIT(pScreen, ®ion);
|
||||
}
|
||||
|
||||
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.
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -73,6 +73,7 @@ typedef struct _damageScrPriv {
|
|||
#ifdef RENDER
|
||||
CompositeProcPtr Composite;
|
||||
GlyphsProcPtr Glyphs;
|
||||
AddTrapsProcPtr AddTraps;
|
||||
#endif
|
||||
} DamageScrPrivRec, *DamageScrPrivPtr;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue