From 5eeac2118148190ae1fd591adeca2b36f0121738 Mon Sep 17 00:00:00 2001 From: Ella Stanforth Date: Fri, 9 Jan 2026 11:31:18 +0000 Subject: [PATCH] pvr: add ycbcr formats Reviewed-by: Simon Perretta Part-of: --- src/imagination/vulkan/pvr_arch_formats.c | 11 +++++++++++ src/imagination/vulkan/pvr_formats.c | 23 +++++++++++++++++++++-- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/imagination/vulkan/pvr_arch_formats.c b/src/imagination/vulkan/pvr_arch_formats.c index 37df14c3e5c..001aa4481b0 100644 --- a/src/imagination/vulkan/pvr_arch_formats.c +++ b/src/imagination/vulkan/pvr_arch_formats.c @@ -59,6 +59,14 @@ .bind = FLAGS_##bind_, \ } +#define FORMAT_YCBCR(vk, tex_fmt) \ + [PIPE_FORMAT_##vk] = { \ + .tex_format = ROGUE_TEXSTATE_FORMAT_##tex_fmt, \ + .depth_tex_format = ROGUE_TEXSTATE_FORMAT_INVALID, \ + .stencil_tex_format = ROGUE_TEXSTATE_FORMAT_INVALID, \ + .bind = FLAGS__T__, \ + } + #define FORMAT_COMPRESSED(vk, tex_fmt) \ [PIPE_FORMAT_##vk] = { \ .tex_format = ROGUE_TEXSTATE_FORMAT_COMPRESSED_##tex_fmt, \ @@ -157,9 +165,12 @@ static const struct pvr_format pvr_format_table[] = { FORMAT_COMPRESSED(ETC2_R11_SNORM, EAC_R11_SIGNED), FORMAT_COMPRESSED(ETC2_RG11_UNORM, EAC_RG11_UNSIGNED), FORMAT_COMPRESSED(ETC2_RG11_SNORM, EAC_RG11_SIGNED), + FORMAT_YCBCR(G8_B8R8_420_UNORM, YVU420_2PLANE), + FORMAT_YCBCR(G8_B8_R8_420_UNORM, YUV420_3PLANE), }; /* clang-format on */ +#undef FORMAT_YCBCR #undef FORMAT #undef FORMAT_DEPTH_STENCIL #undef FORMAT_COMPRESSED diff --git a/src/imagination/vulkan/pvr_formats.c b/src/imagination/vulkan/pvr_formats.c index 661ae11cb86..bee05906c1e 100644 --- a/src/imagination/vulkan/pvr_formats.c +++ b/src/imagination/vulkan/pvr_formats.c @@ -257,6 +257,9 @@ pvr_get_image_format_features2(struct pvr_physical_device *pdevice, assert(pvr_format->bind != 0); + const struct vk_format_ycbcr_info *ycbcr_info = + vk_format_get_ycbcr_info(vk_format); + if (pvr_format->bind & PVR_BIND_SAMPLER_VIEW) { if (vk_tiling == VK_IMAGE_TILING_OPTIMAL) { const uint32_t first_component_size = @@ -265,7 +268,6 @@ pvr_get_image_format_features2(struct pvr_physical_device *pdevice, 0); flags |= VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_BIT | - VK_FORMAT_FEATURE_2_BLIT_SRC_BIT | VK_FORMAT_FEATURE_2_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_2_TRANSFER_DST_BIT; @@ -275,11 +277,22 @@ pvr_get_image_format_features2(struct pvr_physical_device *pdevice, vk_format_is_block_compressed(vk_format))) { flags |= VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_LINEAR_BIT; } + + if (ycbcr_info) { + flags |= VK_FORMAT_FEATURE_2_COSITED_CHROMA_SAMPLES_BIT; + } else { + flags |= VK_FORMAT_FEATURE_2_BLIT_SRC_BIT; + } } else if (!vk_format_is_block_compressed(vk_format)) { flags |= VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_BIT | - VK_FORMAT_FEATURE_2_BLIT_SRC_BIT | VK_FORMAT_FEATURE_2_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_2_TRANSFER_DST_BIT; + + if (ycbcr_info) { + flags |= VK_FORMAT_FEATURE_2_COSITED_CHROMA_SAMPLES_BIT; + } else { + flags |= VK_FORMAT_FEATURE_2_BLIT_SRC_BIT; + } } } @@ -741,6 +754,12 @@ VkResult pvr_GetPhysicalDeviceImageFormatProperties2( case VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES: external_props = (void *)ext; break; + case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES: { + VkSamplerYcbcrConversionImageFormatProperties *ycbcr_props = + (void *)ext; + ycbcr_props->combinedImageSamplerDescriptorCount = 1; + break; + } default: vk_debug_ignored_stype(ext->sType); break;