Mesa (main): radv: implement VK_EXT_shader_atomic_float2

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Jul 27 07:19:45 UTC 2021


Module: Mesa
Branch: main
Commit: 72f55cf7c4eb78b4f8ccebcdde31305af6245f7c
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=72f55cf7c4eb78b4f8ccebcdde31305af6245f7c

Author: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Date:   Thu Jun 10 12:10:37 2021 +0200

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 <samuel.pitoiset at gmail.com>
Reviewed-by: Rhys Perry <pendingchaos02 at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12060>

---

 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 0da7b9061d4..5ee8971d45f 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 77d1e6a0b6a..e610869c8ae 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 ecddf358738..29f1c30b6a4 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 2dc7be4c5d6..513ec560a5e 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 ce260b4648f..428f51823bd 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:



More information about the mesa-commit mailing list