summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Jackson <ajax@redhat.com>2016-04-05 15:53:02 -0400
committerAdam Jackson <ajax@redhat.com>2016-04-07 11:02:55 -0400
commit7d3ad6904fbde155a04a5803550c28f00a724911 (patch)
tree8fa0061ce686381b2af12024db0b15d6e543b85c
parent980fd34f4767e0c73b73b4bad092e972499a84d8 (diff)
damage: Make damageRegionProcessPending take a damage not a drawableperformance
In the case where there's no damage monitor on the drawable, we look that fact up twice: once before rendering to decide whether to compute damage, and again after to decide whether to append it. The layer below us is effectively not allowed to change whether there's a damage monitor for the drawable, but there's no way the compiler can know that. Instead, look it up once up front, and change the check macros and damageRegionProcessPending to refer to it. Signed-off-by: Adam Jackson <ajax@redhat.com>
-rw-r--r--miext/damage/damage.c87
1 files changed, 44 insertions, 43 deletions
diff --git a/miext/damage/damage.c b/miext/damage/damage.c
index 746e7984f..77cc97c4b 100644
--- a/miext/damage/damage.c
+++ b/miext/damage/damage.c
@@ -282,10 +282,8 @@ damageRegionAppend(DrawablePtr pDrawable, RegionPtr pRegion, Bool clip,
}
static void
-damageRegionProcessPending(DrawablePtr pDrawable)
+damageRegionProcessPending(DamagePtr pDamage)
{
- drawableDamage(pDrawable);
-
for (; pDamage != NULL; pDamage = pDamage->pNext) {
if (pDamage->reportAfter) {
/* It's possible that there is only interest in postRendering reporting. */
@@ -360,6 +358,7 @@ damageCreateGC(GCPtr pGC)
#define DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable) \
damageGCPriv(pGC); \
+ drawableDamage(pDrawable); \
const GCFuncs *oldFuncs = pGC->funcs; \
unwrap(pGCPriv, pGC, funcs); \
unwrap(pGCPriv, pGC, ops); \
@@ -457,7 +456,7 @@ damageDestroyClip(GCPtr pGC)
#define BOX_NOT_EMPTY(box) \
(((box.x2 - box.x1) > 0) && ((box.y2 - box.y1) > 0))
-#define checkGCDamage(d,g) (getDrawableDamage(d) && \
+#define checkGCDamage(d,g) (pDamage && \
(!g->pCompositeClip ||\
RegionNotEmpty(g->pCompositeClip)))
@@ -469,8 +468,7 @@ damageDestroyClip(GCPtr pGC)
if(box.y2 > extents->y2) box.y2 = extents->y2; \
}
-#define checkPictureDamage(p) (getDrawableDamage(p->pDrawable) && \
- RegionNotEmpty(p->pCompositeClip))
+#define checkPictureDamage(p) (pDamage && RegionNotEmpty(p->pCompositeClip))
static void
damageComposite(CARD8 op,
@@ -487,6 +485,7 @@ damageComposite(CARD8 op,
PictureScreenPtr ps = GetPictureScreen(pScreen);
damageScrPriv(pScreen);
+ drawableDamage(pDst->pDrawable);
if (checkPictureDamage(pDst)) {
BoxRec box;
@@ -505,7 +504,7 @@ damageComposite(CARD8 op,
pMask,
pDst,
xSrc, ySrc, xMask, yMask, xDst, yDst, width, height);
- damageRegionProcessPending(pDst->pDrawable);
+ damageRegionProcessPending(pDamage);
wrap(pScrPriv, ps, Composite, damageComposite);
}
@@ -521,6 +520,7 @@ damageGlyphs(CARD8 op,
PictureScreenPtr ps = GetPictureScreen(pScreen);
damageScrPriv(pScreen);
+ drawableDamage(pDst->pDrawable);
if (checkPictureDamage(pDst)) {
int nlistTmp = nlist;
@@ -567,7 +567,7 @@ damageGlyphs(CARD8 op,
}
unwrap(pScrPriv, ps, Glyphs);
(*ps->Glyphs) (op, pSrc, pDst, maskFormat, xSrc, ySrc, nlist, list, glyphs);
- damageRegionProcessPending(pDst->pDrawable);
+ damageRegionProcessPending(pDamage);
wrap(pScrPriv, ps, Glyphs, damageGlyphs);
}
@@ -579,6 +579,7 @@ damageAddTraps(PicturePtr pPicture,
PictureScreenPtr ps = GetPictureScreen(pScreen);
damageScrPriv(pScreen);
+ drawableDamage(pPicture->pDrawable);
if (checkPictureDamage(pPicture)) {
BoxRec box;
@@ -615,7 +616,7 @@ damageAddTraps(PicturePtr pPicture,
}
unwrap(pScrPriv, ps, AddTraps);
(*ps->AddTraps) (pPicture, x_off, y_off, ntrap, traps);
- damageRegionProcessPending(pPicture->pDrawable);
+ damageRegionProcessPending(pDamage);
wrap(pScrPriv, ps, AddTraps, damageAddTraps);
}
@@ -663,7 +664,7 @@ damageFillSpans(DrawablePtr pDrawable,
(*pGC->ops->FillSpans) (pDrawable, pGC, npt, ppt, pwidth, fSorted);
- damageRegionProcessPending(pDrawable);
+ damageRegionProcessPending(pDamage);
DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
}
@@ -709,7 +710,7 @@ damageSetSpans(DrawablePtr pDrawable,
damageDamageBox(pDrawable, &box, pGC->subWindowMode);
}
(*pGC->ops->SetSpans) (pDrawable, pGC, pcharsrc, ppt, pwidth, npt, fSorted);
- damageRegionProcessPending(pDrawable);
+ damageRegionProcessPending(pDamage);
DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
}
@@ -735,7 +736,7 @@ damagePutImage(DrawablePtr pDrawable,
}
(*pGC->ops->PutImage) (pDrawable, pGC, depth, x, y, w, h,
leftPad, format, pImage);
- damageRegionProcessPending(pDrawable);
+ damageRegionProcessPending(pDamage);
DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
}
@@ -764,7 +765,7 @@ damageCopyArea(DrawablePtr pSrc,
ret = (*pGC->ops->CopyArea) (pSrc, pDst,
pGC, srcx, srcy, width, height, dstx, dsty);
- damageRegionProcessPending(pDst);
+ damageRegionProcessPending(pDamage);
DAMAGE_GC_OP_EPILOGUE(pGC, pDst);
return ret;
}
@@ -798,7 +799,7 @@ damageCopyPlane(DrawablePtr pSrc,
ret = (*pGC->ops->CopyPlane) (pSrc, pDst,
pGC, srcx, srcy, width, height, dstx, dsty,
bitPlane);
- damageRegionProcessPending(pDst);
+ damageRegionProcessPending(pDamage);
DAMAGE_GC_OP_EPILOGUE(pGC, pDst);
return ret;
}
@@ -839,7 +840,7 @@ damagePolyPoint(DrawablePtr pDrawable,
damageDamageBox(pDrawable, &box, pGC->subWindowMode);
}
(*pGC->ops->PolyPoint) (pDrawable, pGC, mode, npt, ppt);
- damageRegionProcessPending(pDrawable);
+ damageRegionProcessPending(pDamage);
DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
}
@@ -912,7 +913,7 @@ damagePolylines(DrawablePtr pDrawable,
damageDamageBox(pDrawable, &box, pGC->subWindowMode);
}
(*pGC->ops->Polylines) (pDrawable, pGC, mode, npt, ppt);
- damageRegionProcessPending(pDrawable);
+ damageRegionProcessPending(pDamage);
DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
}
@@ -991,7 +992,7 @@ damagePolySegment(DrawablePtr pDrawable, GCPtr pGC, int nSeg, xSegment * pSeg)
damageDamageBox(pDrawable, &box, pGC->subWindowMode);
}
(*pGC->ops->PolySegment) (pDrawable, pGC, nSeg, pSeg);
- damageRegionProcessPending(pDrawable);
+ damageRegionProcessPending(pDamage);
DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
}
@@ -1050,7 +1051,7 @@ damagePolyRectangle(DrawablePtr pDrawable,
}
}
(*pGC->ops->PolyRectangle) (pDrawable, pGC, nRects, pRects);
- damageRegionProcessPending(pDrawable);
+ damageRegionProcessPending(pDamage);
DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
}
@@ -1097,7 +1098,7 @@ damagePolyArc(DrawablePtr pDrawable, GCPtr pGC, int nArcs, xArc * pArcs)
damageDamageBox(pDrawable, &box, pGC->subWindowMode);
}
(*pGC->ops->PolyArc) (pDrawable, pGC, nArcs, pArcs);
- damageRegionProcessPending(pDrawable);
+ damageRegionProcessPending(pDamage);
DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
}
@@ -1156,7 +1157,7 @@ damageFillPolygon(DrawablePtr pDrawable,
}
(*pGC->ops->FillPolygon) (pDrawable, pGC, shape, mode, npt, ppt);
- damageRegionProcessPending(pDrawable);
+ damageRegionProcessPending(pDamage);
DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
}
@@ -1192,7 +1193,7 @@ damagePolyFillRect(DrawablePtr pDrawable,
damageDamageBox(pDrawable, &box, pGC->subWindowMode);
}
(*pGC->ops->PolyFillRect) (pDrawable, pGC, nRects, pRects);
- damageRegionProcessPending(pDrawable);
+ damageRegionProcessPending(pDamage);
DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
}
@@ -1228,7 +1229,7 @@ damagePolyFillArc(DrawablePtr pDrawable, GCPtr pGC, int nArcs, xArc * pArcs)
damageDamageBox(pDrawable, &box, pGC->subWindowMode);
}
(*pGC->ops->PolyFillArc) (pDrawable, pGC, nArcs, pArcs);
- damageRegionProcessPending(pDrawable);
+ damageRegionProcessPending(pDamage);
DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
}
@@ -1277,12 +1278,9 @@ damageDamageChars(DrawablePtr pDrawable,
#define TT_IMAGE16 3
static void
-damageText(DrawablePtr pDrawable,
- GCPtr pGC,
- int x,
- int y,
- unsigned long count,
- char *chars, FontEncoding fontEncoding, Bool textType)
+damageText(DrawablePtr pDrawable, GCPtr pGC, int x, int y, unsigned long count,
+ char *chars, FontEncoding fontEncoding, DamagePtr pDamage,
+ Bool textType)
{
CharInfoPtr *charinfo;
unsigned long i;
@@ -1291,7 +1289,7 @@ damageText(DrawablePtr pDrawable,
imageblt = (textType == TT_IMAGE8) || (textType == TT_IMAGE16);
- if (!checkGCDamage(pDrawable, pGC))
+ if (!pDamage)
return;
charinfo = xallocarray(count, sizeof(CharInfoPtr));
@@ -1316,9 +1314,9 @@ damagePolyText8(DrawablePtr pDrawable,
{
DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
damageText(pDrawable, pGC, x, y, (unsigned long) count, chars, Linear8Bit,
- TT_POLY8);
+ pDamage, TT_POLY8);
x = (*pGC->ops->PolyText8) (pDrawable, pGC, x, y, count, chars);
- damageRegionProcessPending(pDrawable);
+ damageRegionProcessPending(pDamage);
DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
return x;
}
@@ -1330,9 +1328,9 @@ damagePolyText16(DrawablePtr pDrawable,
DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
damageText(pDrawable, pGC, x, y, (unsigned long) count, (char *) chars,
FONTLASTROW(pGC->font) == 0 ? Linear16Bit : TwoD16Bit,
- TT_POLY16);
+ pDamage, TT_POLY16);
x = (*pGC->ops->PolyText16) (pDrawable, pGC, x, y, count, chars);
- damageRegionProcessPending(pDrawable);
+ damageRegionProcessPending(pDamage);
DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
return x;
}
@@ -1343,9 +1341,9 @@ damageImageText8(DrawablePtr pDrawable,
{
DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
damageText(pDrawable, pGC, x, y, (unsigned long) count, chars, Linear8Bit,
- TT_IMAGE8);
+ pDamage, TT_IMAGE8);
(*pGC->ops->ImageText8) (pDrawable, pGC, x, y, count, chars);
- damageRegionProcessPending(pDrawable);
+ damageRegionProcessPending(pDamage);
DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
}
@@ -1356,9 +1354,9 @@ damageImageText16(DrawablePtr pDrawable,
DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
damageText(pDrawable, pGC, x, y, (unsigned long) count, (char *) chars,
FONTLASTROW(pGC->font) == 0 ? Linear16Bit : TwoD16Bit,
- TT_IMAGE16);
+ pDamage, TT_IMAGE16);
(*pGC->ops->ImageText16) (pDrawable, pGC, x, y, count, chars);
- damageRegionProcessPending(pDrawable);
+ damageRegionProcessPending(pDamage);
DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
}
@@ -1373,7 +1371,7 @@ damageImageGlyphBlt(DrawablePtr pDrawable,
damageDamageChars(pDrawable, pGC->font, x + pDrawable->x, y + pDrawable->y,
nglyph, ppci, TRUE, pGC->subWindowMode);
(*pGC->ops->ImageGlyphBlt) (pDrawable, pGC, x, y, nglyph, ppci, pglyphBase);
- damageRegionProcessPending(pDrawable);
+ damageRegionProcessPending(pDamage);
DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
}
@@ -1388,7 +1386,7 @@ damagePolyGlyphBlt(DrawablePtr pDrawable,
damageDamageChars(pDrawable, pGC->font, x + pDrawable->x, y + pDrawable->y,
nglyph, ppci, FALSE, pGC->subWindowMode);
(*pGC->ops->PolyGlyphBlt) (pDrawable, pGC, x, y, nglyph, ppci, pglyphBase);
- damageRegionProcessPending(pDrawable);
+ damageRegionProcessPending(pDamage);
DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
}
@@ -1417,7 +1415,7 @@ damagePushPixels(GCPtr pGC,
damageDamageBox(pDrawable, &box, pGC->subWindowMode);
}
(*pGC->ops->PushPixels) (pGC, pBitMap, pDrawable, dx, dy, xOrg, yOrg);
- damageRegionProcessPending(pDrawable);
+ damageRegionProcessPending(pDamage);
DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
}
@@ -1482,6 +1480,7 @@ damageCopyWindow(WindowPtr pWindow, DDXPointRec ptOldOrg, RegionPtr prgnSrc)
ScreenPtr pScreen = pWindow->drawable.pScreen;
damageScrPriv(pScreen);
+ drawableDamage(&pWindow->drawable);
if (getWindowDamage(pWindow)) {
int dx = pWindow->drawable.x - ptOldOrg.x;
@@ -1497,7 +1496,7 @@ damageCopyWindow(WindowPtr pWindow, DDXPointRec ptOldOrg, RegionPtr prgnSrc)
}
unwrap(pScrPriv, pScreen, CopyWindow);
(*pScreen->CopyWindow) (pWindow, ptOldOrg, prgnSrc);
- damageRegionProcessPending(&pWindow->drawable);
+ damageRegionProcessPending(pDamage);
wrap(pScrPriv, pScreen, CopyWindow, damageCopyWindow);
}
@@ -1871,20 +1870,22 @@ DamageRegionAppend(DrawablePtr pDrawable, RegionPtr pRegion)
void
DamageRegionProcessPending(DrawablePtr pDrawable)
{
- damageRegionProcessPending(pDrawable);
+ drawableDamage(pDrawable);
+ damageRegionProcessPending(pDamage);
}
/* This call is very odd, i'm leaving it intact for API sake, but please don't use it. */
void
DamageDamageRegion(DrawablePtr pDrawable, RegionPtr pRegion)
{
+ drawableDamage(pDrawable);
damageRegionAppend(pDrawable, pRegion, FALSE, -1);
/* Go back and report this damage for DamagePtrs with reportAfter set, since
* this call isn't part of an in-progress drawing op in the call chain and
* the DDX probably just wants to know about it right away.
*/
- damageRegionProcessPending(pDrawable);
+ damageRegionProcessPending(pDamage);
}
void