From e893102bcf5d6632f36399d745481639344e5526 Mon Sep 17 00:00:00 2001 From: Bas Nieuwenhuizen Date: Wed, 23 Sep 2020 02:37:19 +0200 Subject: [PATCH] radv: Add VK_FORMAT_E5B9G9R9_UFLOAT_PACK32 rendering support. Reviewed-by: Samuel Pitoiset Part-of: --- src/amd/vulkan/radv_cmd_buffer.c | 4 ++++ src/amd/vulkan/radv_formats.c | 20 ++++++++++++++++++-- src/amd/vulkan/radv_image.c | 4 ++-- src/amd/vulkan/radv_private.h | 3 ++- 4 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c index 6f0a6a04275..80239563b3d 100644 --- a/src/amd/vulkan/radv_cmd_buffer.c +++ b/src/amd/vulkan/radv_cmd_buffer.c @@ -1196,6 +1196,10 @@ radv_emit_rbplus_state(struct radv_cmd_buffer *cmd_buffer) sx_blend_opt_epsilon |= V_028758_10BIT_FORMAT << (i * 4); } break; + case V_028C70_COLOR_5_9_9_9: + if (spi_format == V_028714_SPI_SHADER_FP16_ABGR) + sx_ps_downconvert |= V_028754_SX_RT_EXPORT_9_9_9_E5 << (i * 4); + break; } } diff --git a/src/amd/vulkan/radv_formats.c b/src/amd/vulkan/radv_formats.c index 6f7708d9b24..ed9e30f101a 100644 --- a/src/amd/vulkan/radv_formats.c +++ b/src/amd/vulkan/radv_formats.c @@ -32,6 +32,7 @@ #include "util/u_half.h" #include "util/format_srgb.h" #include "util/format_r11g11b10f.h" +#include "util/format_rgb9e5.h" uint32_t radv_translate_buffer_dataformat(const struct vk_format_description *desc, int first_non_void) @@ -565,7 +566,8 @@ bool radv_is_buffer_format_supported(VkFormat format, bool *scaled) num_format != ~0; } -bool radv_is_colorbuffer_format_supported(VkFormat format, bool *blendable) +bool radv_is_colorbuffer_format_supported(const struct radv_physical_device *pdevice, + VkFormat format, bool *blendable) { const struct vk_format_description *desc = vk_format_description(format); uint32_t color_format = radv_translate_colorformat(format); @@ -580,6 +582,10 @@ bool radv_is_colorbuffer_format_supported(VkFormat format, bool *blendable) *blendable = false; } else *blendable = true; + + if (format == VK_FORMAT_E5B9G9R9_UFLOAT_PACK32 && pdevice->rad_info.chip_class < GFX10_3) + return false; + return color_format != V_028C70_COLOR_INVALID && color_swap != ~0U && color_num_format != ~0; @@ -727,7 +733,7 @@ radv_physical_device_get_format_properties(struct radv_physical_device *physical linear &= ~VK_FORMAT_FEATURE_BLIT_SRC_BIT; } } - if (radv_is_colorbuffer_format_supported(format, &blendable)) { + if (radv_is_colorbuffer_format_supported(physical_device, format, &blendable)) { linear |= VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT; tiled |= VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT; if (blendable) { @@ -797,6 +803,9 @@ uint32_t radv_translate_colorformat(VkFormat format) if (format == VK_FORMAT_B10G11R11_UFLOAT_PACK32) /* isn't plain */ return V_028C70_COLOR_10_11_11; + if (format == VK_FORMAT_E5B9G9R9_UFLOAT_PACK32) + return V_028C70_COLOR_5_9_9_9; + if (desc->layout != VK_FORMAT_LAYOUT_PLAIN) return V_028C70_COLOR_INVALID; @@ -930,6 +939,9 @@ unsigned radv_translate_colorswap(VkFormat format, bool do_endian_swap) if (format == VK_FORMAT_B10G11R11_UFLOAT_PACK32) return V_028C70_SWAP_STD; + if (format == VK_FORMAT_E5B9G9R9_UFLOAT_PACK32) + return V_028C70_SWAP_STD; + if (desc->layout != VK_FORMAT_LAYOUT_PLAIN) return ~0U; @@ -991,6 +1003,10 @@ bool radv_format_pack_clear_color(VkFormat format, clear_vals[0] = float3_to_r11g11b10f(value->float32); clear_vals[1] = 0; return true; + } else if (format == VK_FORMAT_E5B9G9R9_UFLOAT_PACK32) { + clear_vals[0] = float3_to_rgb9e5(value->float32); + clear_vals[1] = 0; + return true; } if (desc->layout != VK_FORMAT_LAYOUT_PLAIN) { diff --git a/src/amd/vulkan/radv_image.c b/src/amd/vulkan/radv_image.c index 44793aa1020..27601aabdbe 100644 --- a/src/amd/vulkan/radv_image.c +++ b/src/amd/vulkan/radv_image.c @@ -222,8 +222,8 @@ radv_use_dcc_for_image(struct radv_device *device, /* Determine if the formats are DCC compatible. */ dcc_compatible_formats = - radv_is_colorbuffer_format_supported(format, - &blendable); + radv_is_colorbuffer_format_supported(device->physical_device, + format, &blendable); if (pCreateInfo->flags & VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT) { const struct VkImageFormatListCreateInfo *format_list = diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h index 90012cdf45a..4fcb57c5f5c 100644 --- a/src/amd/vulkan/radv_private.h +++ b/src/amd/vulkan/radv_private.h @@ -1813,7 +1813,8 @@ uint32_t radv_translate_tex_numformat(VkFormat format, bool radv_format_pack_clear_color(VkFormat format, uint32_t clear_vals[2], VkClearColorValue *value); -bool radv_is_colorbuffer_format_supported(VkFormat format, bool *blendable); +bool radv_is_colorbuffer_format_supported(const struct radv_physical_device *pdevice, + VkFormat format, bool *blendable); bool radv_dcc_formats_compatible(VkFormat format1, VkFormat format2); bool radv_device_supports_etc(struct radv_physical_device *physical_device);