xf86-video-intel: 3 commits - src/sna/gen4_render.c src/sna/gen5_render.c src/sna/gen6_render.c src/sna/gen7_render.c src/sna/kgem.c src/sna/kgem.h src/sna/sna_gradient.c src/sna/sna_render.h

Chris Wilson ickle at kemper.freedesktop.org
Sat Dec 29 08:16:57 PST 2012


 src/sna/gen4_render.c  |    8 ++++
 src/sna/gen5_render.c  |    8 ++++
 src/sna/gen6_render.c  |    8 ++++
 src/sna/gen7_render.c  |    8 ++++
 src/sna/kgem.c         |   19 ++++++-----
 src/sna/kgem.h         |    9 +++--
 src/sna/sna_gradient.c |   80 ++++++++++++++++++++++++++++++++++++-------------
 src/sna/sna_render.h   |    2 -
 8 files changed, 110 insertions(+), 32 deletions(-)

New commits:
commit 1c2ece369177ea6c3fd2f254b2554ceadf5590de
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sat Dec 29 15:53:23 2012 +0000

    sna/gen4+: Try using the BLT before doing a tiled copy
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c
index 84d7853..3486e08 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -2478,6 +2478,14 @@ fallback_tiled_dst:
 	if (tmp.redirect.real_bo)
 		kgem_bo_destroy(&sna->kgem, tmp.dst.bo);
 fallback_tiled:
