vc4: Make sure that we don't overwrite the signal for PROG_END.
authorEric Anholt <eric@anholt.net>
Mon, 2 May 2016 21:45:45 +0000 (14:45 -0700)
committerEric Anholt <eric@anholt.net>
Fri, 6 May 2016 17:25:55 +0000 (10:25 -0700)
We should have already emitted a NOP due to the last instruction being a
TLB or VPM write.  However, if you disable dead code elimination then you
might get dead code at the end, and that dead code might have the signal
bits set to something non-default, at which point you die in assertion
failure.

src/gallium/drivers/vc4/vc4_qpu_emit.c

index 11640faa633e0f51dd196034e5d1b0903af14f8a..ecb70948ece5b3b157cd37f8ba51ed415d3334ec 100644 (file)
@@ -510,6 +510,14 @@ vc4_generate_code(struct vc4_context *vc4, struct vc4_compile *c)
         if (qpu_inst_is_tlb(c->qpu_insts[c->qpu_inst_count - 1]))
                 qpu_serialize_one_inst(c, qpu_NOP());
 
+        /* Make sure there's no existing signal set (like for a small
+         * immediate)
+         */
+        if (QPU_GET_FIELD(c->qpu_insts[c->qpu_inst_count - 1],
+                          QPU_SIG) != QPU_SIG_NONE) {
+                qpu_serialize_one_inst(c, qpu_NOP());
+        }
+
         c->qpu_insts[c->qpu_inst_count - 1] =
                 qpu_set_sig(c->qpu_insts[c->qpu_inst_count - 1],
                             QPU_SIG_PROG_END);