diff --git a/src/video_core/renderer_vulkan/vk_scheduler.cpp b/src/video_core/renderer_vulkan/vk_scheduler.cpp index aafcfdf65b..2a69d6d244 100644 --- a/src/video_core/renderer_vulkan/vk_scheduler.cpp +++ b/src/video_core/renderer_vulkan/vk_scheduler.cpp @@ -347,7 +347,7 @@ void Scheduler::EndRenderPass() Record([num_images = num_renderpass_images, images = renderpass_images, ranges = renderpass_image_ranges](vk::CommandBuffer cmdbuf) { - std::array barriers; + std::vector barriers(num_images); VkPipelineStageFlags src_stages = 0; for (size_t i = 0; i < num_images; ++i) { const VkImageSubresourceRange& range = ranges[i]; diff --git a/src/video_core/renderer_vulkan/vk_scheduler.h b/src/video_core/renderer_vulkan/vk_scheduler.h index 5216a436c8..50bf3177c3 100644 --- a/src/video_core/renderer_vulkan/vk_scheduler.h +++ b/src/video_core/renderer_vulkan/vk_scheduler.h @@ -113,7 +113,7 @@ public: /// Waits for the given tick to trigger on the GPU. void Wait(u64 tick) { - if (tick >= master_semaphore->CurrentTick()) { + if (tick > master_semaphore->CurrentTick() && !chunk->Empty()) { // Make sure we are not waiting for the current tick without signalling Flush(); } diff --git a/src/video_core/renderer_vulkan/vk_swapchain.cpp b/src/video_core/renderer_vulkan/vk_swapchain.cpp index 7418ad934e..405381970a 100644 --- a/src/video_core/renderer_vulkan/vk_swapchain.cpp +++ b/src/video_core/renderer_vulkan/vk_swapchain.cpp @@ -194,7 +194,10 @@ bool Swapchain::AcquireNextImage() { break; } - scheduler.Wait(resource_ticks[image_index]); + if (resource_ticks[image_index] != 0 && !scheduler.IsFree(resource_ticks[image_index])) { + scheduler.Wait(resource_ticks[image_index]); + } + resource_ticks[image_index] = scheduler.CurrentTick(); return is_suboptimal || is_outdated;