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

Author: Rob Clark <[email protected]>
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 <[email protected]>

---

 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);
                }
        }
 }

_______________________________________________
mesa-commit mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to