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

* Better detection of dimension changes.
* Make sure to re-create the system memory copy when the pixmap dimensions
  change (e.g. the screen pixmap on screen resize).
* Clear the valid regions.

Signed-off-by: Michel Dänzer <[email protected]>
---
 exa/exa_mixed.c |   45 ++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 42 insertions(+), 3 deletions(-)

diff --git a/exa/exa_mixed.c b/exa/exa_mixed.c
index 7dc426f..e707a61 100644
--- a/exa/exa_mixed.c
+++ b/exa/exa_mixed.c
@@ -135,14 +135,51 @@ exaModifyPixmapHeader_mixed(PixmapPtr pPixmap, int width, 
int height, int depth,
        pExaPixmap->score = EXA_PIXMAP_SCORE_PINNED;
     }
 
-    if (pExaPixmap->driverPriv) {
-        if (width > 0 && height > 0 && bitsPerPixel > 0) {
+    if (width <= 0)
+       width = pPixmap->drawable.width;
+
+    if (height <= 0)
+       height = pPixmap->drawable.height;
+
+    if (bitsPerPixel <= 0) {
+       if (depth <= 0)
+           bitsPerPixel = pPixmap->drawable.bitsPerPixel;
+       else
+           bitsPerPixel = BitsPerPixel(depth);
+    }
+
+    if (depth <= 0)
+       depth = pPixmap->drawable.depth;
+
+    if (width != pPixmap->drawable.width ||
+       height != pPixmap->drawable.height ||
+       depth != pPixmap->drawable.depth ||
+       bitsPerPixel != pPixmap->drawable.bitsPerPixel) {
+       if (pExaPixmap->driverPriv) {
             exaSetFbPitch(pExaScr, pExaPixmap,
                           width, height, bitsPerPixel);
 
             exaSetAccelBlock(pExaScr, pExaPixmap,
                              width, height, bitsPerPixel);
         }
+
+       /* Need to re-create system copy if there's also a GPU copy */
+       if (pExaPixmap->pDamage && pExaPixmap->sys_ptr) {
+           free(pExaPixmap->sys_ptr);
+           pExaPixmap->sys_ptr = NULL;
+           DamageUnregister(&pPixmap->drawable, pExaPixmap->pDamage);
+           DamageDestroy(pExaPixmap->pDamage);
+           pExaPixmap->pDamage = NULL;
+           REGION_EMPTY(pScreen, &pExaPixmap->validSys);
+
+           swap(pExaScr, pScreen, ModifyPixmapHeader);
+           pScreen->ModifyPixmapHeader(pPixmap, width, height, depth,
+                                       bitsPerPixel, devKind, pPixData);
+           swap(pExaScr, pScreen, ModifyPixmapHeader);
+
+           pExaPixmap->sys_ptr = pPixmap->devPrivate.ptr;
+           pExaPixmap->sys_pitch = pPixmap->devKind;
+       }
     }
 
     has_gpu_copy = exaPixmapHasGpuCopy(pPixmap);
@@ -158,8 +195,10 @@ exaModifyPixmapHeader_mixed(PixmapPtr pPixmap, int width, 
int height, int depth,
     if (pExaScr->info->ModifyPixmapHeader && pExaPixmap->driverPriv) {
        ret = pExaScr->info->ModifyPixmapHeader(pPixmap, width, height, depth,
                                                bitsPerPixel, devKind, 
pPixData);
-       if (ret == TRUE)
+       if (ret == TRUE) {
+           REGION_EMPTY(pScreen, &pExaPixmap->validFB);
            goto out;
+       }
     }
 
     swap(pExaScr, pScreen, ModifyPixmapHeader);
-- 
1.6.4.3

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

Reply via email to