From e27f69d9baf943f955d13c3a7d98844c98371882 Mon Sep 17 00:00:00 2001 From: crueter Date: Tue, 5 Aug 2025 16:29:27 -0400 Subject: [PATCH] [vk] proper EndRenderPass batch impl Co-authored-by: wildcard Signed-off-by: crueter --- .../renderer_vulkan/vk_scheduler.cpp | 60 ++++++++++++++----- 1 file changed, 45 insertions(+), 15 deletions(-) diff --git a/src/video_core/renderer_vulkan/vk_scheduler.cpp b/src/video_core/renderer_vulkan/vk_scheduler.cpp index aa56a6affd..8fc22909c7 100644 --- a/src/video_core/renderer_vulkan/vk_scheduler.cpp +++ b/src/video_core/renderer_vulkan/vk_scheduler.cpp @@ -270,7 +270,8 @@ void Scheduler::EndPendingOperations() { EndRenderPass(); } -void Scheduler::EndRenderPass() { +void Scheduler::EndRenderPass() +{ if (!state.renderpass) { return; } @@ -278,35 +279,64 @@ void Scheduler::EndRenderPass() { query_cache->CounterEnable(VideoCommon::QueryType::ZPassPixelCount64, false); query_cache->NotifySegment(false); - Record([num_images = num_renderpass_images, images = renderpass_images, + Record([num_images = num_renderpass_images, + images = renderpass_images, ranges = renderpass_image_ranges](vk::CommandBuffer cmdbuf) { std::array barriers; + VkPipelineStageFlags src_stages = 0; + for (size_t i = 0; i < num_images; ++i) { + const VkImageSubresourceRange& range = ranges[i]; + const bool is_color = range.aspectMask & VK_IMAGE_ASPECT_COLOR_BIT; + const bool is_depth_stencil = range.aspectMask + & (VK_IMAGE_ASPECT_DEPTH_BIT + | VK_IMAGE_ASPECT_STENCIL_BIT); + + VkAccessFlags src_access = 0; + VkPipelineStageFlags this_stage = 0; + + if (is_color) { + src_access |= VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; + this_stage |= VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; + } + + if (is_depth_stencil) { + src_access |= VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; + this_stage |= VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT + | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT; + } + + src_stages |= this_stage; + barriers[i] = VkImageMemoryBarrier{ .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, .pNext = nullptr, - .srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | - VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, - .dstAccessMask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT | - VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | - VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | - VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | - VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, + .srcAccessMask = src_access, + .dstAccessMask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT + | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT + | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT + | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT + | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, .oldLayout = VK_IMAGE_LAYOUT_GENERAL, .newLayout = VK_IMAGE_LAYOUT_GENERAL, .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, .image = images[i], - .subresourceRange = ranges[i], + .subresourceRange = range, }; } + cmdbuf.EndRenderPass(); - cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | - VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT | - VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, - VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, nullptr, nullptr, - vk::Span(barriers.data(), num_images)); + + cmdbuf.PipelineBarrier(src_stages, + VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, + 0, + {}, + {}, + {barriers.data(), num_images} // Batched image barriers + ); }); + state.renderpass = nullptr; num_renderpass_images = 0; }