From 473559001f21218febaaf069441bb3d4afc4ab5c Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Mon, 20 May 2024 15:49:45 +0200 Subject: [PATCH] radv: add radv_is_colorbuffer_format_blendable() This will allow us to add a common helper to know if a format is supported by CB. Signed-off-by: Samuel Pitoiset Part-of: --- src/amd/vulkan/meta/radv_meta_clear.c | 3 +-- src/amd/vulkan/radv_formats.c | 31 ++++++++++++++++----------- src/amd/vulkan/radv_formats.h | 2 +- src/amd/vulkan/radv_image.c | 4 +--- 4 files changed, 22 insertions(+), 18 deletions(-) diff --git a/src/amd/vulkan/meta/radv_meta_clear.c b/src/amd/vulkan/meta/radv_meta_clear.c index f27b38d4693..683e7d4e84f 100644 --- a/src/amd/vulkan/meta/radv_meta_clear.c +++ b/src/amd/vulkan/meta/radv_meta_clear.c @@ -2086,9 +2086,8 @@ radv_cmd_clear_image(struct radv_cmd_buffer *cmd_buffer, struct radv_image *imag bool disable_compression = false; if (format == VK_FORMAT_E5B9G9R9_UFLOAT_PACK32) { - bool blendable; if (cs ? !radv_is_storage_image_format_supported(pdev, format) - : !radv_is_colorbuffer_format_supported(pdev, format, &blendable)) { + : !radv_is_colorbuffer_format_supported(pdev, format)) { format = VK_FORMAT_R32_UINT; internal_clear_value.color.uint32[0] = float3_to_rgb9e5(clear_value->color.float32); diff --git a/src/amd/vulkan/radv_formats.c b/src/amd/vulkan/radv_formats.c index 2577b422d37..4e9366b4dbf 100644 --- a/src/amd/vulkan/radv_formats.c +++ b/src/amd/vulkan/radv_formats.c @@ -441,20 +441,28 @@ radv_is_buffer_format_supported(VkFormat format, bool *scaled) return true; } +static bool +radv_is_colorbuffer_format_blendable(const struct radv_physical_device *pdev, VkFormat format) +{ + const struct util_format_description *desc = vk_format_description(format); + const uint32_t color_format = ac_get_cb_format(pdev->info.gfx_level, desc->format); + const uint32_t color_num_format = ac_get_cb_number_type(desc->format); + + assert(color_format != V_028C70_COLOR_INVALID); + if (color_num_format == V_028C70_NUMBER_UINT || color_num_format == V_028C70_NUMBER_SINT || + color_format == V_028C70_COLOR_8_24 || color_format == V_028C70_COLOR_24_8 || + color_format == V_028C70_COLOR_X24_8_32_FLOAT) + return false; + + return true; +} + bool -radv_is_colorbuffer_format_supported(const struct radv_physical_device *pdev, VkFormat format, bool *blendable) +radv_is_colorbuffer_format_supported(const struct radv_physical_device *pdev, VkFormat format) { const struct util_format_description *desc = vk_format_description(format); uint32_t color_format = ac_get_cb_format(pdev->info.gfx_level, desc->format); uint32_t color_swap = ac_translate_colorswap(pdev->info.gfx_level, desc->format, false); - uint32_t color_num_format = ac_get_cb_number_type(desc->format); - - if (color_num_format == V_028C70_NUMBER_UINT || color_num_format == V_028C70_NUMBER_SINT || - color_format == V_028C70_COLOR_8_24 || color_format == V_028C70_COLOR_24_8 || - color_format == V_028C70_COLOR_X24_8_32_FLOAT) { - *blendable = false; - } else - *blendable = true; return color_format != V_028C70_COLOR_INVALID && color_swap != ~0U; } @@ -578,7 +586,6 @@ radv_physical_device_get_format_properties(struct radv_physical_device *pdev, Vk const struct radv_instance *instance = radv_physical_device_instance(pdev); VkFormatFeatureFlags2 linear = 0, tiled = 0, buffer = 0; const struct util_format_description *desc = vk_format_description(format); - bool blendable; bool scaled = false; /* TODO: implement some software emulation of SUBSAMPLED formats. */ if (desc->format == PIPE_FORMAT_NONE || desc->layout == UTIL_FORMAT_LAYOUT_SUBSAMPLED) { @@ -706,10 +713,10 @@ radv_physical_device_get_format_properties(struct radv_physical_device *pdev, Vk linear &= ~VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_MINMAX_BIT; } } - if (radv_is_colorbuffer_format_supported(pdev, format, &blendable) && desc->channel[0].size != 64) { + if (radv_is_colorbuffer_format_supported(pdev, format) && desc->channel[0].size != 64) { linear |= VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_2_BLIT_DST_BIT; tiled |= VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_2_BLIT_DST_BIT; - if (blendable) { + if (radv_is_colorbuffer_format_blendable(pdev, format)) { linear |= VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BLEND_BIT; tiled |= VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BLEND_BIT; } diff --git a/src/amd/vulkan/radv_formats.h b/src/amd/vulkan/radv_formats.h index 5a18cdb6d56..f4a2bdb73a1 100644 --- a/src/amd/vulkan/radv_formats.h +++ b/src/amd/vulkan/radv_formats.h @@ -155,7 +155,7 @@ bool radv_is_storage_image_format_supported(const struct radv_physical_device *d bool radv_is_buffer_format_supported(VkFormat format, bool *scaled); -bool radv_is_colorbuffer_format_supported(const struct radv_physical_device *pdev, VkFormat format, bool *blendable); +bool radv_is_colorbuffer_format_supported(const struct radv_physical_device *pdev, VkFormat format); bool radv_is_format_emulated(const struct radv_physical_device *pdev, VkFormat format); diff --git a/src/amd/vulkan/radv_image.c b/src/amd/vulkan/radv_image.c index d367cc858d3..9ca52db24b5 100644 --- a/src/amd/vulkan/radv_image.c +++ b/src/amd/vulkan/radv_image.c @@ -178,9 +178,7 @@ bool radv_are_formats_dcc_compatible(const struct radv_physical_device *pdev, const void *pNext, VkFormat format, VkImageCreateFlags flags, bool *sign_reinterpret) { - bool blendable; - - if (!radv_is_colorbuffer_format_supported(pdev, format, &blendable)) + if (!radv_is_colorbuffer_format_supported(pdev, format)) return false; if (sign_reinterpret != NULL)