spirv: Call repair SSA for OpTerminateInvocation

Fixes: 886d2d1a9a "spirv: Handle SpvOpTerminateInvocation"

Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7734>
This commit is contained in:
Jason Ekstrand 2020-11-23 10:07:17 -06:00 committed by Marge Bot
parent 6885cc6f65
commit 66685679b7
2 changed files with 17 additions and 3 deletions

View File

@ -687,11 +687,12 @@ vtn_process_block(struct vtn_builder *b,
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;
@ -1377,7 +1378,8 @@ vtn_function_emit(struct vtn_builder *b, struct vtn_function *func,
* 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;

View File

@ -702,7 +702,19 @@ struct vtn_builder {
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;