Module: Mesa Branch: main Commit: aae25953905c47a14048d07e55ab1bd766b5f099 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=aae25953905c47a14048d07e55ab1bd766b5f099
Author: Samuel Pitoiset <samuel.pitoi...@gmail.com> Date: Tue Nov 21 12:43:07 2023 +0100 radv: stop performing redundant resolves with the HW resolve path This path was quadratic... Found by inspection. Signed-off-by: Samuel Pitoiset <samuel.pitoi...@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26316> --- src/amd/vulkan/meta/radv_meta_resolve.c | 110 +++++++++++++++----------------- 1 file changed, 50 insertions(+), 60 deletions(-) diff --git a/src/amd/vulkan/meta/radv_meta_resolve.c b/src/amd/vulkan/meta/radv_meta_resolve.c index 7556b947e9a..cfe808f5492 100644 --- a/src/amd/vulkan/meta/radv_meta_resolve.c +++ b/src/amd/vulkan/meta/radv_meta_resolve.c @@ -548,7 +548,9 @@ radv_CmdResolveImage2(VkCommandBuffer commandBuffer, const VkResolveImageInfo2 * } static void -radv_cmd_buffer_resolve_rendering_hw(struct radv_cmd_buffer *cmd_buffer) +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) { struct radv_meta_saved_state saved_state; @@ -566,73 +568,61 @@ radv_cmd_buffer_resolve_rendering_hw(struct radv_cmd_buffer *cmd_buffer) radv_CmdSetScissor(radv_cmd_buffer_to_handle(cmd_buffer), 0, 1, resolve_area); - for (uint32_t i = 0; i < saved_state.render.color_att_count; ++i) { - if (saved_state.render.color_att[i].resolve_iview == NULL) - continue; - - struct radv_image_view *src_iview = saved_state.render.color_att[i].iview; - VkImageLayout src_layout = saved_state.render.color_att[i].layout; - struct radv_image *src_img = src_iview->image; - - struct radv_image_view *dst_iview = saved_state.render.color_att[i].resolve_iview; - VkImageLayout dst_layout = saved_state.render.color_att[i].resolve_layout; - 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(cmd_buffer->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 = dst_iview->vk.level_count, - .baseArrayLayer = dst_iview->vk.base_array_layer, - .layerCount = dst_iview->vk.layer_count, - }; - - cmd_buffer->state.flush_bits |= radv_init_dcc(cmd_buffer, dst_img, &range, 0xffffffff); - } + 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); - 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, - }, + if (radv_layout_dcc_compressed(cmd_buffer->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 = dst_iview->vk.level_count, + .baseArrayLayer = dst_iview->vk.base_array_layer, + .layerCount = dst_iview->vk.layer_count, }; - const VkRenderingInfo rendering_info = { - .sType = VK_STRUCTURE_TYPE_RENDERING_INFO, - .renderArea = saved_state.render.area, - .layerCount = saved_state.render.layer_count, - .viewMask = saved_state.render.view_mask, - .colorAttachmentCount = 2, - .pColorAttachments = color_atts, - }; + cmd_buffer->state.flush_bits |= radv_init_dcc(cmd_buffer, dst_img, &range, 0xffffffff); + } - radv_CmdBeginRendering(radv_cmd_buffer_to_handle(cmd_buffer), &rendering_info); + 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, + }, + }; - VkResult ret = - build_resolve_pipeline(cmd_buffer->device, radv_format_meta_fs_key(cmd_buffer->device, dst_iview->vk.format)); - if (ret != VK_SUCCESS) { - vk_command_buffer_set_error(&cmd_buffer->vk, ret); - continue; - } + const VkRenderingInfo rendering_info = { + .sType = VK_STRUCTURE_TYPE_RENDERING_INFO, + .renderArea = saved_state.render.area, + .layerCount = saved_state.render.layer_count, + .viewMask = saved_state.render.view_mask, + .colorAttachmentCount = 2, + .pColorAttachments = color_atts, + }; - emit_resolve(cmd_buffer, src_img, dst_img, dst_iview->vk.format); + radv_CmdBeginRendering(radv_cmd_buffer_to_handle(cmd_buffer), &rendering_info); - radv_CmdEndRendering(radv_cmd_buffer_to_handle(cmd_buffer)); + VkResult ret = + build_resolve_pipeline(cmd_buffer->device, radv_format_meta_fs_key(cmd_buffer->device, dst_iview->vk.format)); + if (ret != VK_SUCCESS) { + vk_command_buffer_set_error(&cmd_buffer->vk, ret); + return; } + 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); } @@ -766,7 +756,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); + radv_cmd_buffer_resolve_rendering_hw(cmd_buffer, src_iview, src_layout, dst_iview, dst_layout); break; case RESOLVE_COMPUTE: radv_decompress_resolve_src(cmd_buffer, src_iview->image, src_layout, ®ion);