From 73bf51dba087bb30378a5773c59033099254db42 Mon Sep 17 00:00:00 2001 From: Lionel Landwerlin Date: Wed, 12 Nov 2025 21:35:48 +0200 Subject: [PATCH] anv: consider 64bit atomics on similar formats with mutable images vkd3d-proton uses a R32G32_UINT image with MUTABLE Signed-off-by: Lionel Landwerlin Fixes: ed77f67e44 ("anv: add emulated 64bit integer storage support") Acked-by: Nanley Chery Part-of: --- src/intel/ci/anv-adl-vkd3d-fails.txt | 1 - src/intel/vulkan/anv_formats.c | 2 +- src/intel/vulkan/anv_image.c | 31 +++++++++++++++++++++++++--- src/intel/vulkan/anv_private.h | 13 +----------- 4 files changed, 30 insertions(+), 17 deletions(-) diff --git a/src/intel/ci/anv-adl-vkd3d-fails.txt b/src/intel/ci/anv-adl-vkd3d-fails.txt index 8be8e7f216a..7e06694ade3 100644 --- a/src/intel/ci/anv-adl-vkd3d-fails.txt +++ b/src/intel/ci/anv-adl-vkd3d-fails.txt @@ -2,7 +2,6 @@ test_buffers_oob_behavior_vectorized_structured_16bit,Fail test_custom_border_color_limits,Fail test_fence_wait_robustness,Crash test_line_rasterization,Fail -test_sampler_feedback_min_mip_level_array,Fail test_sampler_rounding,Fail # Undefined behavior not supported unless EXT_descriptor_buffer is diff --git a/src/intel/vulkan/anv_formats.c b/src/intel/vulkan/anv_formats.c index 3579f899263..84f0229e94e 100644 --- a/src/intel/vulkan/anv_formats.c +++ b/src/intel/vulkan/anv_formats.c @@ -2164,7 +2164,7 @@ void anv_GetPhysicalDeviceSparseImageFormatProperties2( isl_surf_usage_flags_t isl_usage = anv_image_choose_isl_surf_usage(physical_device, - pFormatInfo->format, + pFormatInfo->format, NULL, vk_create_flags, pFormatInfo->usage, 0, aspect, VK_IMAGE_COMPRESSION_DEFAULT_EXT); diff --git a/src/intel/vulkan/anv_image.c b/src/intel/vulkan/anv_image.c index 9dcf39a7c6c..c73f9f022c7 100644 --- a/src/intel/vulkan/anv_image.c +++ b/src/intel/vulkan/anv_image.c @@ -203,9 +203,26 @@ memory_range_merge(struct anv_image_memory_range *a, a->size = MAX2(a->size, b.offset + b.size); } +static bool +format_list_has_64bit_format(const VkImageFormatListCreateInfo *format_list_info) +{ + /* Any block compatible format */ + if (format_list_info == NULL) + return true; + + for (uint32_t i = 0; i < format_list_info->viewFormatCount; i++) { + if (format_list_info->pViewFormats[i] == VK_FORMAT_R64_SINT || + format_list_info->pViewFormats[i] == VK_FORMAT_R64_UINT) + return true; + } + + return false; +} + isl_surf_usage_flags_t anv_image_choose_isl_surf_usage(struct anv_physical_device *device, VkFormat vk_format, + const VkImageFormatListCreateInfo *format_list_info, VkImageCreateFlags vk_create_flags, VkImageUsageFlags vk_usage, isl_surf_usage_flags_t isl_extra_usage, @@ -315,8 +332,14 @@ anv_image_choose_isl_surf_usage(struct anv_physical_device *device, * so don't set the flags when using sparse, as they affect which tiling * format ISL will choose. */ - if (anv_is_storage_format_atomics_emulated(devinfo, vk_format) && - (vk_create_flags & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) == 0) { + if (devinfo->ver < 20 && + (vk_usage & VK_IMAGE_USAGE_STORAGE_BIT) && + (vk_create_flags & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) == 0 && + (vk_format == VK_FORMAT_R64_SINT || + vk_format == VK_FORMAT_R64_UINT || + ((vk_create_flags & VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT) && + vk_format_get_blocksizebits(vk_format) == 64 && + format_list_has_64bit_format(format_list_info)))) { isl_usage |= ISL_SURF_USAGE_DISABLE_AUX_BIT | ISL_SURF_USAGE_SOFTWARE_DETILING; } @@ -1273,7 +1296,7 @@ add_all_surfaces_implicit_interleaved_arrays_layout( VkImageUsageFlags vk_usage = vk_image_usage(&image->vk, aspect); isl_surf_usage_flags_t isl_usage = anv_image_choose_isl_surf_usage(device->physical, - image->vk.format, + image->vk.format, format_list_info, image->vk.create_flags, vk_usage, isl_extra_usage_flags, aspect, image->vk.compr_flags); @@ -1414,6 +1437,7 @@ add_all_surfaces_implicit_layout( isl_surf_usage_flags_t isl_usage = anv_image_choose_isl_surf_usage(device->physical, image->vk.format, + format_list_info, image->vk.create_flags, vk_usage, isl_extra_usage_flags, aspect, image->vk.compr_flags); @@ -2104,6 +2128,7 @@ anv_image_init(struct anv_device *device, struct anv_image *image, isl_surf_usage_flags_t isl_usage = anv_image_choose_isl_surf_usage(device->physical, image->vk.format, + &emu_format_list_info, image->vk.create_flags, image->vk.usage, 0, diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index 830f1881113..8d1be9374ec 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -5464,18 +5464,6 @@ anv_is_compressed_format_emulated(const struct anv_physical_device *pdevice, format) != VK_FORMAT_UNDEFINED; } -static inline bool -anv_is_storage_format_atomics_emulated(const struct intel_device_info *devinfo, - VkFormat format) -{ - /* No emulation required on Xe2+ */ - if (devinfo->ver >= 20) - return false; - - return format == VK_FORMAT_R64_SINT || - format == VK_FORMAT_R64_UINT; -} - static inline struct isl_swizzle anv_swizzle_for_render(struct isl_swizzle swizzle) { @@ -6088,6 +6076,7 @@ anv_image_ccs_op(struct anv_cmd_buffer *cmd_buffer, isl_surf_usage_flags_t anv_image_choose_isl_surf_usage(struct anv_physical_device *device, VkFormat vk_format, + const VkImageFormatListCreateInfo *format_list_info, VkImageCreateFlags vk_create_flags, VkImageUsageFlags vk_usage, isl_surf_usage_flags_t isl_extra_usage,