From: Michel Dänzer <[email protected]>

Fixes http://bugs.freedesktop.org/show_bug.cgi?id=18950 .

Signed-off-by: Michel Dänzer <[email protected]>
---
 exa/exa_accel.c   |   35 +++++++++++++++++------------------
 exa/exa_priv.h    |   10 ++++++----
 exa/exa_render.c  |    2 +-
 exa/exa_unaccel.c |    2 +-
 4 files changed, 25 insertions(+), 24 deletions(-)

diff --git a/exa/exa_accel.c b/exa/exa_accel.c
index d284ff5..39f3437 100644
--- a/exa/exa_accel.c
+++ b/exa/exa_accel.c
@@ -406,7 +406,8 @@ exaHWCopyNtoN (DrawablePtr    pSrcDrawable,
        xfree(rects);
 
        if (!pGC || !exaGCReadsDestination(pDstDrawable, pGC->planemask,
-                                          pGC->fillStyle, pGC->alu)) {
+                                          pGC->fillStyle, pGC->alu,
+                                          pGC->clientClipType)) {
            dstregion = REGION_CREATE(pScreen, NullBox, 0);
            REGION_COPY(pScreen, dstregion, srcregion);
            REGION_TRANSLATE(pScreen, dstregion, dst_off_x - dx - src_off_x,
@@ -734,7 +735,8 @@ exaPolySegment (DrawablePtr pDrawable, GCPtr pGC, int nseg,
 }
 
 static Bool exaFillRegionSolid (DrawablePtr pDrawable, RegionPtr pRegion,
-                               Pixel pixel, CARD32 planemask, CARD32 alu);
+                               Pixel pixel, CARD32 planemask, CARD32 alu,
+                               unsigned int clientClipType);
 
 static void
 exaPolyFillRect(DrawablePtr pDrawable,
@@ -787,10 +789,11 @@ exaPolyFillRect(DrawablePtr pDrawable,
        if (((pGC->fillStyle == FillSolid || pGC->tileIsPixel) &&
             exaFillRegionSolid(pDrawable, pReg, pGC->fillStyle == FillSolid ?
                                pGC->fgPixel : pGC->tile.pixel, pGC->planemask,
-                               pGC->alu)) ||
+                               pGC->alu, pGC->clientClipType)) ||
            (pGC->fillStyle == FillTiled && !pGC->tileIsPixel &&
             exaFillRegionTiled(pDrawable, pReg, pGC->tile.pixmap, &pGC->patOrg,
-                               pGC->planemask, pGC->alu))) {
+                               pGC->planemask, pGC->alu,
+                               pGC->clientClipType))) {
            goto out;
        }
     }
@@ -952,11 +955,8 @@ exaCopyWindow(WindowPtr pWin, DDXPointRec ptOldOrg, 
RegionPtr prgnSrc)
 }
 
 static Bool
