diff --git a/src/video_core/renderer_vulkan/vk_scheduler.cpp b/src/video_core/renderer_vulkan/vk_scheduler.cpp index d109d22cab..cd5793746b 100644 --- a/src/video_core/renderer_vulkan/vk_scheduler.cpp +++ b/src/video_core/renderer_vulkan/vk_scheduler.cpp @@ -287,10 +287,10 @@ void Scheduler::EndRenderPass() 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 + 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); + | VK_IMAGE_ASPECT_STENCIL_BIT)) !=0; VkAccessFlags src_access = 0; VkPipelineStageFlags this_stage = 0; @@ -326,14 +326,19 @@ void Scheduler::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, - {}, - {}, - {barriers.data(), num_images} // Batched image barriers + nullptr, + nullptr, + vk::Span(barriers.data(), num_images) // Batched image barriers ); });