diff --git a/docs/features.txt b/docs/features.txt index 12e52ca15d2..fc16545ba48 100644 --- a/docs/features.txt +++ b/docs/features.txt @@ -537,6 +537,7 @@ Khronos extensions that are not part of any Vulkan version: VK_KHR_ray_tracing_position_fetch DONE (anv, radv/gfx10.3+) VK_KHR_shader_clock DONE (anv, hasvk, lvp, nvk, radv, vn) VK_KHR_shader_expect_assume DONE (anv, dzn, hasvk, lvp, nvk, panvk, pvr, radv, tu, v3dv, vn) + VK_KHR_shader_maximal_reconvergence DONE (radv) VK_KHR_shader_subgroup_rotate DONE (anv, radv) VK_KHR_shader_subgroup_uniform_control_flow DONE (anv, hasvk, radv) VK_KHR_shared_presentable_image not started diff --git a/docs/relnotes/new_features.txt b/docs/relnotes/new_features.txt index 01599155cba..2106475ce89 100644 --- a/docs/relnotes/new_features.txt +++ b/docs/relnotes/new_features.txt @@ -3,3 +3,4 @@ VK_KHR_load_store_op_none on RADV VK_KHR_line_rasterization on RADV VK_KHR_index_type_uint8 on RADV VK_KHR_shader_expect_assume on all Vulkan drivers +VK_KHR_shader_maximal_reconvergence on RADV diff --git a/src/amd/vulkan/radv_physical_device.c b/src/amd/vulkan/radv_physical_device.c index b07e0c9e5e8..c74720af288 100644 --- a/src/amd/vulkan/radv_physical_device.c +++ b/src/amd/vulkan/radv_physical_device.c @@ -505,6 +505,7 @@ radv_physical_device_get_supported_extensions(const struct radv_physical_device .KHR_shader_float16_int8 = true, .KHR_shader_float_controls = true, .KHR_shader_integer_dot_product = true, + .KHR_shader_maximal_reconvergence = true, .KHR_shader_non_semantic_info = true, .KHR_shader_subgroup_extended_types = true, .KHR_shader_subgroup_rotate = true, @@ -1135,6 +1136,9 @@ radv_physical_device_get_features(const struct radv_physical_device *pdevice, st /* VK_KHR_shader_expect_assume */ .shaderExpectAssume = true, + + /* VK_KHR_shader_maximal_reconvergence */ + .shaderMaximalReconvergence = true, }; } diff --git a/src/amd/vulkan/radv_shader.c b/src/amd/vulkan/radv_shader.c index 9125e533448..54095354a52 100644 --- a/src/amd/vulkan/radv_shader.c +++ b/src/amd/vulkan/radv_shader.c @@ -759,6 +759,13 @@ radv_consider_culling(const struct radv_physical_device *pdevice, struct nir_sha if (BITSET_TEST(nir->info.system_values_read, SYSTEM_VALUE_SUBGROUP_INVOCATION)) return false; + /* When re-using values that depend on subgroup operations, we'd break convergence guarantees. + * Since we only re-use uniform values, the only subgroup operations we really care about are + * ballot, reductions and vote intrinsics. + */ + if (nir->info.maximally_reconverges && nir->info.uses_wide_subgroup_intrinsics) + return false; + return true; }