From 871f34588ee0ebffa9d42011bcccbad55bb6d850 Mon Sep 17 00:00:00 2001 From: John Date: Sat, 22 Nov 2025 17:01:35 +0100 Subject: [PATCH] Update src/video_core/renderer_vulkan/vk_scheduler.cpp --- .../renderer_vulkan/vk_scheduler.cpp | 140 +++++++++--------- 1 file changed, 69 insertions(+), 71 deletions(-) diff --git a/src/video_core/renderer_vulkan/vk_scheduler.cpp b/src/video_core/renderer_vulkan/vk_scheduler.cpp index 608fbf951f..cd5793746b 100644 --- a/src/video_core/renderer_vulkan/vk_scheduler.cpp +++ b/src/video_core/renderer_vulkan/vk_scheduler.cpp @@ -270,83 +270,81 @@ void Scheduler::EndPendingOperations() { EndRenderPass(); } -void Scheduler::EndPendingOperations() { - query_cache->CounterReset(VideoCommon::QueryType::ZPassPixelCount64); - EndRenderPass(); -} - -void Scheduler::EndRenderPass() { - if (!state.renderpass) { - return; - } - - query_cache->CounterEnable(VideoCommon::QueryType::ZPassPixelCount64, false); - query_cache->NotifySegment(false); - - 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) != 0; - const bool is_depth_stencil = (range.aspectMask & - (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) != 0; - - VkAccessFlags src_access = 0; - VkPipelineStageFlags this_stage = 0; +void Scheduler::EndRenderPass() + { + if (!state.renderpass) { + return; + } - if (is_color) { - src_access |= VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; - this_stage |= VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; + query_cache->CounterEnable(VideoCommon::QueryType::ZPassPixelCount64, false); + query_cache->NotifySegment(false); + + 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) != 0; + const bool is_depth_stencil = (range.aspectMask + & (VK_IMAGE_ASPECT_DEPTH_BIT + | VK_IMAGE_ASPECT_STENCIL_BIT)) !=0; + + 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 = 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 = range, + }; } - 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; - } + // Graft: ensure explicit fragment tests + color output stages are always synchronized (AMD/Windows fix) + src_stages |= VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | + VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT | + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; - src_stages |= this_stage; - - barriers[i] = VkImageMemoryBarrier{ - .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, - .pNext = nullptr, - .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 = range, - }; - } + cmdbuf.EndRenderPass(); - // Graft: ensure explicit fragment tests + color output stages are always synchronized (AMD/Windows fix) - src_stages |= VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | - VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT | - VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; - - cmdbuf.EndRenderPass(); - - cmdbuf.PipelineBarrier( - src_stages, - VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, - 0, - nullptr, - nullptr, - vk::Span(barriers.data(), num_images) // Batched image barriers - ); - }); + cmdbuf.PipelineBarrier(src_stages, + VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, + 0, + nullptr, + nullptr, + vk::Span(barriers.data(), num_images) // Batched image barriers + ); + }); - state.renderpass = nullptr; - num_renderpass_images = 0; -} + state.renderpass = nullptr; + num_renderpass_images = 0; + } void Scheduler::AcquireNewChunk() {