From f5eeb8a6dc4d1a1a4b88843e1c8d6d3a9c50512a Mon Sep 17 00:00:00 2001 From: Rob Clark Date: Wed, 1 Oct 2014 11:28:17 -0400 Subject: [PATCH] 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 --- 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 430339ae47d..d92ebc2f0ad 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); } } } -- 2.30.2