radv: support minmax filter for more formats
Support should be the same as AMDVLK, except for these formats: - VK_FORMAT_R4G4_UNORM_PACK8 - VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT - VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT - VK_FORMAT_A1B5G5R5_UNORM_PACK16_KHR - VK_FORMAT_A8_UNORM_KHR - VK_FORMAT_X8_D24_UNORM_PACK32 - VK_FORMAT_D24_UNORM_S8_UINT And the various emulated compressed formats. Signed-off-by: Rhys Perry <pendingchaos02@gmail.com> Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/27551>
This commit is contained in:
@@ -588,23 +588,55 @@ radv_is_zs_format_supported(VkFormat format)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
radv_is_filter_minmax_format_supported(VkFormat format)
|
radv_is_filter_minmax_format_supported(const struct radv_physical_device *pdevice, VkFormat format)
|
||||||
{
|
{
|
||||||
/* From the Vulkan spec 1.1.71:
|
enum amd_gfx_level gfx_level = pdevice->rad_info.gfx_level;
|
||||||
*
|
|
||||||
* "The following formats must support the
|
|
||||||
* VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_MINMAX_BIT feature with
|
|
||||||
* VK_IMAGE_TILING_OPTIMAL, if they support
|
|
||||||
* VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_BIT."
|
|
||||||
*/
|
|
||||||
/* TODO: enable more formats. */
|
|
||||||
switch (format) {
|
switch (format) {
|
||||||
|
case VK_FORMAT_R4G4_UNORM_PACK8:
|
||||||
|
case VK_FORMAT_R4G4B4A4_UNORM_PACK16:
|
||||||
|
case VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT:
|
||||||
|
case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
|
||||||
|
case VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT:
|
||||||
|
case VK_FORMAT_R5G6B5_UNORM_PACK16:
|
||||||
|
case VK_FORMAT_B5G6R5_UNORM_PACK16:
|
||||||
|
case VK_FORMAT_R5G5B5A1_UNORM_PACK16:
|
||||||
|
case VK_FORMAT_B5G5R5A1_UNORM_PACK16:
|
||||||
|
case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
|
||||||
|
case VK_FORMAT_A1B5G5R5_UNORM_PACK16_KHR:
|
||||||
case VK_FORMAT_R8_UNORM:
|
case VK_FORMAT_R8_UNORM:
|
||||||
|
case VK_FORMAT_A8_UNORM_KHR:
|
||||||
case VK_FORMAT_R8_SNORM:
|
case VK_FORMAT_R8_SNORM:
|
||||||
|
case VK_FORMAT_R8_SRGB:
|
||||||
|
case VK_FORMAT_R8G8_UNORM:
|
||||||
|
case VK_FORMAT_R8G8_SNORM:
|
||||||
|
case VK_FORMAT_R8G8_SRGB:
|
||||||
|
case VK_FORMAT_R8G8B8A8_UNORM:
|
||||||
|
case VK_FORMAT_R8G8B8A8_SNORM:
|
||||||
|
case VK_FORMAT_R8G8B8A8_SRGB:
|
||||||
|
case VK_FORMAT_B8G8R8A8_UNORM:
|
||||||
|
case VK_FORMAT_B8G8R8A8_SNORM:
|
||||||
|
case VK_FORMAT_B8G8R8A8_SRGB:
|
||||||
|
case VK_FORMAT_A8B8G8R8_UNORM_PACK32:
|
||||||
|
case VK_FORMAT_A8B8G8R8_SNORM_PACK32:
|
||||||
|
case VK_FORMAT_A8B8G8R8_SRGB_PACK32:
|
||||||
|
case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
|
||||||
|
case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
|
||||||
case VK_FORMAT_R16_UNORM:
|
case VK_FORMAT_R16_UNORM:
|
||||||
case VK_FORMAT_R16_SNORM:
|
case VK_FORMAT_R16_SNORM:
|
||||||
case VK_FORMAT_R16_SFLOAT:
|
case VK_FORMAT_R16_SFLOAT:
|
||||||
|
case VK_FORMAT_R16G16_UNORM:
|
||||||
|
case VK_FORMAT_R16G16_SNORM:
|
||||||
|
case VK_FORMAT_R16G16_SFLOAT:
|
||||||
|
case VK_FORMAT_R16G16B16A16_UNORM:
|
||||||
|
case VK_FORMAT_R16G16B16A16_SNORM:
|
||||||
|
case VK_FORMAT_R16G16B16A16_SFLOAT:
|
||||||
case VK_FORMAT_R32_SFLOAT:
|
case VK_FORMAT_R32_SFLOAT:
|
||||||
|
case VK_FORMAT_R32G32_SFLOAT:
|
||||||
|
case VK_FORMAT_R32G32B32_SFLOAT:
|
||||||
|
case VK_FORMAT_R32G32B32A32_SFLOAT:
|
||||||
|
case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
|
||||||
|
case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:
|
||||||
case VK_FORMAT_D16_UNORM:
|
case VK_FORMAT_D16_UNORM:
|
||||||
case VK_FORMAT_X8_D24_UNORM_PACK32:
|
case VK_FORMAT_X8_D24_UNORM_PACK32:
|
||||||
case VK_FORMAT_D32_SFLOAT:
|
case VK_FORMAT_D32_SFLOAT:
|
||||||
@@ -612,6 +644,34 @@ radv_is_filter_minmax_format_supported(VkFormat format)
|
|||||||
case VK_FORMAT_D24_UNORM_S8_UINT:
|
case VK_FORMAT_D24_UNORM_S8_UINT:
|
||||||
case VK_FORMAT_D32_SFLOAT_S8_UINT:
|
case VK_FORMAT_D32_SFLOAT_S8_UINT:
|
||||||
return true;
|
return true;
|
||||||
|
case VK_FORMAT_R8_UINT:
|
||||||
|
case VK_FORMAT_R8_SINT:
|
||||||
|
case VK_FORMAT_R8G8_UINT:
|
||||||
|
case VK_FORMAT_R8G8_SINT:
|
||||||
|
case VK_FORMAT_R8G8B8A8_UINT:
|
||||||
|
case VK_FORMAT_R8G8B8A8_SINT:
|
||||||
|
case VK_FORMAT_B8G8R8A8_UINT:
|
||||||
|
case VK_FORMAT_B8G8R8A8_SINT:
|
||||||
|
case VK_FORMAT_A8B8G8R8_UINT_PACK32:
|
||||||
|
case VK_FORMAT_A8B8G8R8_SINT_PACK32:
|
||||||
|
case VK_FORMAT_A2R10G10B10_UINT_PACK32:
|
||||||
|
case VK_FORMAT_A2B10G10R10_UINT_PACK32:
|
||||||
|
case VK_FORMAT_R16_UINT:
|
||||||
|
case VK_FORMAT_R16_SINT:
|
||||||
|
case VK_FORMAT_R16G16_UINT:
|
||||||
|
case VK_FORMAT_R16G16_SINT:
|
||||||
|
case VK_FORMAT_R16G16B16A16_UINT:
|
||||||
|
case VK_FORMAT_R16G16B16A16_SINT:
|
||||||
|
case VK_FORMAT_R32_UINT:
|
||||||
|
case VK_FORMAT_R32_SINT:
|
||||||
|
case VK_FORMAT_R32G32_UINT:
|
||||||
|
case VK_FORMAT_R32G32_SINT:
|
||||||
|
case VK_FORMAT_R32G32B32_UINT:
|
||||||
|
case VK_FORMAT_R32G32B32_SINT:
|
||||||
|
case VK_FORMAT_R32G32B32A32_UINT:
|
||||||
|
case VK_FORMAT_R32G32B32A32_SINT:
|
||||||
|
case VK_FORMAT_S8_UINT:
|
||||||
|
return gfx_level >= GFX9;
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -659,6 +719,13 @@ radv_physical_device_get_format_properties(struct radv_physical_device *physical
|
|||||||
tiled = VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_LINEAR_BIT |
|
tiled = VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_LINEAR_BIT |
|
||||||
VK_FORMAT_FEATURE_2_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_2_TRANSFER_DST_BIT |
|
VK_FORMAT_FEATURE_2_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_2_TRANSFER_DST_BIT |
|
||||||
VK_FORMAT_FEATURE_2_BLIT_SRC_BIT;
|
VK_FORMAT_FEATURE_2_BLIT_SRC_BIT;
|
||||||
|
|
||||||
|
VkFormat emulation_format = vk_texcompress_etc2_emulation_format(format);
|
||||||
|
if (emulation_format == VK_FORMAT_UNDEFINED)
|
||||||
|
emulation_format = vk_texcompress_astc_emulation_format(format);
|
||||||
|
|
||||||
|
if (radv_is_filter_minmax_format_supported(physical_device, emulation_format))
|
||||||
|
tiled |= VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_MINMAX_BIT;
|
||||||
}
|
}
|
||||||
out_properties->linearTilingFeatures = linear;
|
out_properties->linearTilingFeatures = linear;
|
||||||
out_properties->optimalTilingFeatures = tiled;
|
out_properties->optimalTilingFeatures = tiled;
|
||||||
@@ -719,7 +786,7 @@ radv_physical_device_get_format_properties(struct radv_physical_device *physical
|
|||||||
tiled |= VK_FORMAT_FEATURE_2_BLIT_SRC_BIT | VK_FORMAT_FEATURE_2_BLIT_DST_BIT;
|
tiled |= VK_FORMAT_FEATURE_2_BLIT_SRC_BIT | VK_FORMAT_FEATURE_2_BLIT_DST_BIT;
|
||||||
tiled |= VK_FORMAT_FEATURE_2_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_2_TRANSFER_DST_BIT;
|
tiled |= VK_FORMAT_FEATURE_2_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_2_TRANSFER_DST_BIT;
|
||||||
|
|
||||||
if (radv_is_filter_minmax_format_supported(format))
|
if (radv_is_filter_minmax_format_supported(physical_device, format))
|
||||||
tiled |= VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_MINMAX_BIT;
|
tiled |= VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_MINMAX_BIT;
|
||||||
|
|
||||||
if (vk_format_has_depth(format)) {
|
if (vk_format_has_depth(format)) {
|
||||||
@@ -740,18 +807,21 @@ radv_physical_device_get_format_properties(struct radv_physical_device *physical
|
|||||||
linear |= VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_2_BLIT_SRC_BIT;
|
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;
|
tiled |= VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_2_BLIT_SRC_BIT;
|
||||||
|
|
||||||
if (radv_is_filter_minmax_format_supported(format))
|
if (radv_is_filter_minmax_format_supported(physical_device, format)) {
|
||||||
tiled |= VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_MINMAX_BIT;
|
tiled |= VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_MINMAX_BIT;
|
||||||
|
linear |= VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_MINMAX_BIT;
|
||||||
|
}
|
||||||
|
|
||||||
if (linear_sampling) {
|
if (linear_sampling) {
|
||||||
linear |= VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_LINEAR_BIT;
|
linear |= VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_LINEAR_BIT;
|
||||||
tiled |= VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_LINEAR_BIT;
|
tiled |= VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_LINEAR_BIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Don't support blitting for R32G32B32 formats. */
|
/* Don't support blitting/minmax for R32G32B32 formats. */
|
||||||
if (format == VK_FORMAT_R32G32B32_SFLOAT || format == VK_FORMAT_R32G32B32_UINT ||
|
if (format == VK_FORMAT_R32G32B32_SFLOAT || format == VK_FORMAT_R32G32B32_UINT ||
|
||||||
format == VK_FORMAT_R32G32B32_SINT) {
|
format == VK_FORMAT_R32G32B32_SINT) {
|
||||||
linear &= ~VK_FORMAT_FEATURE_2_BLIT_SRC_BIT;
|
linear &= ~VK_FORMAT_FEATURE_2_BLIT_SRC_BIT;
|
||||||
|
linear &= ~VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_MINMAX_BIT;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (radv_is_colorbuffer_format_supported(physical_device, format, &blendable) && desc->channel[0].size != 64) {
|
if (radv_is_colorbuffer_format_supported(physical_device, format, &blendable) && desc->channel[0].size != 64) {
|
||||||
|
Reference in New Issue
Block a user