summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorEric Anholt <[email protected]>2016-05-03 11:30:32 -0700
committerEric Anholt <[email protected]>2016-07-12 17:42:42 -0700
commit93794145dd5959d905b65234cf87de3bff801aeb (patch)
treef4fa653535d0d524775c55f57154e796ac515c82 /src
parent420845acb2207cb9d903e67b66deaf08637ac3b2 (diff)
vc4: Validate QPU uniform pointer updates.
Diffstat (limited to 'src')
-rw-r--r--src/gallium/drivers/vc4/vc4_qpu_validate.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/src/gallium/drivers/vc4/vc4_qpu_validate.c b/src/gallium/drivers/vc4/vc4_qpu_validate.c
index fade360e8a6..10bb84dd039 100644
--- a/src/gallium/drivers/vc4/vc4_qpu_validate.c
+++ b/src/gallium/drivers/vc4/vc4_qpu_validate.c
@@ -308,4 +308,26 @@ vc4_qpu_validate(uint64_t *insts, uint32_t num_inst)
if (qpu_num_sf_accesses(inst) > 1)
fail_instr(inst, "Single instruction writes SFU twice");
}
+
+ /* "The uniform base pointer can be written (from SIMD element 0) by
+ * the processor to reset the stream, there must be at least two
+ * nonuniform-accessing instructions following a pointer change
+ * before uniforms can be accessed once more."
+ */
+ int last_unif_pointer_update = -3;
+ for (int i = 0; i < num_inst; i++) {
+ uint64_t inst = insts[i];
+ uint32_t waddr_add = QPU_GET_FIELD(inst, QPU_WADDR_ADD);
+ uint32_t waddr_mul = QPU_GET_FIELD(inst, QPU_WADDR_MUL);
+
+ if (reads_reg(inst, QPU_R_UNIF) &&
+ i - last_unif_pointer_update <= 2) {
+ fail_instr(inst,
+ "uniform read too soon after pointer update");
+ }
+
+ if (waddr_add == QPU_W_UNIFORMS_ADDRESS ||
+ waddr_mul == QPU_W_UNIFORMS_ADDRESS)
+ last_unif_pointer_update = i;
+ }
}