Mesa (master): freedreno/a3xx: emit all immediates in one shot

Rob Clark robclark at kemper.freedesktop.org
Fri Oct 3 01:07:08 UTC 2014


Module: Mesa
Branch: master
Commit: f5eeb8a6dc4d1a1a4b88843e1c8d6d3a9c50512a
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=f5eeb8a6dc4d1a1a4b88843e1c8d6d3a9c50512a

Author: Rob Clark <robclark at freedesktop.org>
Date:   Wed Oct  1 11:28:17 2014 -0400

freedreno/a3xx: emit all immediates in one shot

Makes the command stream a bit tighter when there are lots of
immediates.

Signed-off-by: Rob Clark <robclark at freedesktop.org>

---

 src/gallium/drivers/freedreno/a3xx/fd3_emit.c |   24 ++++++++++++++++--------
 1 file changed, 16 insertions(+), 8 deletions(-)

diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_emit.c b/src/gallium/drivers/freedreno/a3xx/fd3_emit.c
index 430339a..d92ebc2 100644
--- a/src/gallium/drivers/freedreno/a3xx/fd3_emit.c
+++ b/src/gallium/drivers/freedreno/a3xx/fd3_emit.c
@@ -92,14 +92,13 @@ emit_constants(struct fd_ringbuffer *ring,
 	uint32_t enabled_mask = constbuf->enabled_mask;
 	uint32_t first_immediate;
 	uint32_t base = 0;
-	unsigned i;
 
 	// XXX TODO only emit dirty consts.. but we need to keep track if
 	// they are clobbered by a clear, gmem2mem, or mem2gmem..
 	constbuf->dirty_mask = enabled_mask;
 
-	/* in particular, with binning shader and a unneeded consts no
-	 * longer referenced, we could end up w/ constlen that is smaller
+	/* in particular, with binning shader we may end up with unused
+	 * consts, ie. we could end up w/ constlen that is smaller
 	 * than first_immediate.  In that case truncate the user consts
 	 * early to avoid HLSQ lockup caused by writing too many consts
 	 */
@@ -137,12 +136,21 @@ emit_constants(struct fd_ringbuffer *ring,
 
 	/* emit shader immediates: */
 	if (shader) {
-		for (i = 0; i < shader->immediates_count; i++) {
-			base = 4 * (shader->first_immediate + i);
-			if (base >= (4 * shader->constlen))
-				break;
+		int size = shader->immediates_count;
+		base = shader->first_immediate;
+
+		/* truncate size to avoid writing constants that shader
+		 * does not use:
+		 */
+		size = MIN2(size + base, shader->constlen) - base;
+
+		/* convert out of vec4: */
+		base *= 4;
+		size *= 4;
+
+		if (size > 0) {
 			fd3_emit_constant(ring, sb, base,
-				0, 4, shader->immediates[i].val, NULL);
+				0, size, shader->immediates[0].val, NULL);
 		}
 	}
 }




More information about the mesa-commit mailing list