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
