Skip to content

Commit e409fb3

Browse files
eraskeith-packard
authored andcommitted
damage: use DamageReportDamage for the initial borderClip damage report
Instead of using DamageDamageRegion for reporting the first (virtual) damage in ProcDamageCreate that covers the borderClip of the drawable window, use a function DamageReportDamage directly (previously called damageReportDamage). This avoids sending all other damage listeners a full window update when a new damage object is created. As this patch makes DamageReportDamage a public interface, the function has been moved into the part of the file that contains all the other public functions. The function has not been otherwise modified. Signed-off-by: Erkki Seppälä <[email protected]> Reviewed-by: Keith Packard <[email protected]> Signed-off-by: Keith Packard <[email protected]>
1 parent 274dca8 commit e409fb3

File tree

3 files changed

+56
-51
lines changed

3 files changed

+56
-51
lines changed

damageext/damageext.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ ProcDamageCreate (ClientPtr client)
223223
if (pDrawable->type == DRAWABLE_WINDOW)
224224
{
225225
pRegion = &((WindowPtr) pDrawable)->borderClip;
226-
DamageDamageRegion(pDrawable, pRegion);
226+
DamageReportDamage(pDamageExt->pDamage, pRegion);
227227
}
228228

229229
return Success;

miext/damage/damage.c

+51-50
Original file line numberDiff line numberDiff line change
@@ -120,54 +120,6 @@ getDrawableDamageRef (DrawablePtr pDrawable)
120120
DamagePtr *pPrev = (DamagePtr *) \
121121
dixLookupPrivateAddr(&(pWindow)->devPrivates, damageWinPrivateKey)
122122