+	if (sna_blt_compare_depth(&src->drawable, &dst->drawable) &&
+	    sna_blt_copy_boxes(sna, alu,
+			       src_bo, src_dx, src_dy,
+			       dst_bo, dst_dx, dst_dy,
+			       dst->drawable.bitsPerPixel,
+			       box, n))
+		return true;
+
 	return sna_tiling_copy_boxes(sna, alu,
 				     src, src_bo, src_dx, src_dy,
 				     dst, dst_bo, dst_dx, dst_dy,
diff --git a/src/sna/gen5_render.c b/src/sna/gen5_render.c
index 34cfd0e..5b48537 100644
--- a/src/sna/gen5_render.c
+++ b/src/sna/gen5_render.c
@@ -2443,6 +2443,14 @@ fallback_tiled_dst:
 	if (tmp.redirect.real_bo)
 		kgem_bo_destroy(&sna->kgem, tmp.dst.bo);
 fallback_tiled:
+	if (sna_blt_compare_depth(&src->drawable, &dst->drawable) &&
+	    sna_blt_copy_boxes(sna, alu,
+			       src_bo, src_dx, src_dy,
+			       dst_bo, dst_dx, dst_dy,
+			       dst->drawable.bitsPerPixel,
+			       box, n))
+		return true;
+
 	return sna_tiling_copy_boxes(sna, alu,
 				     src, src_bo, src_dx, src_dy,
 				     dst, dst_bo, dst_dx, dst_dy,
diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c
index 0c55a2d..dd8f0dc 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -2897,6 +2897,14 @@ fallback_tiled_dst:
 	if (tmp.redirect.real_bo)
 		kgem_bo_destroy(&sna->kgem, tmp.dst.bo);
 fallback_tiled:
+	if (sna_blt_compare_depth(&src->drawable, &dst->drawable) &&
+	    sna_blt_copy_boxes(sna, alu,
+			       src_bo, src_dx, src_dy,
+			       dst_bo, dst_dx, dst_dy,
+			       dst->drawable.bitsPerPixel,
+			       box, n))
+		return true;
+
 	return sna_tiling_copy_boxes(sna, alu,
 				     src, src_bo, src_dx, src_dy,
 				     dst, dst_bo, dst_dx, dst_dy,
diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c
index d1ab2e3..edab5db 100644
--- a/src/sna/gen7_render.c
+++ b/src/sna/gen7_render.c
@@ -2990,6 +2990,14 @@ fallback_tiled_dst:
 	if (tmp.redirect.real_bo)
 		kgem_bo_destroy(&sna->kgem, tmp.dst.bo);
 fallback_tiled:
+	if (sna_blt_compare_depth(&src->drawable, &dst->drawable) &&
+	    sna_blt_copy_boxes(sna, alu,
+			       src_bo, src_dx, src_dy,
+			       dst_bo, dst_dx, dst_dy,
+			       dst->drawable.bitsPerPixel,
+			       box, n))
+		return true;
+
 	return sna_tiling_copy_boxes(sna, alu,
 				     src, src_bo, src_dx, src_dy,
 				     dst, dst_bo, dst_dx, dst_dy,
commit 09ca8feb3455c979e799ddf26daae8f2de2813e1
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sat Dec 29 15:42:02 2012 +0000

    sna: Move the primary color cache into the alpha cache
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_gradient.c b/src/sna/sna_gradient.c
index 5f06fbc..c437b27 100644
--- a/src/sna/sna_gradient.c
+++ b/src/sna/sna_gradient.c
@@ -260,11 +260,8 @@ sna_render_finish_solid(struct sna *sna, bool force)
 		old = NULL;
 	}
 
-	cache->bo[0] = kgem_create_proxy(&sna->kgem, cache->cache_bo,
-					 0, sizeof(uint32_t));
-	cache->bo[0]->pitch = 4;
 	if (force)
-		cache->size = 1;
+		cache->size = 0;
 
 	if (old)
 		kgem_bo_destroy(&sna->kgem, old);
@@ -283,7 +280,38 @@ sna_render_get_solid(struct sna *sna, uint32_t color)
 
 	if (color == 0xffffffff) {
 		DBG(("%s(white)\n", __FUNCTION__));
-		return kgem_bo_reference(cache->bo[0]);
+		return kgem_bo_reference(sna->render.alpha_cache.bo[255+7]);
+	}
+
+	if ((color >> 24) == 0xff) {
+		int v = 0;
+
+		if (((color >> 16) & 0xff) == 0)
+			v |= 0;
+		else if (((color >> 16) & 0xff) == 0xff)
+			v |= 1 << 2;
+		else
+			v = -1;
+
+		if (((color >> 8) & 0xff) == 0)
+			v |= 0;
+		else if (((color >> 8) & 0xff) == 0xff)
+			v |= 1 << 1;
+		else
+			v = -1;
+
+		if (((color >> 0) & 0xff) == 0)
+			v |= 0;
+		else if (((color >> 0) & 0xff) == 0xff)
+			v |= 1 << 0;
+		else
+			v = -1;
+
+		if (v >= 0) {
+			DBG(("%s(primary (%d,%d,%d): %d)\n",
+			     __FUNCTION__, v & 4, v & 2, v & 1, v));
+			return kgem_bo_reference(sna->render.alpha_cache.bo[255+v]);
+		}
 	}
 
 	if (cache->color[cache->last] == color) {
@@ -292,7 +320,7 @@ sna_render_get_solid(struct sna *sna, uint32_t color)
 		return kgem_bo_reference(cache->bo[cache->last]);
 	}
 
-	for (i = 1; i < cache->size; i++) {
+	for (i = 0; i < cache->size; i++) {
 		if (cache->color[i] == color) {
 			if (cache->bo[i] == NULL) {
 				DBG(("sna_render_get_solid(%d) = %x (recreate)\n",
@@ -326,7 +354,7 @@ done:
 static bool sna_alpha_cache_init(struct sna *sna)
 {
 	struct sna_alpha_cache *cache = &sna->render.alpha_cache;
-	uint32_t color[256];
+	uint32_t color[256 + 7];
 	int i;
 
 	DBG(("%s\n", __FUNCTION__));
@@ -346,6 +374,28 @@ static bool sna_alpha_cache_init(struct sna *sna)
 
 		cache->bo[i]->pitch = 4;
 	}
+
+	/* primary */
+	for (i = 1; i < 8; i++) {
+		int j = 255+i;
+
+		color[j] = 0xff << 24;
+		if (i & 1)
+			color[j] |= 0xff << 0;
+		if (i & 2)
+			color[j] |= 0xff << 8;
+		if (i & 4)
+			color[j] |= 0xff << 16;
+		cache->bo[j] = kgem_create_proxy(&sna->kgem,
+						 cache->cache_bo,
+						 sizeof(uint32_t)*j,
+						 sizeof(uint32_t));
+		if (cache->bo[j] == NULL)
+			return false;
+
+		cache->bo[j]->pitch = 4;
+	}
+
 	return kgem_bo_write(&sna->kgem, cache->cache_bo, color, sizeof(color));
 }
 
@@ -360,19 +410,9 @@ static bool sna_solid_cache_init(struct sna *sna)
 	if (!cache->cache_bo)
 		return false;
 
-	/*
-	 * Initialise [0] with white since it is very common and filling the
-	 * zeroth slot simplifies some of the checks.
-	 */
-	cache->color[0] = 0xffffffff;
-	cache->bo[0] = kgem_create_proxy(&sna->kgem, cache->cache_bo,
-					 0, sizeof(uint32_t));
-	if (cache->bo[0] == NULL)
-		return false;
-
-	cache->bo[0]->pitch = 4;
-	cache->dirty = 1;
-	cache->size = 1;
+	cache->color[0] = 0;
+	cache->dirty = 0;
+	cache->size = 0;
 	cache->last = 0;
 
 	return true;
diff --git a/src/sna/sna_render.h b/src/sna/sna_render.h
index d116e40..2f44479 100644
--- a/src/sna/sna_render.h
+++ b/src/sna/sna_render.h
@@ -254,7 +254,7 @@ struct sna_render {
 
 	struct sna_alpha_cache {
 		struct kgem_bo *cache_bo;
-		struct kgem_bo *bo[256];
+		struct kgem_bo *bo[256+7];
 	} alpha_cache;
 
 	struct sna_solid_cache {
commit 8c56c9b1da9e078bd5b7ff4ebc5d8b23f593d500
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sat Dec 29 14:14:41 2012 +0000

    sna: Allow a flush to occur before batching a flush-bo
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 1e8d656..21d5d1c 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -3929,19 +3929,19 @@ bool kgem_check_bo(struct kgem *kgem, ...)
 	struct kgem_bo *bo;
 	int num_exec = 0;
 	int num_pages = 0;
+	bool flush = false;
 
 	va_start(ap, kgem);
 	while ((bo = va_arg(ap, struct kgem_bo *))) {
+		while (bo->proxy)
+			bo = bo->proxy;
 		if (bo->exec)
 			continue;
 
-		while (bo->proxy) {
-			bo = bo->proxy;
-			if (bo->exec)
-				continue;
-		}
 		num_pages += num_pages(bo);
 		num_exec++;
+
+		flush |= bo->flush;
 	}
 	va_end(ap);
 
@@ -3951,7 +3951,7 @@ bool kgem_check_bo(struct kgem *kgem, ...)
 	if (!num_pages)
 		return true;
 
-	if (kgem_flush(kgem))
+	if (kgem_flush(kgem, flush))
 		return false;
 
 	if (kgem->aperture > kgem->aperture_low &&
@@ -4002,7 +4002,7 @@ bool kgem_check_bo_fenced(struct kgem *kgem, struct kgem_bo *bo)
 		return true;
 	}
 
-	if (kgem_flush(kgem))
+	if (kgem_flush(kgem, bo->flush))
 		return false;
 
 	if (kgem->nexec >= KGEM_EXEC_SIZE(kgem) - 1)
@@ -4040,6 +4040,7 @@ bool kgem_check_many_bo_fenced(struct kgem *kgem, ...)
 	int num_exec = 0;
 	int num_pages = 0;
 	int fenced_size = 0;
+	bool flush = false;
 
 	va_start(ap, kgem);
 	while ((bo = va_arg(ap, struct kgem_bo *))) {
@@ -4063,6 +4064,8 @@ bool kgem_check_many_bo_fenced(struct kgem *kgem, ...)
 			fenced_size += kgem_bo_fenced_size(kgem, bo);
 			num_fence++;
 		}
+
+		flush |= bo->flush;
 	}
 	va_end(ap);
 
@@ -4079,7 +4082,7 @@ bool kgem_check_many_bo_fenced(struct kgem *kgem, ...)
 	}
 
 	if (num_pages) {
-		if (kgem_flush(kgem))
+		if (kgem_flush(kgem, flush))
 			return false;
 
 		if (kgem->aperture > kgem->aperture_low &&
diff --git a/src/sna/kgem.h b/src/sna/kgem.h
index cc4ef6a..bf45793 100644
--- a/src/sna/kgem.h
+++ b/src/sna/kgem.h
@@ -302,9 +302,12 @@ static inline void kgem_submit(struct kgem *kgem)
 		_kgem_submit(kgem);
 }
 
-static inline bool kgem_flush(struct kgem *kgem)
+static inline bool kgem_flush(struct kgem *kgem, bool flush)
 {
-	return kgem->flush && kgem_ring_is_idle(kgem, kgem->ring);
+	if (kgem->nexec == 0)
+		return false;
+
+	return (kgem->flush ^ flush) && kgem_ring_is_idle(kgem, kgem->ring);
 }
 
 static inline void kgem_bo_submit(struct kgem *kgem, struct kgem_bo *bo)
@@ -571,7 +574,7 @@ static inline bool __kgem_bo_is_busy(struct kgem *kgem, struct kgem_bo *bo)
 	DBG(("%s: handle=%d, domain: %d exec? %d, rq? %d\n", __FUNCTION__,
 	     bo->handle, bo->domain, bo->exec != NULL, bo->rq != NULL));
 	assert(bo->refcnt);
-	if (kgem_flush(kgem))
+	if (kgem_flush(kgem, bo->flush))
 		kgem_submit(kgem);
 	if (bo->rq && !bo->exec)
 		kgem_retire(kgem);


More information about the xorg-commit mailing list