diff --git a/src/android/app/src/main/jni/emu_window/emu_window.cpp b/src/android/app/src/main/jni/emu_window/emu_window.cpp index f872875f99..9858344639 100644 --- a/src/android/app/src/main/jni/emu_window/emu_window.cpp +++ b/src/android/app/src/main/jni/emu_window/emu_window.cpp @@ -212,18 +212,27 @@ void EmuWindow_Android::UpdateFrameRateHint() { using SetFrameRateWithChangeStrategyFn = int32_t (*)(ANativeWindow*, float, int8_t, int8_t); + using SetFrameRateFn = int32_t (*)(ANativeWindow*, float, int8_t); static const auto set_frame_rate_with_change_strategy = reinterpret_cast( dlsym(RTLD_DEFAULT, "ANativeWindow_setFrameRateWithChangeStrategy")); - - if (!set_frame_rate_with_change_strategy) { + static const auto set_frame_rate = reinterpret_cast( + dlsym(RTLD_DEFAULT, "ANativeWindow_setFrameRate")); + + constexpr int8_t FrameRateCompatibilityDefault = 0; + constexpr int8_t ChangeFrameRateOnlyIfSeamless = 0; + + int32_t result = -1; + if (set_frame_rate_with_change_strategy) { + result = set_frame_rate_with_change_strategy(surface, frame_rate_hint, + FrameRateCompatibilityDefault, + ChangeFrameRateOnlyIfSeamless); + } else if (set_frame_rate) { + result = set_frame_rate(surface, frame_rate_hint, FrameRateCompatibilityDefault); + } else { return; } - const auto result = set_frame_rate_with_change_strategy( - surface, frame_rate_hint, - static_cast(ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_DEFAULT), - static_cast(ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS)); if (result != 0) { LOG_DEBUG(Frontend, "Failed to update Android surface frame rate hint: {}", result); return; diff --git a/src/video_core/renderer_vulkan/vk_swapchain.cpp b/src/video_core/renderer_vulkan/vk_swapchain.cpp index 46b98f6cc1..a997b8cb42 100644 --- a/src/video_core/renderer_vulkan/vk_swapchain.cpp +++ b/src/video_core/renderer_vulkan/vk_swapchain.cpp @@ -9,6 +9,10 @@ #include #include +#ifdef __ANDROID__ +#include +#endif + #include "common/logging/log.h" #include "common/settings.h" #include "common/settings_enums.h" @@ -170,9 +174,7 @@ bool Swapchain::AcquireNextImage() { break; } -#ifdef __ANDROID__ - scheduler.Wait(resource_ticks[image_index]); -#else + const auto wait_with_frame_pacing = [this, image_index] { switch (Settings::values.frame_pacing_mode.GetValue()) { case Settings::FramePacingMode::Target_Auto: scheduler.Wait(resource_ticks[image_index]); @@ -190,6 +192,16 @@ bool Swapchain::AcquireNextImage() { scheduler.Wait(resource_ticks[image_index], 120.0); break; } + }; + +#ifdef __ANDROID__ + if (android_get_device_api_level() >= 30) { + scheduler.Wait(resource_ticks[image_index]); + } else { + wait_with_frame_pacing(); + } +#else + wait_with_frame_pacing(); #endif resource_ticks[image_index] = scheduler.CurrentTick();