From f8e3e893b9d38fa37da08e4afee1a078c0e4e462 Mon Sep 17 00:00:00 2001 From: Ella Stanforth Date: Tue, 6 Jan 2026 16:00:58 +0000 Subject: [PATCH] pvr: handle ycbcr swizzle Reviewed-by: Simon Perretta Part-of: --- src/imagination/vulkan/pvr_arch_image.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/imagination/vulkan/pvr_arch_image.c b/src/imagination/vulkan/pvr_arch_image.c index 5ba025f601d..ea545f40533 100644 --- a/src/imagination/vulkan/pvr_arch_image.c +++ b/src/imagination/vulkan/pvr_arch_image.c @@ -10,6 +10,7 @@ #include #include "vk_log.h" +#include "vk_ycbcr_conversion.h" #include "pvr_buffer.h" #include "pvr_device.h" @@ -108,7 +109,25 @@ VkResult PVR_PER_ARCH(CreateImageView)(VkDevice _device, pvr_adjust_non_compressed_view(image, plane, &info); - vk_component_mapping_to_pipe_swizzle(iview->vk.swizzle, input_swizzle); + if (ycbcr_iview) { + const VkSamplerYcbcrConversionInfo *pConversion = + vk_find_struct_const(pCreateInfo->pNext, + SAMPLER_YCBCR_CONVERSION_INFO); + VK_FROM_HANDLE(vk_ycbcr_conversion, conversion, pConversion->conversion); + assert(conversion); + + /* UV swizzle is handled by chroma swap instead */ + input_swizzle[0] = PIPE_SWIZZLE_X; + input_swizzle[1] = PIPE_SWIZZLE_Y; + input_swizzle[2] = PIPE_SWIZZLE_Z; + input_swizzle[3] = PIPE_SWIZZLE_1; + + if (conversion->state.mapping[3] == VK_COMPONENT_SWIZZLE_ZERO) { + input_swizzle[3] = PIPE_SWIZZLE_0; + } + } else { + vk_component_mapping_to_pipe_swizzle(iview->vk.swizzle, input_swizzle); + } enum pipe_format pipe_format = vk_format_to_pipe_format(iview->vk.view_format);