From 97962f2a347dcc0c536af629d3d0082c8e49fb99 Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Mon, 20 May 2024 14:56:43 +0200 Subject: [PATCH] radv: mark some formats as unsupported on GFX8/CARRIZO Ported from RadeonSI, untested. Cc: mesa-stable Signed-off-by: Samuel Pitoiset Part-of: --- src/amd/vulkan/radv_formats.c | 28 ++++++++++++++++++++-------- src/amd/vulkan/radv_formats.h | 3 ++- src/amd/vulkan/radv_image_view.c | 2 +- 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/src/amd/vulkan/radv_formats.c b/src/amd/vulkan/radv_formats.c index 92114359d4c..ef8ad95557c 100644 --- a/src/amd/vulkan/radv_formats.c +++ b/src/amd/vulkan/radv_formats.c @@ -75,7 +75,8 @@ radv_is_vertex_buffer_format_supported(VkFormat format) } uint32_t -radv_translate_tex_dataformat(VkFormat format, const struct util_format_description *desc, int first_non_void) +radv_translate_tex_dataformat(const struct radv_physical_device *pdev, VkFormat format, + const struct util_format_description *desc, int first_non_void) { bool uniform = true; int i; @@ -205,6 +206,9 @@ radv_translate_tex_dataformat(VkFormat format, const struct util_format_descript uniform = uniform && desc->channel[0].size == desc->channel[i].size; } + if (first_non_void < 0 || first_non_void > 3) + goto out_unknown; + /* Non-uniform formats. */ if (!uniform) { switch (desc->nr_channels) { @@ -214,6 +218,12 @@ radv_translate_tex_dataformat(VkFormat format, const struct util_format_descript } goto out_unknown; case 4: + /* 5551 and 1555 UINT formats fail on Gfx8/Carrizo´. */ + if (pdev->info.family == CHIP_CARRIZO && desc->channel[1].size == 5 && desc->channel[2].size == 5 && + desc->channel[first_non_void].type == UTIL_FORMAT_TYPE_UNSIGNED && + desc->channel[first_non_void].pure_integer) + goto out_unknown; + if (desc->channel[0].size == 5 && desc->channel[1].size == 5 && desc->channel[2].size == 5 && desc->channel[3].size == 1) { return V_008F14_IMG_DATA_FORMAT_1_5_5_5; @@ -234,9 +244,6 @@ radv_translate_tex_dataformat(VkFormat format, const struct util_format_descript goto out_unknown; } - if (first_non_void < 0 || first_non_void > 3) - goto out_unknown; - /* uniform formats */ switch (desc->channel[first_non_void].size) { case 4: @@ -246,6 +253,11 @@ radv_translate_tex_dataformat(VkFormat format, const struct util_format_descript return V_008F14_IMG_DATA_FORMAT_4_4; #endif case 4: + /* 4444 UINT formats fail on Gfx8/Carrizo´. */ + if (pdev->info.family == CHIP_CARRIZO && desc->channel[first_non_void].type == UTIL_FORMAT_TYPE_UNSIGNED && + desc->channel[first_non_void].pure_integer) + goto out_unknown; + return V_008F14_IMG_DATA_FORMAT_4_4_4_4; } break; @@ -301,7 +313,7 @@ radv_translate_tex_numformat(const struct util_format_description *desc, int fir } static bool -radv_is_sampler_format_supported(VkFormat format, bool *linear_sampling) +radv_is_sampler_format_supported(const struct radv_physical_device *pdev, VkFormat format, bool *linear_sampling) { const struct util_format_description *desc = vk_format_description(format); uint32_t num_format; @@ -317,7 +329,7 @@ radv_is_sampler_format_supported(VkFormat format, bool *linear_sampling) *linear_sampling = true; else *linear_sampling = false; - return radv_translate_tex_dataformat(format, vk_format_description(format), + return radv_translate_tex_dataformat(pdev, format, vk_format_description(format), vk_format_get_first_non_void_channel(format)) != ~0U; } @@ -339,7 +351,7 @@ radv_is_storage_image_format_supported(const struct radv_physical_device *pdev, if (vk_format_is_depth_or_stencil(format)) return false; - data_format = radv_translate_tex_dataformat(format, desc, vk_format_get_first_non_void_channel(format)); + data_format = radv_translate_tex_dataformat(pdev, format, desc, vk_format_get_first_non_void_channel(format)); num_format = radv_translate_tex_numformat(desc, vk_format_get_first_non_void_channel(format)); if (data_format == ~0) @@ -689,7 +701,7 @@ radv_physical_device_get_format_properties(struct radv_physical_device *pdev, Vk } } else { bool linear_sampling; - if (radv_is_sampler_format_supported(format, &linear_sampling)) { + if (radv_is_sampler_format_supported(pdev, format, &linear_sampling)) { linear |= VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_2_BLIT_SRC_BIT; tiled |= VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_2_BLIT_SRC_BIT; diff --git a/src/amd/vulkan/radv_formats.h b/src/amd/vulkan/radv_formats.h index f4a2bdb73a1..9ec01498734 100644 --- a/src/amd/vulkan/radv_formats.h +++ b/src/amd/vulkan/radv_formats.h @@ -145,7 +145,8 @@ uint32_t radv_translate_buffer_dataformat(const struct util_format_description * uint32_t radv_translate_buffer_numformat(const struct util_format_description *desc, int first_non_void); -uint32_t radv_translate_tex_dataformat(VkFormat format, const struct util_format_description *desc, int first_non_void); +uint32_t radv_translate_tex_dataformat(const struct radv_physical_device *pdev, VkFormat format, + const struct util_format_description *desc, int first_non_void); uint32_t radv_translate_tex_numformat(const struct util_format_description *desc, int first_non_void); diff --git a/src/amd/vulkan/radv_image_view.c b/src/amd/vulkan/radv_image_view.c index 7f363dacfee..0b7fead3e45 100644 --- a/src/amd/vulkan/radv_image_view.c +++ b/src/amd/vulkan/radv_image_view.c @@ -404,7 +404,7 @@ gfx6_make_texture_descriptor(struct radv_device *device, struct radv_image *imag num_format = radv_translate_tex_numformat(desc, first_non_void); - data_format = radv_translate_tex_dataformat(vk_format, desc, first_non_void); + data_format = radv_translate_tex_dataformat(pdev, vk_format, desc, first_non_void); if (data_format == ~0) { data_format = 0; }