diff --git a/src/nouveau/vulkan/nvk_buffer_view.c b/src/nouveau/vulkan/nvk_buffer_view.c index 04867ec146d..484a4ec2581 100644 --- a/src/nouveau/vulkan/nvk_buffer_view.c +++ b/src/nouveau/vulkan/nvk_buffer_view.c @@ -35,7 +35,7 @@ nvk_get_buffer_format_features(struct nvk_physical_device *pdev, features |= VK_FORMAT_FEATURE_2_STORAGE_READ_WITHOUT_FORMAT_BIT; } - if (p_format == PIPE_FORMAT_R32_UINT || p_format == PIPE_FORMAT_R32_SINT) + if (nvk_format_supports_atomics(&pdev->info, p_format)) features |= VK_FORMAT_FEATURE_2_STORAGE_TEXEL_BUFFER_ATOMIC_BIT; } diff --git a/src/nouveau/vulkan/nvk_format.c b/src/nouveau/vulkan/nvk_format.c index 35aeb8db52b..5f8aa9958b9 100644 --- a/src/nouveau/vulkan/nvk_format.c +++ b/src/nouveau/vulkan/nvk_format.c @@ -17,6 +17,21 @@ #include "cl9097.h" #include "cl90c0.h" +bool +nvk_format_supports_atomics(const struct nv_device_info *dev, + enum pipe_format p_format) +{ + switch (p_format) { + case PIPE_FORMAT_R32_UINT: + case PIPE_FORMAT_R32_SINT: + case PIPE_FORMAT_R64_UINT: + case PIPE_FORMAT_R64_SINT: + return true; + default: + return false; + } +} + #define VA_FMT(vk_fmt, widths, swap_rb, type) \ [VK_FORMAT_##vk_fmt] = \ { NV9097_SET_VERTEX_ATTRIBUTE_A_COMPONENT_BIT_WIDTHS_##widths, \ diff --git a/src/nouveau/vulkan/nvk_format.h b/src/nouveau/vulkan/nvk_format.h index 700e3a0ab38..fbe586c2039 100644 --- a/src/nouveau/vulkan/nvk_format.h +++ b/src/nouveau/vulkan/nvk_format.h @@ -7,6 +7,9 @@ #include "nvk_private.h" +#include "util/format/u_formats.h" +#include "nv_device_info.h" + struct nvk_physical_device; struct nvk_va_format { @@ -15,6 +18,10 @@ struct nvk_va_format { uint8_t type:7; }; +bool +nvk_format_supports_atomics(const struct nv_device_info *dev, + enum pipe_format p_format); + const struct nvk_va_format * nvk_get_va_format(const struct nvk_physical_device *pdev, VkFormat format); diff --git a/src/nouveau/vulkan/nvk_image.c b/src/nouveau/vulkan/nvk_image.c index 793a6764f02..4c6429f6369 100644 --- a/src/nouveau/vulkan/nvk_image.c +++ b/src/nouveau/vulkan/nvk_image.c @@ -81,8 +81,7 @@ nvk_get_image_plane_format_features(struct nvk_physical_device *pdev, features |= VK_FORMAT_FEATURE_2_STORAGE_READ_WITHOUT_FORMAT_BIT; } - if (p_format == PIPE_FORMAT_R32_UINT || p_format == PIPE_FORMAT_R32_SINT || - p_format == PIPE_FORMAT_R64_UINT || p_format == PIPE_FORMAT_R64_SINT) + if (nvk_format_supports_atomics(&pdev->info, p_format)) features |= VK_FORMAT_FEATURE_2_STORAGE_IMAGE_ATOMIC_BIT; if (p_format == PIPE_FORMAT_R8_UINT && tiling == VK_IMAGE_TILING_OPTIMAL)