broadcom/vc5: Use MSF to ignore discards/non-dispatched channels in loops.
authorEric Anholt <eric@anholt.net>
Fri, 12 Jan 2018 23:35:04 +0000 (15:35 -0800)
committerEric Anholt <eric@anholt.net>
Sat, 13 Jan 2018 05:58:24 +0000 (21:58 -0800)
Prevents potential infinite loops when a non-dispatched or discarded
channel never triggers the loop break condition.

src/broadcom/compiler/nir_to_vir.c

index bc18b19f80210cda1d7eb803a329b8afdf9c0fa4..68e86f3a1c2e8f12fabf1996a7b3e658a29f7d42 100644 (file)
@@ -1780,7 +1780,11 @@ ntq_emit_loop(struct v3d_compile *c, nir_loop *loop)
 
         vir_PF(c, c->execute, V3D_QPU_PF_PUSHZ);
 
-        vir_BRANCH(c, V3D_QPU_BRANCH_COND_ANYA);
+        struct qinst *branch = vir_BRANCH(c, V3D_QPU_BRANCH_COND_ANYA);
+        /* Pixels that were not dispatched or have been discarded should not
+         * contribute to looping again.
+         */
+        branch->qpu.branch.msfign = V3D_QPU_MSFIGN_P;
         vir_link_blocks(c->cur_block, c->loop_cont_block);
         vir_link_blocks(c->cur_block, c->loop_break_block);