return NULL;
case SpvOpKill:
- b->has_kill = true;
+ b->has_early_terminate = true;
block->branch_type = vtn_branch_type_discard;
return NULL;
case SpvOpTerminateInvocation:
+ b->has_early_terminate = true;
block->branch_type = vtn_branch_type_terminate;
return NULL;
* but instructions in the continue may use SSA defs in the loop body.
* Therefore, we need to repair SSA to insert the needed phi nodes.
*/
- if (b->func->impl->structured && (b->has_loop_continue || b->has_kill))
+ if (b->func->impl->structured &&
+ (b->has_loop_continue || b->has_early_terminate))
nir_repair_ssa_impl(func->impl);
func->emitted = true;
unsigned func_param_idx;
bool has_loop_continue;
- bool has_kill;
+
+ /** True if this shader has any early termination instructions like OpKill
+ *
+ * In the SPIR-V, the following instructions are block terminators:
+ *
+ * - OpKill
+ * - OpTerminateInvocation
+ *
+ * However, in NIR, they're represented by regular intrinsics with no
+ * control-flow semantics. This means that the SSA form from the SPIR-V
+ * may not 100% match NIR and we have to fix it up at the end.
+ */
+ bool has_early_terminate;
/* false by default, set to true by the ContractionOff execution mode */
bool exact;