nak: Implement VK_KHR_shader_terminate_invocation

Signed-off-by: Mary Guillemard <mary.guillemard@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24998>
This commit is contained in:
Mary Guillemard 2023-10-13 14:26:33 +02:00 committed by Marge Bot
parent c32b73fdf2
commit 09d3871267
2 changed files with 16 additions and 2 deletions

View file

@ -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();

View file

@ -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,