aboutsummaryrefslogtreecommitdiff
path: root/src/video_core/renderer_vulkan/vk_swapchain.cpp
diff options
context:
space:
mode:
authorTakoroka <137927095+Takoroka@users.noreply.github.com>2026-10-29 11:15:48 -0400
committerTakoroka <137927095+Takoroka@users.noreply.github.com>2026-10-29 20:49:48 -0400
commit00c059cd39f4fd9d1244345d6727a171acec4f86 (patch)
tree1da835c61e81dac8fe77769b922431850ba0cd84 /src/video_core/renderer_vulkan/vk_swapchain.cpp
parent24d3a1dbb3f2bb6dc5b8a515c1be1f7bad956b4b (diff)
vulkan: never flush the scheduler from the async present thread
Swapchain::AcquireNextImage waits for the main scheduler's tick of the image's last use; when that tick was not submitted yet, Scheduler::Wait flushed, recording into the current chunk on the present thread while the GPU thread recorded into it too (corrupt command buffers, crashes in vkCmdEndRenderPass and in CommandChunk::Record). With async presentation the present thread now waits up to 20 ms for the recording thread to submit the tick, and goes on without the wait otherwise (the copy to the swapchain has its own fences).
Diffstat (limited to 'src/video_core/renderer_vulkan/vk_swapchain.cpp')
-rw-r--r--src/video_core/renderer_vulkan/vk_swapchain.cpp16
1 files changed, 8 insertions, 8 deletions
diff --git a/src/video_core/renderer_vulkan/vk_swapchain.cpp b/src/video_core/renderer_vulkan/vk_swapchain.cpp
index fea5398557..a0ed5a4493 100644
--- a/src/video_core/renderer_vulkan/vk_swapchain.cpp
+++ b/src/video_core/renderer_vulkan/vk_swapchain.cpp
@@ -158,7 +158,7 @@ void Swapchain::Create(
resource_ticks.resize(image_count);
}
-bool Swapchain::AcquireNextImage() {
+bool Swapchain::AcquireNextImage(bool may_flush) {
const VkResult result = device.GetLogical().AcquireNextImageKHR(
*swapchain, (std::numeric_limits<u64>::max)(), *present_semaphores[frame_index],
VK_NULL_HANDLE, &image_index);
@@ -179,29 +179,29 @@ bool Swapchain::AcquireNextImage() {
break;
}
- const auto wait_with_frame_pacing = [this] {
+ const auto wait_with_frame_pacing = [this, may_flush] {
switch (Settings::values.frame_pacing_mode.GetValue()) {
case Settings::FramePacingMode::Target_Auto:
- scheduler.Wait(resource_ticks[image_index]);
+ scheduler.Wait(resource_ticks[image_index], 0.0, may_flush);
break;
case Settings::FramePacingMode::Target_30:
- scheduler.Wait(resource_ticks[image_index], 30.0);
+ scheduler.Wait(resource_ticks[image_index], 30.0, may_flush);
break;
case Settings::FramePacingMode::Target_60:
- scheduler.Wait(resource_ticks[image_index], 60.0);
+ scheduler.Wait(resource_ticks[image_index], 60.0, may_flush);
break;
case Settings::FramePacingMode::Target_90:
- scheduler.Wait(resource_ticks[image_index], 90.0);
+ scheduler.Wait(resource_ticks[image_index], 90.0, may_flush);
break;
case Settings::FramePacingMode::Target_120:
- scheduler.Wait(resource_ticks[image_index], 120.0);
+ scheduler.Wait(resource_ticks[image_index], 120.0, may_flush);
break;
}
};
#ifdef __ANDROID__
if (android_get_device_api_level() >= 30) {
- scheduler.Wait(resource_ticks[image_index]);
+ scheduler.Wait(resource_ticks[image_index], 0.0, may_flush);
} else {
wait_with_frame_pacing();
}