radv: Add VK_FORMAT_E5B9G9R9_UFLOAT_PACK32 rendering support.

Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6831>
This commit is contained in:
Bas Nieuwenhuizen 2020-09-23 02:37:19 +02:00 committed by Marge Bot
parent 43735c06df
commit e893102bcf
4 changed files with 26 additions and 5 deletions

View File

@ -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;
}
}

View File

@ -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) {

View File

@ -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 =

View File

@ -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);