aboutsummaryrefslogtreecommitdiff
path: root/src/video_core/renderer_vulkan/vk_swapchain.cpp
diff options
context:
space:
mode:
authorMaranBr <maranbr@outlook.com>2026-02-12 00:23:19 +0100
committercrueter <crueter@eden-emu.dev>2026-02-12 00:23:19 +0100
commit5f676a6a55aa4d748e545b0fc6956e9a5dbd2f7f (patch)
treec6771e1dbfc36e0ab0236f69275454542585e7be /src/video_core/renderer_vulkan/vk_swapchain.cpp
parent2ab5b37137c1e1aa8e96d93bd0992aee872de44c (diff)
[vulkan] Add support for target FPS frame pacing (#3494)
This allows users to choose how the emulator manages frame pacing to reduce stuttering and provide a smoother and more consistent frame rate. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3494 Reviewed-by: CamilleLaVey <camillelavey99@gmail.com> Co-authored-by: MaranBr <maranbr@outlook.com> Co-committed-by: MaranBr <maranbr@outlook.com>
Diffstat (limited to 'src/video_core/renderer_vulkan/vk_swapchain.cpp')
-rw-r--r--src/video_core/renderer_vulkan/vk_swapchain.cpp42
1 files changed, 40 insertions, 2 deletions
diff --git a/src/video_core/renderer_vulkan/vk_swapchain.cpp b/src/video_core/renderer_vulkan/vk_swapchain.cpp
index 7418ad934e..7e7e67639d 100644
--- a/src/video_core/renderer_vulkan/vk_swapchain.cpp
+++ b/src/video_core/renderer_vulkan/vk_swapchain.cpp
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project
@@ -146,6 +146,25 @@ void Swapchain::Create(
{
is_outdated = false;
is_suboptimal = false;
+
+ switch (Settings::values.frame_pacing_mode.GetValue()) {
+ case Settings::FramePacingMode::Target_Auto:
+ scheduler.ResetFramePacing();
+ break;
+ case Settings::FramePacingMode::Target_30:
+ scheduler.ResetFramePacing(30.0);
+ break;
+ case Settings::FramePacingMode::Target_60:
+ scheduler.ResetFramePacing(60.0);
+ break;
+ case Settings::FramePacingMode::Target_120:
+ scheduler.ResetFramePacing(120.0);
+ break;
+ case Settings::FramePacingMode::Target_240:
+ scheduler.ResetFramePacing(240.0);
+ break;
+ }
+
width = width_;
height = height_;
#ifdef ANDROID
@@ -194,7 +213,26 @@ bool Swapchain::AcquireNextImage() {
break;
}
- scheduler.Wait(resource_ticks[image_index]);
+ if (resource_ticks[image_index] != 0 && !scheduler.IsFree(resource_ticks[image_index])) {
+ switch (Settings::values.frame_pacing_mode.GetValue()) {
+ case Settings::FramePacingMode::Target_Auto:
+ scheduler.Wait(resource_ticks[image_index]);
+ break;
+ case Settings::FramePacingMode::Target_30:
+ scheduler.Wait(resource_ticks[image_index], 30.0);
+ break;
+ case Settings::FramePacingMode::Target_60:
+ scheduler.Wait(resource_ticks[image_index], 60.0);
+ break;
+ case Settings::FramePacingMode::Target_120:
+ scheduler.Wait(resource_ticks[image_index], 120.0);
+ break;
+ case Settings::FramePacingMode::Target_240:
+ scheduler.Wait(resource_ticks[image_index], 240.0);
+ break;
+ }
+ }
+
resource_ticks[image_index] = scheduler.CurrentTick();
return is_suboptimal || is_outdated;