freedreno/a6xx: Write multiple regs for SP_VS_OUT_REG and SP_VS_VPC_DST_REG
authorKristian H. Kristensen <hoegsberg@google.com>
Mon, 10 Jun 2019 19:04:21 +0000 (12:04 -0700)
committerKristian H. Kristensen <hoegsberg@google.com>
Wed, 18 Sep 2019 23:59:10 +0000 (16:59 -0700)
Compute the number of writes up front.

Signed-off-by: Kristian H. Kristensen <hoegsberg@google.com>
Reviewed-by: Eric Anholt <eric@anholt.net>
src/gallium/drivers/freedreno/a6xx/fd6_program.c

index 26be370833d7d89d5eaab4ce64a564a333be42db..3a1c0a411f9332e6aa535e97851587bb31a4552f 100644 (file)
@@ -352,11 +352,11 @@ setup_stateobj(struct fd_ringbuffer *ring, struct fd_screen *screen,
                setup_stream_out(state, vs, &l);
        }
 
-       for (i = 0, j = 0; (i < 16) && (j < l.cnt); i++) {
+       debug_assert(l.cnt < 32);
+       OUT_PKT4(ring, REG_A6XX_SP_VS_OUT_REG(0), DIV_ROUND_UP(l.cnt, 2));
+       for (j = 0; j < l.cnt; ) {
                uint32_t reg = 0;
 
-               OUT_PKT4(ring, REG_A6XX_SP_VS_OUT_REG(i), 1);
-
                reg |= A6XX_SP_VS_OUT_REG_A_REGID(l.var[j].regid);
                reg |= A6XX_SP_VS_OUT_REG_A_COMPMASK(l.var[j].compmask);
                j++;
@@ -368,11 +368,10 @@ setup_stateobj(struct fd_ringbuffer *ring, struct fd_screen *screen,
                OUT_RING(ring, reg);
        }
 
-       for (i = 0, j = 0; (i < 8) && (j < l.cnt); i++) {
+       OUT_PKT4(ring, REG_A6XX_SP_VS_VPC_DST_REG(0), DIV_ROUND_UP(l.cnt, 4));
+       for (j = 0; j < l.cnt; ) {
                uint32_t reg = 0;
 
-               OUT_PKT4(ring, REG_A6XX_SP_VS_VPC_DST_REG(i), 1);
-
                reg |= A6XX_SP_VS_VPC_DST_REG_OUTLOC0(l.var[j++].loc);
                reg |= A6XX_SP_VS_VPC_DST_REG_OUTLOC1(l.var[j++].loc);
                reg |= A6XX_SP_VS_VPC_DST_REG_OUTLOC2(l.var[j++].loc);