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:
parent
6885cc6f65
commit
66685679b7
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue