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 (pChild = pWin->lastChild; pChild; pChild = pChild->prevSib) compPaintWindowToParent(pChild); + compClearDamaged(pWin); pWin->damagedDescendants = FALSE; } -- 2.1.4 _______________________________________________ xorg-devel@lists.x.org: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel