From d879fffb4a2c31ef5b712ea8704f9ecf2de7eeb7 Mon Sep 17 00:00:00 2001 From: MaranBr Date: Tue, 10 Feb 2026 11:43:33 -0400 Subject: [PATCH] Ensure correct first-frame timing --- src/video_core/renderer_vulkan/vk_scheduler.cpp | 2 -- src/video_core/renderer_vulkan/vk_scheduler.h | 11 ++++------- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/src/video_core/renderer_vulkan/vk_scheduler.cpp b/src/video_core/renderer_vulkan/vk_scheduler.cpp index 8830c5a506..0acaf39b36 100644 --- a/src/video_core/renderer_vulkan/vk_scheduler.cpp +++ b/src/video_core/renderer_vulkan/vk_scheduler.cpp @@ -47,11 +47,9 @@ Scheduler::Scheduler(const Device& device_, StateTracker& state_tracker_) : device{device_}, state_tracker{state_tracker_}, master_semaphore{std::make_unique(device)}, command_pool{std::make_unique(*master_semaphore, device)} { - #ifdef _WIN32 high_res_timer = std::make_unique(); #endif - AcquireNewChunk(); AllocateWorkerCommandBuffer(); worker_thread = std::jthread([this](std::stop_token token) { WorkerThread(token); }); diff --git a/src/video_core/renderer_vulkan/vk_scheduler.h b/src/video_core/renderer_vulkan/vk_scheduler.h index a2adb795e9..e762aa1019 100644 --- a/src/video_core/renderer_vulkan/vk_scheduler.h +++ b/src/video_core/renderer_vulkan/vk_scheduler.h @@ -122,17 +122,14 @@ public: if (Settings::values.use_speed_limit.GetValue() && target_fps > 0.0) { const auto frame_duration = std::chrono::duration(1.0 / target_fps); auto now = std::chrono::steady_clock::now(); - if (next_frame_time == std::chrono::steady_clock::time_point{} || now > next_frame_time + frame_duration) { + if (next_frame_time == std::chrono::steady_clock::time_point{}) { next_frame_time = now + std::chrono::duration_cast(frame_duration); } - if (now < next_frame_time) { - std::this_thread::sleep_until(next_frame_time); - now = std::chrono::steady_clock::now(); + while (now > next_frame_time) { + next_frame_time += std::chrono::duration_cast(frame_duration); } + std::this_thread::sleep_until(next_frame_time); next_frame_time += std::chrono::duration_cast(frame_duration); - if (now > next_frame_time) { - next_frame_time = now + std::chrono::duration_cast(frame_duration); - } } if (tick >= master_semaphore->CurrentTick()) { Flush();