From ce93c00a33a395986ffc0d33aae85d2c23aabc5d Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Thu, 5 Jan 2012 14:20:55 +0000 Subject: [PATCH] sna: Avoid operating inplace if we have pending CPU damage If the operation does not replace existing CPU damage, we are likely to want to reuse the pixmap again on the CPU, so avoid mixing CPU/GPU operations. Signed-off-by: Chris Wilson --- src/sna/sna_accel.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c index 9ecf3c69..396dd9c5 100644 --- a/src/sna/sna_accel.c +++ b/src/sna/sna_accel.c @@ -870,9 +870,29 @@ static inline bool region_inplace(struct sna *sna, if (wedged(sna)) return false; - if (priv->mapped) + if (priv->mapped) { + DBG(("%s: already mapped\n", __FUNCTION__)); return true; + } + if (priv->cpu_damage) { + const BoxRec *extents = ®ion->extents; + const BoxRec *damage = &priv->cpu_damage->extents; + if (extents->x2 < damage->x2 || extents->x1 > damage->x1 || + extents->y2 < damage->y2 || extents->y1 > damage->y1) { + DBG(("%s: uncovered CPU damage pending\n", __FUNCTION__)); + return false; + } + } + + DBG(("%s: (%dx%d), inplace? %d\n", + __FUNCTION__, + region->extents.x2 - region->extents.x1, + region->extents.y2 - region->extents.y1, + ((region->extents.x2 - region->extents.x1) * + (region->extents.y2 - region->extents.y1) * + pixmap->drawable.bitsPerPixel >> 12) + >= sna->kgem.half_cpu_cache_pages)); return ((region->extents.x2 - region->extents.x1) * (region->extents.y2 - region->extents.y1) * pixmap->drawable.bitsPerPixel >> 12)