[PATCH] EXA: ModifyPixmapHeader_mixed fixes.
Michel Dänzer
michel at daenzer.net
Fri Dec 4 10:29:56 PST 2009
From: Michel Dänzer <daenzer at vmware.com>
* 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 <daenzer at vmware.com>
---
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
More information about the xorg-devel
mailing list