From f2a7c1317f30e5f49a5b3505ac982d05f97f0750 Mon Sep 17 00:00:00 2001 From: Gamer64 <76565986+Gamer64ytb@users.noreply.github.com> Date: Wed, 6 Aug 2025 20:01:13 +0200 Subject: [PATCH] Try to implement a frame interpolation / skipping method First, I need to see if this will act as a interpolation or as frame skip. --- src/common/settings.h | 2 +- src/video_core/gpu_thread.cpp | 11 ++++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/common/settings.h b/src/common/settings.h index 41c042bcf1..713f8ed689 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -322,9 +322,9 @@ struct Values { SwitchableSetting vulkan_device{linkage, 0, "vulkan_device", Category::Renderer, Specialization::RuntimeList}; SwitchableSetting enable_raii{linkage, false, "enable_raii", Category::Renderer}; -#ifdef __ANDROID__ SwitchableSetting frame_interpolation{linkage, true, "frame_interpolation", Category::Renderer, Specialization::RuntimeList}; +#ifdef __ANDROID__ SwitchableSetting frame_skipping{linkage, false, "frame_skipping", Category::Renderer, Specialization::RuntimeList}; #endif diff --git a/src/video_core/gpu_thread.cpp b/src/video_core/gpu_thread.cpp index 2b4bce4f8d..96c8bcb974 100644 --- a/src/video_core/gpu_thread.cpp +++ b/src/video_core/gpu_thread.cpp @@ -37,6 +37,7 @@ static void RunThread(std::stop_token stop_token, Core::System& system, VideoCore::RasterizerInterface* const rasterizer = renderer.ReadRasterizer(); CommandDataContainer next; + size_t frame_counter = 0; while (!stop_token.stop_requested()) { state.queue.PopWait(next, stop_token); @@ -44,7 +45,15 @@ static void RunThread(std::stop_token stop_token, Core::System& system, break; } if (auto* submit_list = std::get_if(&next.data)) { - scheduler.Push(submit_list->channel, std::move(submit_list->entries)); + bool skip_frame = false; + if (Settings::values.frame_interpolation.GetValue()) { + // Skip every other frame + skip_frame = (frame_counter % 2 == 1); + frame_counter++; + } + if (!skip_frame) { + scheduler.Push(submit_list->channel, std::move(submit_list->entries)); + } } else if (std::holds_alternative(next.data)) { system.GPU().TickWork(); } else if (const auto* flush = std::get_if(&next.data)) {