Implement Y′CbCr conversion

As specified in https://www.khronos.org/registry/DataFormat/specs/1.2/dataformat.1.2.html

Bug: b/132437008
Change-Id: I730a9eb74796c625d3e635a66b18661c73f7c01f
Tests: dEQP-VK.*ycbcr*
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/31618
Presubmit-Ready: Nicolas Capens <nicolascapens@google.com>
Tested-by: Nicolas Capens <nicolascapens@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
diff --git a/src/Pipeline/SpirvShaderSampling.cpp b/src/Pipeline/SpirvShaderSampling.cpp
index 0d0e373..0c76457 100644
--- a/src/Pipeline/SpirvShaderSampling.cpp
+++ b/src/Pipeline/SpirvShaderSampling.cpp
@@ -96,6 +96,13 @@
 	                            (imageDescriptor->extent.height > SHRT_MAX) ||
 	                            (imageDescriptor->extent.depth  > SHRT_MAX);
 
+	if(sampler->ycbcrConversion)
+	{
+		samplerState.ycbcrModel = sampler->ycbcrConversion->ycbcrModel;
+		samplerState.studioSwing = (sampler->ycbcrConversion->ycbcrRange == VK_SAMPLER_YCBCR_RANGE_ITU_NARROW);
+		samplerState.swappedChroma = (sampler->ycbcrConversion->components.r != VK_COMPONENT_SWIZZLE_R);
+	}
+
 	if(sampler->anisotropyEnable != VK_FALSE)
 	{
 		UNSUPPORTED("anisotropyEnable");
@@ -238,6 +245,11 @@
 
 sw::MipmapType SpirvShader::convertMipmapMode(const vk::Sampler *sampler)
 {
+	if(sampler->ycbcrConversion)
+	{
+		return MIPMAP_NONE;  // YCbCr images can only have one mipmap level.
+	}
+
 	switch(sampler->mipmapMode)
 	{
 	case VK_SAMPLER_MIPMAP_MODE_NEAREST: return MIPMAP_POINT;