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

Signed-off-by: Michel Dänzer <[email protected]>
---
 exa/exa_accel.c |    4 ++++
 exa/exa_mixed.c |   18 +++++++++++++++++-
 2 files changed, 21 insertions(+), 1 deletions(-)

diff --git a/exa/exa_accel.c b/exa/exa_accel.c
index 0f6e5f7..eea799e 100644
--- a/exa/exa_accel.c
+++ b/exa/exa_accel.c
@@ -1043,6 +1043,7 @@ exaFillRegionSolid (DrawablePtr   pDrawable, RegionPtr 
pRegion, Pixel pixel,
            pDrawable->width == 1 && pDrawable->height == 1 &&
            pDrawable->bitsPerPixel != 24) {
            ExaPixmapPriv(pPixmap);
+           RegionPtr pending_damage = DamagePendingRegion(pExaPixmap->pDamage);
 
            switch (pDrawable->bitsPerPixel) {
            case 32:
@@ -1057,6 +1058,9 @@ exaFillRegionSolid (DrawablePtr   pDrawable, RegionPtr 
pRegion, Pixel pixel,
 
            REGION_UNION(pScreen, &pExaPixmap->validSys, &pExaPixmap->validSys,
                         pRegion);
+           REGION_UNION(pScreen, &pExaPixmap->validFB, &pExaPixmap->validFB,
+                        pRegion);
+           REGION_SUBTRACT(pScreen, pending_damage, pending_damage, pRegion);
        }
 
        ret = TRUE;
diff --git a/exa/exa_mixed.c b/exa/exa_mixed.c
index 155ed47..b262fc7 100644
--- a/exa/exa_mixed.c
+++ b/exa/exa_mixed.c
@@ -94,9 +94,25 @@ exaCreatePixmap_mixed(ScreenPtr pScreen, int w, int h, int 
depth,
     if (!w || !h) {
        exaCreateDriverPixmap_mixed(pPixmap);
        pExaPixmap->use_gpu_copy = exaPixmapHasGpuCopy(pPixmap);
-    } else
+    } else {
        pExaPixmap->use_gpu_copy = FALSE;
 
+       if (w == 1 && h == 1) {
+           pExaPixmap->sys_ptr = malloc((pPixmap->drawable.bitsPerPixel + 7) / 
8);
+
+           /* Set up damage tracking */
+           pExaPixmap->pDamage = DamageCreate(NULL, NULL,
+                                              DamageReportNonEmpty, TRUE,
+                                              pPixmap->drawable.pScreen,
+                                              pPixmap);
+
+           DamageRegister(&pPixmap->drawable, pExaPixmap->pDamage);
+           /* This ensures that pending damage reflects the current operation. 
*/
+           /* This is used by exa to optimize migration. */
+           DamageSetReportAfterOp(pExaPixmap->pDamage, TRUE);
+       }
+    }
+
     /* During a fallback we must prepare access. */
     if (pExaScr->fallback_counter)
        exaPrepareAccess(&pPixmap->drawable, EXA_PREPARE_AUX_DEST);
-- 
1.6.5.7

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

Reply via email to