123-
static void
124-
damageReportDamage (DamagePtr pDamage, RegionPtr pDamageRegion)
125-
{
126-
BoxRec tmpBox;
127-
RegionRec tmpRegion;
128-
Bool was_empty;
129-
130-
switch (pDamage->damageLevel) {
131-
case DamageReportRawRegion:
132-
RegionUnion(&pDamage->damage, &pDamage->damage,
133-
pDamageRegion);
134-
(*pDamage->damageReport) (pDamage, pDamageRegion, pDamage->closure);
135-
break;
136-
case DamageReportDeltaRegion:
137-
RegionNull(&tmpRegion);
138-
RegionSubtract(&tmpRegion, pDamageRegion, &pDamage->damage);
139-
if (RegionNotEmpty(&tmpRegion)) {
140-
RegionUnion(&pDamage->damage, &pDamage->damage,
141-
pDamageRegion);
142-
(*pDamage->damageReport) (pDamage, &tmpRegion, pDamage->closure);
143-
}
144-
RegionUninit(&tmpRegion);
145-
break;
146-
case DamageReportBoundingBox:
147-
tmpBox = *RegionExtents(&pDamage->damage);
148-
RegionUnion(&pDamage->damage, &pDamage->damage,
149-
pDamageRegion);
150-
if (!BOX_SAME (&tmpBox, RegionExtents(&pDamage->damage))) {
151-
(*pDamage->damageReport) (pDamage, &pDamage->damage,
152-
pDamage->closure);
153-
}
154-
break;
155-
case DamageReportNonEmpty:
156-
was_empty = !RegionNotEmpty(&pDamage->damage);
157-
RegionUnion(&pDamage->damage, &pDamage->damage,
158-
pDamageRegion);
159-
if (was_empty && RegionNotEmpty(&pDamage->damage)) {
160-
(*pDamage->damageReport) (pDamage, &pDamage->damage,
161-
pDamage->closure);
162-
}
163-
break;
164-
case DamageReportNone:
165-
RegionUnion(&pDamage->damage, &pDamage->damage,
166-
pDamageRegion);
167-
break;
168-
}
169-
}
170-
171123
static void
172124
damageReportDamagePostRendering (DamagePtr pDamage, RegionPtr pOldDamage, RegionPtr pDamageRegion)
173125
{
@@ -360,7 +312,7 @@ damageRegionAppend (DrawablePtr pDrawable, RegionPtr pRegion, Bool clip,
360312
/* Report damage now, if desired. */
361313
if (!pDamage->reportAfter) {
362314
if (pDamage->damageReport)
363-
damageReportDamage (pDamage, pDamageRegion);
315+
DamageReportDamage (pDamage, pDamageRegion);
364316
else
365317
RegionUnion(&pDamage->damage,
366318
&pDamage->damage, pDamageRegion);
@@ -393,7 +345,7 @@ damageRegionProcessPending (DrawablePtr pDrawable)
393345
if (pDamage->reportAfter) {
394346
/* It's possible that there is only interest in postRendering reporting. */
395347
if (pDamage->damageReport)
396-
damageReportDamage (pDamage, &pDamage->pendingDamage);
348+
DamageReportDamage (pDamage, &pDamage->pendingDamage);
397349
else
398350
RegionUnion(&pDamage->damage, &pDamage->damage,
399351
&pDamage->pendingDamage);
@@ -2125,3 +2077,52 @@ DamageGetScreenFuncs (ScreenPtr pScreen)
21252077
damageScrPriv(pScreen);
21262078
return &pScrPriv->funcs;
21272079
}
2080+
2081+
void
2082+
DamageReportDamage (DamagePtr pDamage, RegionPtr pDamageRegion)
2083+
{
2084+
BoxRec tmpBox;
2085+
RegionRec tmpRegion;
2086+
Bool was_empty;
2087+
2088+
switch (pDamage->damageLevel) {
2089+
case DamageReportRawRegion:
2090+
RegionUnion(&pDamage->damage, &pDamage->damage,
2091+
pDamageRegion);
2092+
(*pDamage->damageReport) (pDamage, pDamageRegion, pDamage->closure);
2093+
break;
2094+
case DamageReportDeltaRegion:
2095+
RegionNull(&tmpRegion);
2096+
RegionSubtract(&tmpRegion, pDamageRegion, &pDamage->damage);
2097+
if (RegionNotEmpty(&tmpRegion)) {
2098+
RegionUnion(&pDamage->damage, &pDamage->damage,
2099+
pDamageRegion);
2100+
(*pDamage->damageReport) (pDamage, &tmpRegion, pDamage->closure);
2101+
}
2102+
RegionUninit(&tmpRegion);
2103+
break;
2104+
case DamageReportBoundingBox:
2105+
tmpBox = *RegionExtents(&pDamage->damage);
2106+
RegionUnion(&pDamage->damage, &pDamage->damage,
2107+
pDamageRegion);
2108+
if (!BOX_SAME (&tmpBox, RegionExtents(&pDamage->damage))) {
2109+
(*pDamage->damageReport) (pDamage, &pDamage->damage,
2110+
pDamage->closure);
2111+
}
2112+
break;
2113+
case DamageReportNonEmpty:
2114+
was_empty = !RegionNotEmpty(&pDamage->damage);
2115+
RegionUnion(&pDamage->damage, &pDamage->damage,
2116+
pDamageRegion);
2117+
if (was_empty && RegionNotEmpty(&pDamage->damage)) {
2118+
(*pDamage->damageReport) (pDamage, &pDamage->damage,
2119+
pDamage->closure);
2120+
}
2121+
break;
2122+
case DamageReportNone:
2123+
RegionUnion(&pDamage->damage, &pDamage->damage,
2124+
pDamageRegion);
2125+
break;
2126+
}
2127+
}
2128+

miext/damage/damage.h

+4
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,10 @@ DamageRegionProcessPending (DrawablePtr pDrawable);
110110
extern _X_EXPORT void
111111
DamageRegionRendered (DrawablePtr pDrawable, DamagePtr pDamage, RegionPtr pOldDamage, RegionPtr pRegion);
112112

113+
/* Call this when you create a new Damage and you wish to send an initial damage message (to it). */
114+
extern _X_EXPORT void
115+
DamageReportDamage (DamagePtr pDamage, RegionPtr pDamageRegion);
116+
113117
/* Avoid using this call, it only exists for API compatibility. */
114118
extern _X_EXPORT void
115119
DamageDamageRegion (DrawablePtr pDrawable,

0 commit comments

Comments
 (0)