From d3e716f1fba210447dad5516691a6c389ed098eb Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Thu, 9 Oct 2025 15:53:46 +0200 Subject: [PATCH] radv/meta: re-use radv_meta_resolve_{fragment,hardware}_image() for subpass resolves Similar to compute. Signed-off-by: Samuel Pitoiset Part-of: --- src/amd/vulkan/meta/radv_meta.h | 2 +- src/amd/vulkan/meta/radv_meta_resolve.c | 77 ++-------------------- src/amd/vulkan/meta/radv_meta_resolve_fs.c | 52 ++------------- 3 files changed, 13 insertions(+), 118 deletions(-) diff --git a/src/amd/vulkan/meta/radv_meta.h b/src/amd/vulkan/meta/radv_meta.h index a19483a725a..2c5f47f5e26 100644 --- a/src/amd/vulkan/meta/radv_meta.h +++ b/src/amd/vulkan/meta/radv_meta.h @@ -285,7 +285,7 @@ void radv_meta_resolve_depth_stencil_cs(struct radv_cmd_buffer *cmd_buffer, stru void radv_cmd_buffer_resolve_rendering_fs(struct radv_cmd_buffer *cmd_buffer, struct radv_image_view *src_iview, VkImageLayout src_layout, struct radv_image_view *dst_iview, - VkImageLayout dst_layout); + VkImageLayout dst_layout, const VkImageResolve2 *region); void radv_meta_resolve_depth_stencil_fs(struct radv_cmd_buffer *cmd_buffer, struct radv_image *src_image, VkFormat src_format, VkImageLayout src_image_layout, diff --git a/src/amd/vulkan/meta/radv_meta_resolve.c b/src/amd/vulkan/meta/radv_meta_resolve.c index d5260b53937..1736682aaff 100644 --- a/src/amd/vulkan/meta/radv_meta_resolve.c +++ b/src/amd/vulkan/meta/radv_meta_resolve.c @@ -236,7 +236,7 @@ radv_meta_resolve_hardware_image(struct radv_cmd_buffer *cmd_buffer, struct radv struct radv_device *device = radv_cmd_buffer_device(cmd_buffer); struct radv_meta_saved_state saved_state; - radv_meta_save(&saved_state, cmd_buffer, RADV_META_SAVE_GRAPHICS_PIPELINE); + radv_meta_save(&saved_state, cmd_buffer, RADV_META_SAVE_GRAPHICS_PIPELINE | RADV_META_SAVE_RENDER); assert(src_image->vk.samples > 1); assert(dst_image->vk.samples == 1); @@ -444,75 +444,10 @@ radv_CmdResolveImage2(VkCommandBuffer commandBuffer, const VkResolveImageInfo2 * static void radv_cmd_buffer_resolve_rendering_hw(struct radv_cmd_buffer *cmd_buffer, struct radv_image_view *src_iview, VkImageLayout src_layout, struct radv_image_view *dst_iview, - VkImageLayout dst_layout) + VkImageLayout dst_layout, const VkImageResolve2 *region) { - struct radv_device *device = radv_cmd_buffer_device(cmd_buffer); - struct radv_meta_saved_state saved_state; - - radv_meta_save(&saved_state, cmd_buffer, RADV_META_SAVE_GRAPHICS_PIPELINE | RADV_META_SAVE_RENDER); - - VkRect2D *resolve_area = &saved_state.render.area; - - radv_CmdSetViewport(radv_cmd_buffer_to_handle(cmd_buffer), 0, 1, - &(VkViewport){.x = resolve_area->offset.x, - .y = resolve_area->offset.y, - .width = resolve_area->extent.width, - .height = resolve_area->extent.height, - .minDepth = 0.0f, - .maxDepth = 1.0f}); - - radv_CmdSetScissor(radv_cmd_buffer_to_handle(cmd_buffer), 0, 1, resolve_area); - - struct radv_image *src_img = src_iview->image; - struct radv_image *dst_img = dst_iview->image; - uint32_t queue_mask = radv_image_queue_family_mask(dst_img, cmd_buffer->qf, cmd_buffer->qf); - - if (radv_layout_dcc_compressed(device, dst_img, dst_iview->vk.base_mip_level, dst_layout, queue_mask)) { - VkImageSubresourceRange range = { - .aspectMask = dst_iview->vk.aspects, - .baseMipLevel = dst_iview->vk.base_mip_level, - .levelCount = 1, - .baseArrayLayer = 0, - .layerCount = 1, - }; - - cmd_buffer->state.flush_bits |= radv_init_dcc(cmd_buffer, dst_img, &range, 0xffffffff); - } - - const VkRenderingAttachmentInfo color_atts[2] = { - { - .sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO, - .imageView = radv_image_view_to_handle(src_iview), - .imageLayout = src_layout, - .loadOp = VK_ATTACHMENT_LOAD_OP_LOAD, - .storeOp = VK_ATTACHMENT_STORE_OP_STORE, - }, - { - .sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO, - .imageView = radv_image_view_to_handle(dst_iview), - .imageLayout = dst_layout, - .loadOp = VK_ATTACHMENT_LOAD_OP_LOAD, - .storeOp = VK_ATTACHMENT_STORE_OP_STORE, - }, - }; - - const VkRenderingInfo rendering_info = { - .sType = VK_STRUCTURE_TYPE_RENDERING_INFO, - .flags = VK_RENDERING_INPUT_ATTACHMENT_NO_CONCURRENT_WRITES_BIT_MESA, - .renderArea = saved_state.render.area, - .layerCount = 1, - .viewMask = saved_state.render.view_mask, - .colorAttachmentCount = 2, - .pColorAttachments = color_atts, - }; - - radv_CmdBeginRendering(radv_cmd_buffer_to_handle(cmd_buffer), &rendering_info); - - emit_resolve(cmd_buffer, src_img, dst_img, dst_iview->vk.format); - - radv_CmdEndRendering(radv_cmd_buffer_to_handle(cmd_buffer)); - - radv_meta_restore(&saved_state, cmd_buffer); + radv_meta_resolve_hardware_image(cmd_buffer, src_iview->image, src_iview->vk.format, src_layout, dst_iview->image, + dst_iview->vk.format, dst_layout, region); } /** @@ -690,7 +625,7 @@ radv_cmd_buffer_resolve_rendering(struct radv_cmd_buffer *cmd_buffer) switch (resolve_method) { case RESOLVE_HW: - radv_cmd_buffer_resolve_rendering_hw(cmd_buffer, src_iview, src_layout, dst_iview, dst_layout); + radv_cmd_buffer_resolve_rendering_hw(cmd_buffer, src_iview, src_layout, dst_iview, dst_layout, ®ion); break; case RESOLVE_COMPUTE: radv_decompress_resolve_src(cmd_buffer, src_iview->image, src_layout, ®ion); @@ -700,7 +635,7 @@ radv_cmd_buffer_resolve_rendering(struct radv_cmd_buffer *cmd_buffer) case RESOLVE_FRAGMENT: radv_decompress_resolve_src(cmd_buffer, src_iview->image, src_layout, ®ion); - radv_cmd_buffer_resolve_rendering_fs(cmd_buffer, src_iview, src_layout, dst_iview, dst_layout); + radv_cmd_buffer_resolve_rendering_fs(cmd_buffer, src_iview, src_layout, dst_iview, dst_layout, ®ion); break; default: UNREACHABLE("Invalid resolve method"); diff --git a/src/amd/vulkan/meta/radv_meta_resolve_fs.c b/src/amd/vulkan/meta/radv_meta_resolve_fs.c index b830053e5bf..856d6030b0f 100644 --- a/src/amd/vulkan/meta/radv_meta_resolve_fs.c +++ b/src/amd/vulkan/meta/radv_meta_resolve_fs.c @@ -438,8 +438,9 @@ radv_meta_resolve_fragment_image(struct radv_cmd_buffer *cmd_buffer, struct radv struct radv_device *device = radv_cmd_buffer_device(cmd_buffer); struct radv_meta_saved_state saved_state; - radv_meta_save(&saved_state, cmd_buffer, - RADV_META_SAVE_GRAPHICS_PIPELINE | RADV_META_SAVE_CONSTANTS | RADV_META_SAVE_DESCRIPTORS); + radv_meta_save( + &saved_state, cmd_buffer, + RADV_META_SAVE_GRAPHICS_PIPELINE | RADV_META_SAVE_CONSTANTS | RADV_META_SAVE_DESCRIPTORS | RADV_META_SAVE_RENDER); assert(region->srcSubresource.aspectMask == VK_IMAGE_ASPECT_COLOR_BIT); assert(region->dstSubresource.aspectMask == VK_IMAGE_ASPECT_COLOR_BIT); @@ -537,51 +538,10 @@ radv_meta_resolve_fragment_image(struct radv_cmd_buffer *cmd_buffer, struct radv void radv_cmd_buffer_resolve_rendering_fs(struct radv_cmd_buffer *cmd_buffer, struct radv_image_view *src_iview, VkImageLayout src_layout, struct radv_image_view *dst_iview, - VkImageLayout dst_layout) + VkImageLayout dst_layout, const VkImageResolve2 *region) { - const struct radv_rendering_state *render = &cmd_buffer->state.render; - struct radv_meta_saved_state saved_state; - VkRect2D resolve_area = render->area; - - radv_meta_save( - &saved_state, cmd_buffer, - RADV_META_SAVE_GRAPHICS_PIPELINE | RADV_META_SAVE_CONSTANTS | RADV_META_SAVE_DESCRIPTORS | RADV_META_SAVE_RENDER); - - radv_CmdSetViewport(radv_cmd_buffer_to_handle(cmd_buffer), 0, 1, - &(VkViewport){.x = resolve_area.offset.x, - .y = resolve_area.offset.y, - .width = resolve_area.extent.width, - .height = resolve_area.extent.height, - .minDepth = 0.0f, - .maxDepth = 1.0f}); - - radv_CmdSetScissor(radv_cmd_buffer_to_handle(cmd_buffer), 0, 1, &resolve_area); - - const VkRenderingAttachmentInfo color_att = { - .sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO, - .imageView = radv_image_view_to_handle(dst_iview), - .imageLayout = dst_layout, - .loadOp = VK_ATTACHMENT_LOAD_OP_LOAD, - .storeOp = VK_ATTACHMENT_STORE_OP_STORE, - }; - - const VkRenderingInfo rendering_info = { - .sType = VK_STRUCTURE_TYPE_RENDERING_INFO, - .flags = VK_RENDERING_INPUT_ATTACHMENT_NO_CONCURRENT_WRITES_BIT_MESA, - .renderArea = saved_state.render.area, - .layerCount = 1, - .viewMask = saved_state.render.view_mask, - .colorAttachmentCount = 1, - .pColorAttachments = &color_att, - }; - - radv_CmdBeginRendering(radv_cmd_buffer_to_handle(cmd_buffer), &rendering_info); - - emit_resolve(cmd_buffer, src_iview, dst_iview, &resolve_area.offset, &resolve_area.offset); - - radv_CmdEndRendering(radv_cmd_buffer_to_handle(cmd_buffer)); - - radv_meta_restore(&saved_state, cmd_buffer); + radv_meta_resolve_fragment_image(cmd_buffer, src_iview->image, src_iview->vk.format, src_layout, dst_iview->image, + dst_iview->vk.format, dst_layout, region); } void