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;