From: Bas Nieuwenhuizen Date: Mon, 30 Jul 2018 13:45:03 +0000 (+0200) Subject: radv: Add ycbcr format features. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=52c1adda21bb9b1dfb06934279866014accd09d1;p=mesa.git radv: Add ycbcr format features. Reviewed-by: Samuel Pitoiset --- diff --git a/src/amd/vulkan/radv_formats.c b/src/amd/vulkan/radv_formats.c index 8095128e17a..74c39dc66c4 100644 --- a/src/amd/vulkan/radv_formats.c +++ b/src/amd/vulkan/radv_formats.c @@ -650,6 +650,25 @@ radv_physical_device_get_format_properties(struct radv_physical_device *physical return; } + if (desc->layout == VK_FORMAT_LAYOUT_MULTIPLANE || + desc->layout == VK_FORMAT_LAYOUT_SUBSAMPLED) { + uint32_t tiling = VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | + VK_FORMAT_FEATURE_TRANSFER_DST_BIT | + VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | + VK_FORMAT_FEATURE_MIDPOINT_CHROMA_SAMPLES_BIT; + + /* The subsampled formats have no support for linear filters. */ + if (desc->layout != VK_FORMAT_LAYOUT_SUBSAMPLED) { + tiling |= VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT; + } + + /* Fails for unknown reasons with linear tiling & subsampled formats. */ + out_properties->linearTilingFeatures = desc->layout == VK_FORMAT_LAYOUT_SUBSAMPLED ? 0 : tiling; + out_properties->optimalTilingFeatures = tiling; + out_properties->bufferFeatures = 0; + return; + } + if (radv_is_storage_image_format_supported(physical_device, format)) { tiled |= VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; linear |= VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; @@ -1289,6 +1308,7 @@ VkResult radv_GetPhysicalDeviceImageFormatProperties2( RADV_FROM_HANDLE(radv_physical_device, physical_device, physicalDevice); const VkPhysicalDeviceExternalImageFormatInfo *external_info = NULL; VkExternalImageFormatProperties *external_props = NULL; + VkSamplerYcbcrConversionImageFormatProperties *ycbcr_props = NULL; VkResult result; result = radv_get_image_format_properties(physical_device, base_info, @@ -1313,6 +1333,9 @@ VkResult radv_GetPhysicalDeviceImageFormatProperties2( case VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES: external_props = (void *) s; break; + case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES: + ycbcr_props = (void *) s; + break; default: break; } @@ -1347,6 +1370,10 @@ VkResult radv_GetPhysicalDeviceImageFormatProperties2( } } + if (ycbcr_props) { + ycbcr_props->combinedImageSamplerDescriptorCount = vk_format_get_plane_count(base_info->format); + } + return VK_SUCCESS; fail: