From 5f676a6a55aa4d748e545b0fc6956e9a5dbd2f7f Mon Sep 17 00:00:00 2001 From: MaranBr Date: Thu, 12 Feb 2026 00:23:19 +0100 Subject: [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 Co-authored-by: MaranBr Co-committed-by: MaranBr --- src/video_core/renderer_vulkan/vk_swapchain.cpp | 42 +++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) (limited to 'src/video_core/renderer_vulkan/vk_swapchain.cpp') 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; -- cgit v1.2.3