v3d: predicate geometry shader outputs inside non-uniform control flow
authorIago Toral Quiroga <itoral@igalia.com>
Fri, 11 Oct 2019 09:40:38 +0000 (11:40 +0200)
committerIago Toral Quiroga <itoral@igalia.com>
Mon, 16 Dec 2019 07:42:37 +0000 (08:42 +0100)
Reviewed-by: Alejandro PiƱeiro <apinheiro@igalia.com>
src/broadcom/compiler/nir_to_vir.c

index d49640bf62378b6435371ec80e77a4f8ed871e32..e56632590d6dad549b83b8cdea9eb17991af5703 100644 (file)
@@ -2021,7 +2021,22 @@ emit_store_output_gs(struct v3d_compile *c, nir_intrinsic_instr *instr)
         struct qreg offset =
                 vir_ADD(c, vir_uniform_ui(c, base_offset), src_offset);
 
+        /* Usually, for VS or FS, we only emit outputs once at program end so
+         * our VPM writes are never in non-uniform control flow, but this
+         * is not true for GS, where we are emitting multiple vertices.
+         */
+        if (vir_in_nonuniform_control_flow(c)) {
+                vir_set_pf(vir_MOV_dest(c, vir_nop_reg(), c->execute),
+                           V3D_QPU_PF_PUSHZ);
+        }
+
         vir_VPM_WRITE_indirect(c, ntq_get_src(c, instr->src[0], 0), offset);
+
+        if (vir_in_nonuniform_control_flow(c)) {
+                struct qinst *last_inst =
+                        (struct qinst *)c->cur_block->instructions.prev;
+                vir_set_cond(last_inst, V3D_QPU_COND_IFA);
+        }
 }
 
 static void