diff options
author | Michel Dänzer <michel.daenzer@amd.com> | 2012-10-29 12:57:54 +0100 |
---|---|---|
committer | Julien Cristau <jcristau@debian.org> | 2012-11-05 20:35:56 +0100 |
commit | bea94ca24d95e5b60c219e84f9e68f92cded840c (patch) | |
tree | 2ba2257acc9e014632ad4132b3842bad44050850 | |
parent | e06dc7f1ea912efee42b07dfa9c3b0f819d7c507 (diff) |
EXA: Track source/mask pixmaps more explicitly for Composite fallback regions.server-1.12-branch
In particular, make sure pExaScr->src/maskPix are cleared when the
corresponding pictures aren't associated with drawables, i.e. solid or gradient
pictures. Without this, we would in some cases associate the source/mask region
with unrelated pixmaps from previous Composite fallbacks, resulting in random
corruption.
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=47266
Signed-off-by: Michel Dänzer <michel.daenzer@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Keith Packard <keithp@keithp.com>
(cherry picked from commit 1ca096d5e07221025c4c4110528772b7d94f15ee)
-rw-r--r-- | exa/exa_priv.h | 1 | ||||
-rw-r--r-- | exa/exa_unaccel.c | 16 |
2 files changed, 13 insertions, 4 deletions
diff --git a/exa/exa_priv.h b/exa/exa_priv.h index bde78c3a0..daaf2a4d9 100644 --- a/exa/exa_priv.h +++ b/exa/exa_priv.h @@ -207,6 +207,7 @@ typedef struct { RegionRec srcReg; RegionRec maskReg; PixmapPtr srcPix; + PixmapPtr maskPix; } ExaScreenPrivRec, *ExaScreenPrivPtr; diff --git a/exa/exa_unaccel.c b/exa/exa_unaccel.c index 571613886..b0a0011cb 100644 --- a/exa/exa_unaccel.c +++ b/exa/exa_unaccel.c @@ -442,6 +442,13 @@ ExaSrcValidate(DrawablePtr pDrawable, RegionPtr dst; int xoff, yoff; + if (pExaScr->srcPix == pPix) + dst = &pExaScr->srcReg; + else if (pExaScr->maskPix == pPix) + dst = &pExaScr->maskReg; + else + return; + exaGetDrawableDeltas(pDrawable, pPix, &xoff, &yoff); box.x1 = x + xoff; @@ -449,8 +456,6 @@ ExaSrcValidate(DrawablePtr pDrawable, box.x2 = box.x1 + width; box.y2 = box.y1 + height; - dst = (pExaScr->srcPix == pPix) ? &pExaScr->srcReg : &pExaScr->maskReg; - RegionInit(®, &box, 1); RegionUnion(dst, dst, ®); RegionUninit(®); @@ -495,16 +500,19 @@ ExaPrepareCompositeReg(ScreenPtr pScreen, if (pSrc != pDst) RegionTranslate(pSrc->pCompositeClip, -pSrc->pDrawable->x, -pSrc->pDrawable->y); - } + } else + pExaScr->srcPix = NULL; if (pMask && pMask->pDrawable) { pMaskPix = exaGetDrawablePixmap(pMask->pDrawable); RegionNull(&pExaScr->maskReg); maskReg = &pExaScr->maskReg; + pExaScr->maskPix = pMaskPix; if (pMask != pDst && pMask != pSrc) RegionTranslate(pMask->pCompositeClip, -pMask->pDrawable->x, -pMask->pDrawable->y); - } + } else + pExaScr->maskPix = NULL; RegionTranslate(pDst->pCompositeClip, -pDst->pDrawable->x, -pDst->pDrawable->y); |