freedreno/a6xx: make sure binning pass constlen is large enough
authorRob Clark <robdclark@chromium.org>
Thu, 16 May 2019 18:34:13 +0000 (11:34 -0700)
committerRob Clark <robdclark@chromium.org>
Mon, 20 May 2019 16:10:12 +0000 (09:10 -0700)
Since we use same constant state for both binning pass program state and
draw pass state, and it is possible for binning pass shader to use fewer
consts, we need to make sure we program a large enough constlen.

Signed-off-by: Rob Clark <robdclark@chromium.org>
src/gallium/drivers/freedreno/a6xx/fd6_program.c

index 9888e51f86e73f1ca1548c142c70d19ed22fc6dc..3603d800f04445b079e896793449f4aa7cd05dbf 100644 (file)
@@ -285,6 +285,19 @@ setup_stages(struct fd6_program_state *state, struct stage *s, bool binning_pass
                        s[i].instrlen = 0;
                }
        }
+
+       /* since we share the constant state w/ VS we need to make sure
+        * constlen is sufficiently large for full VS, even if the binning
+        * pass shader doesn't use them all
+        */
+       if (binning_pass) {
+               s[VS].constlen = MAX2(s[VS].constlen, align(state->bs->constlen, 4));
+       } else {
+               /* It should be impossible for VS to have smaller constlen than BS
+                * since BS is just a subset of VS.
+                */
+               debug_assert(s[VS].constlen >= state->bs->constlen);
+       }
 }
 
 static inline uint32_t