summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers
diff options
context:
space:
mode:
authorEric Anholt <[email protected]>2015-11-16 20:45:46 -0800
committerEric Anholt <[email protected]>2015-11-17 17:45:23 -0800
commitdffe7260cd5f9c70df4b817c26a4268ddad2475c (patch)
treea147f69c6abc718629efcfb254531c1282ac5f97 /src/gallium/drivers
parentd18d1ba5877c234a2cf4e3e834df27f03c7b6a11 (diff)
vc4: Fix uniform reordering to support reading the same uniform twice.
This does actually happen in the wild (particularly fabs of a uniform), so we'd like to support it.
Diffstat (limited to 'src/gallium/drivers')
-rw-r--r--src/gallium/drivers/vc4/vc4_reorder_uniforms.c26
1 files changed, 18 insertions, 8 deletions
diff --git a/src/gallium/drivers/vc4/vc4_reorder_uniforms.c b/src/gallium/drivers/vc4/vc4_reorder_uniforms.c
index 7f11fba2340..85a0c95e851 100644
--- a/src/gallium/drivers/vc4/vc4_reorder_uniforms.c
+++ b/src/gallium/drivers/vc4/vc4_reorder_uniforms.c
@@ -44,18 +44,28 @@ qir_reorder_uniforms(struct vc4_compile *c)
uint32_t next_uniform = 0;
list_for_each_entry(struct qinst, inst, &c->instructions, link) {
+ uint32_t new = ~0;
+
for (int i = 0; i < qir_get_op_nsrc(inst->op); i++) {
if (inst->src[i].file != QFILE_UNIF)
continue;
- uint32_t new = next_uniform++;
- if (uniform_index_size <= new) {
- uniform_index_size =
- MAX2(uniform_index_size * 2, 16);
- uniform_index =
- realloc(uniform_index,
- uniform_index_size *
- sizeof(uint32_t));
+ if (new == ~0) {
+ new = next_uniform++;
+ if (uniform_index_size <= new) {
+ uniform_index_size =
+ MAX2(uniform_index_size * 2, 16);
+ uniform_index =
+ realloc(uniform_index,
+ uniform_index_size *
+ sizeof(uint32_t));
+ }
+ } else {
+ /* If we've got two uniform references in this
+ * instruction, they need to be the same
+ * uniform value.
+ */
+ assert(inst->src[i].index == uniform_index[new]);
}
uniform_index[new] = inst->src[i].index;