From bbbf037303a543fd2bb926f94213c01569341519 Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Mon, 27 Oct 2025 11:29:10 -0400 Subject: [PATCH] vulkan/meta: Handle VkResolveImageModeInfoKHR This contains resolve modes which override the format-based defaults as well as resolve flags to allow disabling sRGB conversion. Reviewed-by: Mel Henning Part-of: --- src/vulkan/runtime/vk_meta_blit_resolve.c | 25 ++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/src/vulkan/runtime/vk_meta_blit_resolve.c b/src/vulkan/runtime/vk_meta_blit_resolve.c index d676bdad7cf..ca49fcb22ef 100644 --- a/src/vulkan/runtime/vk_meta_blit_resolve.c +++ b/src/vulkan/runtime/vk_meta_blit_resolve.c @@ -884,16 +884,35 @@ vk_meta_resolve_image2(struct vk_command_buffer *cmd, VK_FROM_HANDLE(vk_image, src_image, resolve->srcImage); VK_FROM_HANDLE(vk_image, dst_image, resolve->dstImage); + /* Color resolve default to be based on the format */ VkResolveModeFlagBits resolve_mode = VK_RESOLVE_MODE_SAMPLE_ZERO_BIT; if (vk_format_is_color(src_image->format) && !vk_format_is_int(src_image->format)) resolve_mode = VK_RESOLVE_MODE_AVERAGE_BIT; + VkResolveImageFlagBitsKHR resolve_flags = 0; + VkResolveModeFlagBits stencil_resolve_mode = VK_RESOLVE_MODE_SAMPLE_ZERO_BIT; + + const VkResolveImageModeInfoKHR *mode_info = + vk_find_struct_const(resolve->pNext, RESOLVE_IMAGE_MODE_INFO_KHR); + if (mode_info != NULL) { + resolve_flags = mode_info->flags; + resolve_mode = mode_info->resolveMode; + stencil_resolve_mode = mode_info->stencilResolveMode; + } + + VkFormat src_format = src_image->format; + VkFormat dst_format = dst_image->format; + if (resolve_flags & VK_RESOLVE_IMAGE_SKIP_TRANSFER_FUNCTION_BIT_KHR) { + src_format = vk_format_srgb_to_linear(src_format); + dst_format = vk_format_srgb_to_linear(dst_format); + } + vk_meta_resolve_image(cmd, meta, - src_image, src_image->format, resolve->srcImageLayout, - dst_image, dst_image->format, resolve->dstImageLayout, + src_image, src_format, resolve->srcImageLayout, + dst_image, dst_format, resolve->dstImageLayout, resolve->regionCount, resolve->pRegions, - resolve_mode, VK_RESOLVE_MODE_SAMPLE_ZERO_BIT); + resolve_mode, stencil_resolve_mode); } static void