-exaFillRegionSolid (DrawablePtr        pDrawable,
-                   RegionPtr   pRegion,
-                   Pixel       pixel,
-                   CARD32      planemask,
-                   CARD32      alu)
+exaFillRegionSolid (DrawablePtr        pDrawable, RegionPtr pRegion, Pixel 
pixel,
+                   CARD32 planemask, CARD32 alu, unsigned int clientClipType)
 {
     ExaScreenPriv(pDrawable->pScreen);
     PixmapPtr pPixmap = exaGetDrawablePixmap (pDrawable);
@@ -969,7 +969,8 @@ exaFillRegionSolid (DrawablePtr     pDrawable,
     pixmaps[0].as_src = FALSE;
     pixmaps[0].pPix = pPixmap;
     pixmaps[0].pReg = exaGCReadsDestination(pDrawable, planemask, FillSolid,
-                                           alu) ? NULL : pRegion;
+                                           alu, clientClipType)
+       ? NULL : pRegion;
 
     exaGetDrawableDeltas(pDrawable, pPixmap, &xoff, &yoff);
     REGION_TRANSLATE(pScreen, pRegion, xoff, yoff);
@@ -1032,12 +1033,9 @@ out:
  * Based on fbFillRegionTiled(), fbTile().
  */
 Bool
-exaFillRegionTiled (DrawablePtr        pDrawable,
-                   RegionPtr   pRegion,
-                   PixmapPtr   pTile,
-                   DDXPointPtr pPatOrg,
-                   CARD32      planemask,
-                   CARD32      alu)
+exaFillRegionTiled (DrawablePtr pDrawable, RegionPtr pRegion, PixmapPtr pTile,
+                   DDXPointPtr pPatOrg, CARD32 planemask, CARD32 alu,
+                   unsigned int clientClipType)
 {
     ExaScreenPriv(pDrawable->pScreen);
     PixmapPtr pPixmap;
@@ -1060,13 +1058,14 @@ exaFillRegionTiled (DrawablePtr pDrawable,
     if (tileWidth == 1 && tileHeight == 1)
        return exaFillRegionSolid(pDrawable, pRegion,
                                  exaGetPixmapFirstPixel (pTile), planemask,
-                                 alu);
+                                 alu, clientClipType);
 
     pixmaps[0].as_dst = TRUE;
     pixmaps[0].as_src = FALSE;
     pixmaps[0].pPix = pPixmap = exaGetDrawablePixmap (pDrawable);
     pixmaps[0].pReg = exaGCReadsDestination(pDrawable, planemask, FillTiled,
-                                           alu) ? NULL : pRegion;
+                                           alu, clientClipType)
+       ? NULL : pRegion;
     pixmaps[1].as_dst = FALSE;
     pixmaps[1].as_src = TRUE;
     pixmaps[1].pPix = pTile;
diff --git a/exa/exa_priv.h b/exa/exa_priv.h
index 9efbbc9..874e7e9 100644
--- a/exa/exa_priv.h
+++ b/exa/exa_priv.h
@@ -415,11 +415,12 @@ ExaCheckAddTraps (PicturePtr      pPicture,
 
 static _X_INLINE Bool
 exaGCReadsDestination(DrawablePtr pDrawable, unsigned long planemask,
-                     unsigned int fillStyle, unsigned char alu)
+                     unsigned int fillStyle, unsigned char alu,
+                     unsigned int clientClipType)
 {
-    return ((alu != GXcopy && alu != GXclear &&alu != GXset &&
+    return ((alu != GXcopy && alu != GXclear && alu != GXset &&
             alu != GXcopyInverted) || fillStyle == FillStippled ||
-           !EXA_PM_IS_SOLID(pDrawable, planemask));
+           clientClipType != CT_NONE || !EXA_PM_IS_SOLID(pDrawable, 
planemask));
 }
 
 void
@@ -427,7 +428,8 @@ exaCopyWindow(WindowPtr pWin, DDXPointRec ptOldOrg, 
RegionPtr prgnSrc);
 
 Bool
 exaFillRegionTiled (DrawablePtr        pDrawable, RegionPtr pRegion, PixmapPtr 
pTile,
-                   DDXPointPtr pPatOrg, CARD32 planemask, CARD32 alu);
+                   DDXPointPtr pPatOrg, CARD32 planemask, CARD32 alu,
+                   unsigned int clientClipType);
 
 void
 exaGetImage (DrawablePtr pDrawable, int x, int y, int w, int h,
diff --git a/exa/exa_render.c b/exa/exa_render.c
index a934497..14d710b 100644
--- a/exa/exa_render.c
+++ b/exa/exa_render.c
@@ -945,7 +945,7 @@ exaComposite(CARD8  op,
 
                ret = exaFillRegionTiled(pDst->pDrawable, &region,
                                         (PixmapPtr)pSrc->pDrawable,
-                                        &patOrg, FB_ALLONES, GXcopy);
+                                        &patOrg, FB_ALLONES, GXcopy, CT_NONE);
 
                REGION_UNINIT(pDst->pDrawable->pScreen, &region);
 
diff --git a/exa/exa_unaccel.c b/exa/exa_unaccel.c
index 4279c87..0d53b67 100644
--- a/exa/exa_unaccel.c
+++ b/exa/exa_unaccel.c
@@ -106,7 +106,7 @@ ExaCheckPutImage (DrawablePtr pDrawable, GCPtr pGC, int 
depth,
     EXA_GC_PROLOGUE(pGC);
     EXA_FALLBACK(("to %p (%c)\n", pDrawable, exaDrawableLocation(pDrawable)));
     if (exaGCReadsDestination(pDrawable, pGC->planemask, pGC->fillStyle,
-                             pGC->alu))
+                             pGC->alu, pGC->clientClipType))
        exaPrepareAccess (pDrawable, EXA_PREPARE_DEST);
     else
        exaPrepareAccessReg (pDrawable, EXA_PREPARE_DEST, pExaPixmap->pDamage ?
-- 
1.6.3

_______________________________________________
xorg-devel mailing list
[email protected]
http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to