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