From 72f55cf7c4eb78b4f8ccebcdde31305af6245f7c Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Thu, 10 Jun 2021 12:10:37 +0200 Subject: [PATCH] radv: implement VK_EXT_shader_atomic_float2 Some floating atomic instructions are not available on GFX8-9. No LLVM support. Signed-off-by: Samuel Pitoiset Reviewed-by: Rhys Perry Part-of: --- docs/features.txt | 2 +- docs/relnotes/new_features.txt | 2 +- src/amd/vulkan/radv_device.c | 20 ++++++++++++++++++++ src/amd/vulkan/radv_shader.c | 2 ++ src/amd/vulkan/radv_shader_info.c | 10 +++++++++- 5 files changed, 33 insertions(+), 3 deletions(-) diff --git a/docs/features.txt b/docs/features.txt index 0da7b90..5ee8971 100644 --- a/docs/features.txt +++ b/docs/features.txt @@ -543,7 +543,7 @@ Khronos extensions that are not part of any Vulkan version: VK_EXT_robustness2 DONE (anv, radv, tu) VK_EXT_sample_locations DONE (anv, radv/gfx9-, tu/a650) VK_EXT_shader_atomic_float DONE (anv, radv) - VK_EXT_shader_atomic_float2 DONE (anv/gen9+) + VK_EXT_shader_atomic_float2 DONE (anv/gen9+, radv) VK_EXT_shader_demote_to_helper_invocation DONE (anv, radv, tu) VK_EXT_shader_image_atomic_int64 DONE (radv) VK_EXT_shader_stencil_export DONE (anv/gen9+, lvp, radv, tu) diff --git a/docs/relnotes/new_features.txt b/docs/relnotes/new_features.txt index 77d1e6a..e610869 100644 --- a/docs/relnotes/new_features.txt +++ b/docs/relnotes/new_features.txt @@ -1,4 +1,4 @@ VK_EXT_color_write_enable on lavapipe GL_ARB_texture_filter_anisotropic in llvmpipe Anisotropic texture filtering in lavapipe -VK_EXT_shader_atomic_float2 on Intel +VK_EXT_shader_atomic_float2 on Intel and RADV. diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c index ecddf35..29f1c30 100644 --- a/src/amd/vulkan/radv_device.c +++ b/src/amd/vulkan/radv_device.c @@ -493,6 +493,7 @@ radv_physical_device_get_supported_extensions(const struct radv_physical_device .EXT_sampler_filter_minmax = true, .EXT_scalar_block_layout = device->rad_info.chip_class >= GFX7, .EXT_shader_atomic_float = true, + .EXT_shader_atomic_float2 = !device->use_llvm, .EXT_shader_demote_to_helper_invocation = true, .EXT_shader_image_atomic_int64 = true, .EXT_shader_stencil_export = true, @@ -1671,6 +1672,25 @@ radv_GetPhysicalDeviceFeatures2(VkPhysicalDevice physicalDevice, features->colorWriteEnable = true; break; } + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT: { + VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT *features = + (VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT *)ext; + bool has_shader_float_minmax = pdevice->rad_info.chip_class != GFX8 && + pdevice->rad_info.chip_class != GFX9; + features->shaderBufferFloat16Atomics = false; + features->shaderBufferFloat16AtomicAdd = false; + features->shaderBufferFloat16AtomicMinMax = false; + features->shaderBufferFloat32AtomicMinMax = has_shader_float_minmax; + features->shaderBufferFloat64AtomicMinMax = has_shader_float_minmax; + features->shaderSharedFloat16Atomics = false; + features->shaderSharedFloat16AtomicAdd = false; + features->shaderSharedFloat16AtomicMinMax = false; + features->shaderSharedFloat32AtomicMinMax = true; + features->shaderSharedFloat64AtomicMinMax = true; + features->shaderImageFloat32AtomicMinMax = has_shader_float_minmax; + features->sparseImageFloat32AtomicMinMax = has_shader_float_minmax; + break; + } default: break; } diff --git a/src/amd/vulkan/radv_shader.c b/src/amd/vulkan/radv_shader.c index 2dc7be4..513ec56 100644 --- a/src/amd/vulkan/radv_shader.c +++ b/src/amd/vulkan/radv_shader.c @@ -534,7 +534,9 @@ radv_shader_compile_to_nir(struct radv_device *device, struct vk_shader_module * .float_controls = true, .float16 = device->physical_device->rad_info.has_packed_math_16bit, .float32_atomic_add = true, + .float32_atomic_min_max = true, .float64 = true, + .float64_atomic_min_max = true, .geometry_streams = true, .image_atomic_int64 = true, .image_ms_array = true, diff --git a/src/amd/vulkan/radv_shader_info.c b/src/amd/vulkan/radv_shader_info.c index ce260b4..428f518 100644 --- a/src/amd/vulkan/radv_shader_info.c +++ b/src/amd/vulkan/radv_shader_info.c @@ -216,6 +216,8 @@ gather_intrinsic_info(const nir_shader *nir, const nir_intrinsic_instr *instr, case nir_intrinsic_image_deref_atomic_xor: case nir_intrinsic_image_deref_atomic_exchange: case nir_intrinsic_image_deref_atomic_comp_swap: + case nir_intrinsic_image_deref_atomic_fmin: + case nir_intrinsic_image_deref_atomic_fmax: case nir_intrinsic_image_deref_size: { nir_variable *var = nir_deref_instr_get_variable(nir_instr_as_deref(instr->src[0].ssa->parent_instr)); @@ -231,7 +233,9 @@ gather_intrinsic_info(const nir_shader *nir, const nir_intrinsic_instr *instr, instr->intrinsic == nir_intrinsic_image_deref_atomic_or || instr->intrinsic == nir_intrinsic_image_deref_atomic_xor || instr->intrinsic == nir_intrinsic_image_deref_atomic_exchange || - instr->intrinsic == nir_intrinsic_image_deref_atomic_comp_swap) { + instr->intrinsic == nir_intrinsic_image_deref_atomic_comp_swap || + instr->intrinsic == nir_intrinsic_image_deref_atomic_fmin || + instr->intrinsic == nir_intrinsic_image_deref_atomic_fmax) { set_writes_memory(nir, info); } break; @@ -247,6 +251,8 @@ gather_intrinsic_info(const nir_shader *nir, const nir_intrinsic_instr *instr, case nir_intrinsic_ssbo_atomic_xor: case nir_intrinsic_ssbo_atomic_exchange: case nir_intrinsic_ssbo_atomic_comp_swap: + case nir_intrinsic_ssbo_atomic_fmin: + case nir_intrinsic_ssbo_atomic_fmax: case nir_intrinsic_store_global: case nir_intrinsic_global_atomic_add: case nir_intrinsic_global_atomic_imin: @@ -258,6 +264,8 @@ gather_intrinsic_info(const nir_shader *nir, const nir_intrinsic_instr *instr, case nir_intrinsic_global_atomic_xor: case nir_intrinsic_global_atomic_exchange: case nir_intrinsic_global_atomic_comp_swap: + case nir_intrinsic_global_atomic_fmin: + case nir_intrinsic_global_atomic_fmax: set_writes_memory(nir, info); break; case nir_intrinsic_load_input: -- 2.7.4