diff --git a/src/nouveau/compiler/nak_from_nir.rs b/src/nouveau/compiler/nak_from_nir.rs index a3454528765..90dfc634de4 100644 --- a/src/nouveau/compiler/nak_from_nir.rs +++ b/src/nouveau/compiler/nak_from_nir.rs @@ -1374,15 +1374,23 @@ impl<'a> ShaderFromNir<'a> { data: data, }); } - nir_intrinsic_demote | nir_intrinsic_discard => { + nir_intrinsic_demote + | nir_intrinsic_discard + | nir_intrinsic_terminate => { 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_demote_if + | nir_intrinsic_discard_if + | nir_intrinsic_terminate_if => { if let ShaderIoInfo::Fragment(info) = &mut self.info.io { info.uses_kill = true; } else { @@ -1390,6 +1398,10 @@ 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/vulkan/nvk_physical_device.c b/src/nouveau/vulkan/nvk_physical_device.c index a01f68ec420..043f4275c6f 100644 --- a/src/nouveau/vulkan/nvk_physical_device.c +++ b/src/nouveau/vulkan/nvk_physical_device.c @@ -81,6 +81,7 @@ nvk_get_device_extensions(const struct nv_device_info *info, .KHR_shader_clock = true, .KHR_shader_draw_parameters = true, .KHR_shader_non_semantic_info = true, + .KHR_shader_terminate_invocation = true, .KHR_spirv_1_4 = true, .KHR_storage_buffer_storage_class = true, .KHR_timeline_semaphore = true, @@ -245,6 +246,7 @@ nvk_get_device_features(const struct nv_device_info *info, .descriptorBindingInlineUniformBlockUpdateAfterBind = true, .privateData = true, .shaderDemoteToHelperInvocation = true, + .shaderTerminateInvocation = true, .dynamicRendering = true, .maintenance4 = true,