Signed-off-by: Chris Wilson ch...@chris-wilson.co.uk
---
composite/compalloc.c | 3 +++
composite/compinit.c | 49 +++--
composite/compint.h| 4
composite/compwindow.c | 8
4 files changed, 46 insertions(+), 18 deletions(-)
diff --git a/composite/compalloc.c b/composite/compalloc.c
index 8daded0..c3973e9 100644
--- a/composite/compalloc.c
+++ b/composite/compalloc.c
@@ -75,6 +75,8 @@ compReportDamage(DamagePtr pDamage, RegionPtr pRegion, void
*closure)
CompScreenPtr cs = GetCompScreen(pScreen);
CompWindowPtr cw = GetCompWindow(pWin);
+compMarkDamaged(pScreen);
+
if (!cs-BlockHandler) {
cs-BlockHandler = pScreen-BlockHandler;
pScreen-BlockHandler = compBlockHandler;
@@ -86,6 +88,7 @@ compReportDamage(DamagePtr pDamage, RegionPtr pRegion, void
*closure)
while (pWin) {
if (pWin-damagedDescendants)
break;
+ cs-anyDamaged++;
pWin-damagedDescendants = TRUE;
pWin = pWin-parent;
}
diff --git a/composite/compinit.c b/composite/compinit.c
index 3ac075a..988bc58 100644
--- a/composite/compinit.c
+++ b/composite/compinit.c
@@ -77,9 +77,7 @@ compCloseScreen(ScreenPtr pScreen)
pScreen-CopyWindow = cs-CopyWindow;
pScreen-PositionWindow = cs-PositionWindow;
-pScreen-GetImage = cs-GetImage;
-pScreen-GetSpans = cs-GetSpans;
-pScreen-SourceValidate = cs-SourceValidate;
+assert(!cs-anyDamaged);
free(cs);
dixSetPrivate(pScreen-devPrivates, CompScreenPrivateKey, NULL);
@@ -147,8 +145,11 @@ compGetImage(DrawablePtr pDrawable,
if (pDrawable-type == DRAWABLE_WINDOW)
compPaintChildrenToWindow((WindowPtr) pDrawable);
(*pScreen-GetImage) (pDrawable, sx, sy, w, h, format, planemask,
pdstLine);
-cs-GetImage = pScreen-GetImage;
-pScreen-GetImage = compGetImage;
+
+if (cs-anyDamaged) {
+ cs-GetImage = pScreen-GetImage;
+ pScreen-GetImage = compGetImage;
+}
}
static void
@@ -162,8 +163,11 @@ compGetSpans(DrawablePtr pDrawable, int wMax, DDXPointPtr
ppt, int *pwidth,
if (pDrawable-type == DRAWABLE_WINDOW)
compPaintChildrenToWindow((WindowPtr) pDrawable);
(*pScreen-GetSpans) (pDrawable, wMax, ppt, pwidth, nspans, pdstStart);
-cs-GetSpans = pScreen-GetSpans;
-pScreen-GetSpans = compGetSpans;
+
+if (cs-anyDamaged) {
+ cs-GetSpans = pScreen-GetSpans;
+ pScreen-GetSpans = compGetSpans;
+}
}
static void
@@ -180,8 +184,26 @@ compSourceValidate(DrawablePtr pDrawable,
if (pScreen-SourceValidate)
(*pScreen-SourceValidate) (pDrawable, x, y, width, height,
subWindowMode);
-cs-SourceValidate = pScreen-SourceValidate;
-pScreen-SourceValidate = compSourceValidate;
+if (cs-anyDamaged) {
+ cs-SourceValidate = pScreen-SourceValidate;
+ pScreen-SourceValidate = compSourceValidate;
+}
+}
+
+void compMarkDamaged(ScreenPtr pScreen)
+{
+CompScreenPtr cs = GetCompScreen(pScreen);
+
+if (cs-anyDamaged == 0) {
+ cs-GetImage = pScreen-GetImage;
+ pScreen-GetImage = compGetImage;
+
+ cs-GetSpans = pScreen-GetSpans;
+ pScreen-GetSpans = compGetSpans;
+
+ cs-SourceValidate = pScreen-SourceValidate;
+ pScreen-SourceValidate = compSourceValidate;
+}
}
/*
@@ -445,15 +467,6 @@ compScreenInit(ScreenPtr pScreen)
cs-CloseScreen = pScreen-CloseScreen;
pScreen-CloseScreen = compCloseScreen;
-cs-GetImage = pScreen-GetImage;
-pScreen-GetImage = compGetImage;
-
-cs-GetSpans = pScreen-GetSpans;
-pScreen-GetSpans = compGetSpans;
-
-cs-SourceValidate = pScreen-SourceValidate;
-pScreen-SourceValidate = compSourceValidate;
-
dixSetPrivate(pScreen-devPrivates, CompScreenPrivateKey, cs);
RegisterRealChildHeadProc(CompositeRealChildHead);
diff --git a/composite/compint.h b/composite/compint.h
index 09241f2..e6b046d 100644
--- a/composite/compint.h
+++ b/composite/compint.h
@@ -167,6 +167,7 @@ typedef struct _CompScreen {
Window overlayWid;
CompOverlayClientPtr pOverlayClients;
+int anyDamaged;
GetImageProcPtr GetImage;
GetSpansProcPtr GetSpans;
SourceValidateProcPtr SourceValidate;
@@ -243,6 +244,9 @@ compReallocPixmap(WindowPtr pWin, int x, int y,
Bool
compScreenInit(ScreenPtr pScreen);
+void
+ compMarkDamaged(ScreenPtr pScreen);
+
/*
* compoverlay.c
*/
diff --git a/composite/compwindow.c b/composite/compwindow.c
index 6eacbae..81f2a93 100644
--- a/composite/compwindow.c
+++ b/composite/compwindow.c
@@ -732,6 +732,13 @@ compPaintWindowToParent(WindowPtr pWin)
}
}
+static void compClearDamaged(WindowPtr pWin)
+{
+ScreenPtr pScreen = pWin-drawable.pScreen;
+CompScreenPtr cs = GetCompScreen(pScreen);
+cs-anyDamaged--;
+}
+
void
compPaintChildrenToWindow(WindowPtr pWin)
{
@@ -743,6 +750,7 @@ compPaintChildrenToWindow(WindowPtr pWin)
for