diff --git a/src/vulkan/runtime/vk_meta_blit_resolve.c b/src/vulkan/runtime/vk_meta_blit_resolve.c index a7022bc7348..d676bdad7cf 100644 --- a/src/vulkan/runtime/vk_meta_blit_resolve.c +++ b/src/vulkan/runtime/vk_meta_blit_resolve.c @@ -27,6 +27,7 @@ #include "vk_device.h" #include "vk_format.h" #include "vk_pipeline.h" +#include "vk_render_pass.h" #include "nir_builder.h" @@ -903,6 +904,7 @@ vk_meta_resolve_attachment(struct vk_command_buffer *cmd, struct vk_image_view *dst_view, VkImageLayout dst_image_layout, VkImageAspectFlags resolve_aspects, + VkRenderingAttachmentFlagsKHR att_flags, VkResolveModeFlagBits resolve_mode, VkResolveModeFlagBits stencil_resolve_mode, VkRect2D area, uint32_t layer_count, @@ -923,6 +925,13 @@ vk_meta_resolve_attachment(struct vk_command_buffer *cmd, .extent = { area.extent.width, area.extent.height, 1}, }; + VkFormat src_format = src_view->format; + VkFormat dst_format = dst_view->format; + if (att_flags & VK_RENDERING_ATTACHMENT_RESOLVE_SKIP_TRANSFER_FUNCTION_BIT_KHR) { + src_format = vk_format_srgb_to_linear(src_format); + dst_format = vk_format_srgb_to_linear(dst_format); + } + if (view_mask) { u_foreach_bit(v, view_mask) { region.srcSubresource.baseArrayLayer = src_view->base_array_layer + v; @@ -931,10 +940,8 @@ vk_meta_resolve_attachment(struct vk_command_buffer *cmd, region.dstSubresource.layerCount = 1; vk_meta_resolve_image(cmd, meta, - src_view->image, src_view->format, - src_image_layout, - dst_view->image, dst_view->format, - dst_image_layout, + src_view->image, src_format, src_image_layout, + dst_view->image, dst_format, dst_image_layout, 1, ®ion, resolve_mode, stencil_resolve_mode); } } else { @@ -944,10 +951,8 @@ vk_meta_resolve_attachment(struct vk_command_buffer *cmd, region.dstSubresource.layerCount = layer_count; vk_meta_resolve_image(cmd, meta, - src_view->image, src_view->format, - src_image_layout, - dst_view->image, dst_view->format, - dst_image_layout, + src_view->image, src_format, src_image_layout, + dst_view->image, dst_format, dst_image_layout, 1, ®ion, resolve_mode, stencil_resolve_mode); } } @@ -969,6 +974,7 @@ vk_meta_resolve_rendering(struct vk_command_buffer *cmd, vk_meta_resolve_attachment(cmd, meta, view, att->imageLayout, res_view, att->resolveImageLayout, VK_IMAGE_ASPECT_COLOR_BIT, + vk_get_rendering_attachment_flags(att), att->resolveMode, VK_RESOLVE_MODE_NONE, pRenderingInfo->renderArea, pRenderingInfo->layerCount, @@ -994,6 +1000,7 @@ vk_meta_resolve_rendering(struct vk_command_buffer *cmd, res_view, d_att->resolveImageLayout, VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT, + 0, /* Flags don't affect Z/S resolves */ d_att->resolveMode, s_att->resolveMode, pRenderingInfo->renderArea, pRenderingInfo->layerCount, @@ -1006,6 +1013,7 @@ vk_meta_resolve_rendering(struct vk_command_buffer *cmd, vk_meta_resolve_attachment(cmd, meta, view, d_att->imageLayout, res_view, d_att->resolveImageLayout, VK_IMAGE_ASPECT_DEPTH_BIT, + 0, /* Flags don't affect Z/S resolves */ d_att->resolveMode, VK_RESOLVE_MODE_NONE, pRenderingInfo->renderArea, pRenderingInfo->layerCount, @@ -1019,6 +1027,7 @@ vk_meta_resolve_rendering(struct vk_command_buffer *cmd, vk_meta_resolve_attachment(cmd, meta, view, s_att->imageLayout, res_view, s_att->resolveImageLayout, VK_IMAGE_ASPECT_STENCIL_BIT, + 0, /* Flags don't affect Z/S resolves */ VK_RESOLVE_MODE_NONE, s_att->resolveMode, pRenderingInfo->renderArea, pRenderingInfo->layerCount, diff --git a/src/vulkan/runtime/vk_render_pass.c b/src/vulkan/runtime/vk_render_pass.c index 16444ca0f4f..c66c239582d 100644 --- a/src/vulkan/runtime/vk_render_pass.c +++ b/src/vulkan/runtime/vk_render_pass.c @@ -1033,6 +1033,15 @@ vk_get_command_buffer_inheritance_rendering_info( COMMAND_BUFFER_INHERITANCE_RENDERING_INFO); } +VkRenderingAttachmentFlagsKHR +vk_get_rendering_attachment_flags(const VkRenderingAttachmentInfo *att) +{ + const VkRenderingAttachmentFlagsInfoKHR *flags_info = + vk_find_struct_const(att->pNext, RENDERING_ATTACHMENT_FLAGS_INFO_KHR); + + return flags_info != NULL ? flags_info->flags : 0; +} + static VkRenderingAttachmentFlagBitsKHR vk_attachment_description_flags_to_rendering_flags(VkAttachmentDescriptionFlags flags) { diff --git a/src/vulkan/runtime/vk_render_pass.h b/src/vulkan/runtime/vk_render_pass.h index cfe62f2ca5d..302a9606ebc 100644 --- a/src/vulkan/runtime/vk_render_pass.h +++ b/src/vulkan/runtime/vk_render_pass.h @@ -382,6 +382,9 @@ vk_get_command_buffer_inheritance_rendering_info( VkCommandBufferLevel level, const VkCommandBufferBeginInfo *pBeginInfo); +VkRenderingAttachmentFlagsKHR +vk_get_rendering_attachment_flags(const VkRenderingAttachmentInfo *att); + struct vk_gcbiarr_data { VkRenderingInfo rendering; VkRenderingFragmentShadingRateAttachmentInfoKHR fsr_att;