[PATCH] damage: Only track extents where possible

Chris Wilson chris at chris-wilson.co.uk
Wed Feb 25 10:01:05 PST 2015


For external Damage, we need only track sufficient information to
satisfy the DamageReportLevel. That is if the Client only wishes to hear
that the Damage is now non-empty or if the extents change, we only need
to track the extents of the Damage and can discard the actual
rectangles. This speeds up the union operation, speeding up damage
processing for Client as well - with a noticeable increase in
performance of gnome-shell (which uses DamageReportBoundingBox) for
example.

Internal users of Damage have access to the DamageRegion irrespective of
the DamageReportLevel and so we need to keep the full region intact for
them.

Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
Cc: Adam Jackson <ajax at redhat.com>
---
 miext/damage/damage.c | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/miext/damage/damage.c b/miext/damage/damage.c
index b99cfb0..450a517 100644
--- a/miext/damage/damage.c
+++ b/miext/damage/damage.c
@@ -1906,6 +1906,16 @@ DamageGetScreenFuncs(ScreenPtr pScreen)
     return &pScrPriv->funcs;
 }
 
+static void DamageCombineExtents(DamagePtr pDamage, RegionPtr pDamageRegion)
+{
+    if (!pDamage->isInternal) {
+        RegionUninit(pDamageRegion);
+        RegionUnion(&pDamage->damage, &pDamage->damage, pDamageRegion);
+        RegionUninit(&pDamage->damage);
+    } else
+        RegionUnion(&pDamage->damage, &pDamage->damage, pDamageRegion);
+}
+
 void
 DamageReportDamage(DamagePtr pDamage, RegionPtr pDamageRegion)
 {
@@ -1929,7 +1939,7 @@ DamageReportDamage(DamagePtr pDamage, RegionPtr pDamageRegion)
         break;
     case DamageReportBoundingBox:
         tmpBox = *RegionExtents(&pDamage->damage);
-        RegionUnion(&pDamage->damage, &pDamage->damage, pDamageRegion);
+        DamageCombineExtents(pDamage, pDamageRegion);
         if (!BOX_SAME(&tmpBox, RegionExtents(&pDamage->damage))) {
             (*pDamage->damageReport) (pDamage, &pDamage->damage,
                                       pDamage->closure);
@@ -1937,7 +1947,7 @@ DamageReportDamage(DamagePtr pDamage, RegionPtr pDamageRegion)
         break;
     case DamageReportNonEmpty:
         was_empty = !RegionNotEmpty(&pDamage->damage);
-        RegionUnion(&pDamage->damage, &pDamage->damage, pDamageRegion);
+        DamageCombineExtents(pDamage, pDamageRegion);
         if (was_empty && RegionNotEmpty(&pDamage->damage)) {
             (*pDamage->damageReport) (pDamage, &pDamage->damage,
                                       pDamage->closure);
-- 
2.1.4



More information about the xorg-devel mailing list