diff --git a/docs/features.txt b/docs/features.txt index 431b7595e38..9bf4c0d9185 100644 --- a/docs/features.txt +++ b/docs/features.txt @@ -494,7 +494,7 @@ Khronos extensions that are not part of any Vulkan version: VK_EXT_sample_locations DONE (anv, radv, tu/a650) VK_KHR_shader_clock DONE (anv, radv) VK_KHR_shader_non_semantic_info DONE (anv, radv) - VK_KHR_shader_terminate_invocation DONE (anv, radv) + VK_KHR_shader_terminate_invocation DONE (anv, radv, tu) VK_KHR_shared_presentable_image not started VK_KHR_surface DONE (anv, lvp, radv, tu, v3dv) VK_KHR_surface_protected_capabilities DONE (anv, lvp, radv) diff --git a/src/freedreno/ir3/ir3_compiler_nir.c b/src/freedreno/ir3/ir3_compiler_nir.c index 698bb3477f9..1c50e5d41c1 100644 --- a/src/freedreno/ir3/ir3_compiler_nir.c +++ b/src/freedreno/ir3/ir3_compiler_nir.c @@ -1952,11 +1952,15 @@ emit_intrinsic(struct ir3_context *ctx, nir_intrinsic_instr *intr) case nir_intrinsic_discard_if: case nir_intrinsic_discard: case nir_intrinsic_demote: - case nir_intrinsic_demote_if: { + case nir_intrinsic_demote_if: + case nir_intrinsic_terminate: + case nir_intrinsic_terminate_if: + { struct ir3_instruction *cond, *kill; if (intr->intrinsic == nir_intrinsic_discard_if || - intr->intrinsic == nir_intrinsic_demote_if) { + intr->intrinsic == nir_intrinsic_demote_if || + intr->intrinsic == nir_intrinsic_terminate_if) { /* conditional discard: */ src = ir3_get_src(ctx, &intr->src[0]); cond = src[0]; diff --git a/src/freedreno/vulkan/tu_device.c b/src/freedreno/vulkan/tu_device.c index d4a0556b8e3..6381cb370d7 100644 --- a/src/freedreno/vulkan/tu_device.c +++ b/src/freedreno/vulkan/tu_device.c @@ -628,6 +628,12 @@ tu_GetPhysicalDeviceFeatures2(VkPhysicalDevice physicalDevice, features->shaderDemoteToHelperInvocation = true; break; } + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES_KHR: { + VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR *features = + (VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR *)ext; + features->shaderTerminateInvocation = true; + break; + } default: break; diff --git a/src/freedreno/vulkan/tu_extensions.py b/src/freedreno/vulkan/tu_extensions.py index 0938ece8e13..08eb34c3576 100644 --- a/src/freedreno/vulkan/tu_extensions.py +++ b/src/freedreno/vulkan/tu_extensions.py @@ -118,6 +118,7 @@ EXTENSIONS = [ Extension('VK_KHR_relaxed_block_layout', 1, True), Extension('VK_EXT_robustness2', 1, True), Extension('VK_EXT_shader_demote_to_helper_invocation', 1, True), + Extension('VK_KHR_shader_terminate_invocation', 1, True), ] MAX_API_VERSION = VkVersion(MAX_API_VERSION)