From 08bf26c28fc8147b64f2fe8345b9581e0101571c Mon Sep 17 00:00:00 2001 From: Michel Dänzer Date: Tue, 29 Dec 2009 12:51:28 +0100 Subject: EXA: Fix migration avoidance for 1x1 pixmaps. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Michel Dänzer Acked-by: Maarten Maathuis Signed-off-by: Keith Packard --- exa/exa_accel.c | 4 ++++ exa/exa_mixed.c | 18 +++++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/exa/exa_accel.c b/exa/exa_accel.c index c56c6bc9f..f34b7a78e 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 155ed47c5..b262fc707 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); -- cgit v1.2.3