Mesa (master): radv: Add ycbcr format features.

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Apr 25 20:08:16 UTC 2019


Module: Mesa
Branch: master
Commit: 52c1adda21bb9b1dfb06934279866014accd09d1
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=52c1adda21bb9b1dfb06934279866014accd09d1

Author: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
Date:   Mon Jul 30 15:45:03 2018 +0200

radv: Add ycbcr format features.

Reviewed-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>

---

 src/amd/vulkan/radv_formats.c | 27 +++++++++++++++++++++++++++
 1 file changed, 27 insertions(+)

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:




More information about the mesa-commit mailing list