anv: consider 64bit atomics on similar formats with mutable images
vkd3d-proton uses a R32G32_UINT image with MUTABLE
Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Fixes: ed77f67e44 ("anv: add emulated 64bit integer storage support")
Acked-by: Nanley Chery <nanley.g.chery@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/38409>
This commit is contained in:
committed by
Marge Bot
parent
b3cc54731f
commit
73bf51dba0
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user