diff --git a/src/nouveau/compiler/nak/from_nir.rs b/src/nouveau/compiler/nak/from_nir.rs index 24f6e3003d2..400d1b04cad 100644 --- a/src/nouveau/compiler/nak/from_nir.rs +++ b/src/nouveau/compiler/nak/from_nir.rs @@ -2150,23 +2150,15 @@ impl<'a> ShaderFromNir<'a> { b.push_op(OpFSOut { srcs: srcs }); } - nir_intrinsic_demote - | nir_intrinsic_discard - | nir_intrinsic_terminate => { + nir_intrinsic_demote | nir_intrinsic_discard => { if let ShaderIoInfo::Fragment(info) = &mut self.info.io { info.uses_kill = true; } else { panic!("OpKill is only available in fragment shaders"); } b.push_op(OpKill {}); - - if intrin.intrinsic == nir_intrinsic_terminate { - b.push_op(OpExit {}); - } } - nir_intrinsic_demote_if - | nir_intrinsic_discard_if - | nir_intrinsic_terminate_if => { + nir_intrinsic_demote_if | nir_intrinsic_discard_if => { if let ShaderIoInfo::Fragment(info) = &mut self.info.io { info.uses_kill = true; } else { @@ -2174,10 +2166,6 @@ impl<'a> ShaderFromNir<'a> { } let cond = self.get_ssa(srcs[0].as_def())[0]; b.predicate(cond.into()).push_op(OpKill {}); - - if intrin.intrinsic == nir_intrinsic_terminate_if { - b.predicate(cond.into()).push_op(OpExit {}); - } } nir_intrinsic_global_atomic => { let bit_size = intrin.def.bit_size(); diff --git a/src/nouveau/compiler/nak_nir.c b/src/nouveau/compiler/nak_nir.c index 81feb313714..73fc8ecb719 100644 --- a/src/nouveau/compiler/nak_nir.c +++ b/src/nouveau/compiler/nak_nir.c @@ -5,6 +5,7 @@ #include "nak_private.h" #include "nir_builder.h" +#include "nir_control_flow.h" #include "nir_xfb_info.h" #include "util/u_math.h" @@ -323,6 +324,9 @@ nak_preprocess_nir(nir_shader *nir, const struct nak_compiler *nak) OPT(nir, nir_lower_system_values); OPT(nir, nak_nir_lower_subgroup_id); OPT(nir, nir_lower_compute_system_values, NULL); + + if (nir->info.stage == MESA_SHADER_FRAGMENT) + OPT(nir, nir_lower_terminate_to_demote); } static uint16_t