From 1328dae97d13096445225ac60f676e5d9a83ee87 Mon Sep 17 00:00:00 2001 From: crueter Date: Tue, 22 Jul 2025 17:17:23 -0400 Subject: [PATCH] [android] Early release fences option Signed-off-by: crueter --- .../features/settings/model/BooleanSetting.kt | 1 + .../features/settings/model/view/SettingsItem.kt | 7 +++++++ .../settings/ui/SettingsFragmentPresenter.kt | 1 + src/android/app/src/main/res/values/strings.xml | 15 +++++++++------ src/common/settings.h | 10 ++++++++++ src/video_core/fence_manager.h | 9 +++++++++ 6 files changed, 37 insertions(+), 6 deletions(-) diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt index a558afab47..92a49a1de7 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt @@ -25,6 +25,7 @@ enum class BooleanSetting(override val key: String) : AbstractBooleanSetting { RENDERER_ASYNCHRONOUS_SHADERS("use_asynchronous_shaders"), RENDERER_FAST_GPU("use_fast_gpu_time"), RENDERER_REACTIVE_FLUSHING("use_reactive_flushing"), + RENDERER_EARLY_RELEASE_FENCES("early_release_fences"), RENDERER_DEBUG("debug"), RENDERER_PROVOKING_VERTEX("provoking_vertex"), RENDERER_DESCRIPTOR_INDEXING("descriptor_indexing"), diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt index a269cab254..d4335ddcd8 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt @@ -666,6 +666,13 @@ abstract class SettingsItem( descriptionId = R.string.renderer_reactive_flushing_description ) ) + put( + SwitchSetting( + BooleanSetting.RENDERER_EARLY_RELEASE_FENCES, + titleId = R.string.renderer_early_release_fences, + descriptionId = R.string.renderer_early_release_fences_description + ) + ) put( SingleChoiceSetting( IntSetting.MAX_ANISOTROPY, diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt index 31e2873b58..6ed7fee8a4 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt @@ -450,6 +450,7 @@ class SettingsFragmentPresenter( add(BooleanSetting.ENABLE_RAII.key) add(BooleanSetting.FRAME_INTERPOLATION.key) add(BooleanSetting.RENDERER_FAST_GPU.key) + add(BooleanSetting.RENDERER_EARLY_RELEASE_FENCES.key) add(IntSetting.FAST_GPU_TIME.key) add(IntSetting.RENDERER_SHADER_BACKEND.key) add(IntSetting.RENDERER_NVDEC_EMULATION.key) diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index cac730b66b..c78487e327 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -88,12 +88,8 @@ A method of automatic resource management in Vulkan that ensures proper release of resources when they are no longer needed, but may cause crashes in bundled games. Enhanced Frame Pacing Ensures smooth and consistent frame delivery by synchronizing the timing between frames, reducing stuttering and uneven animation. Ideal for games that experience frame timing instability or micro-stutters during gameplay. - Use Auto Stub - Automatically stub missing services and functions. This may improve compatibility but can cause crashes and stability issues. - Uninstall firmware - Uninstalling the firmware will remove it from the device and may affect game compatibility. - Uninstalling firmware - Firmware uninstalled successfully + Release fences early + Some games may require this to get past 0FPS errors, such as DKCR:HD, Subnautica, and Ori 2. CPU and Memory Synchronize Core Speed @@ -385,6 +381,11 @@ Firmware and retail games cannot be decrypted https://yuzu-mirror.github.io/help/quickstart/#dumping-decryption-keys + Uninstall firmware + Uninstalling the firmware will remove it from the device and may affect game compatibility. + Uninstalling firmware + Firmware uninstalled successfully + Firmware Invalid Firmware is required to run certain games and use system applications. Eden only works with firmware 19.0.1 and earlier. Firmware reported as present, but was unable to be read. Check for decryption keys and redump firmware if necessary. @@ -510,6 +511,8 @@ CPU CPU Debugging Puts the CPU in a slow debugging mode. + Use Auto Stub + Automatically stub missing services and functions. This may improve compatibility but can cause crashes and stability issues. GPU API diff --git a/src/common/settings.h b/src/common/settings.h index 1bf460c8b0..e3c2bd57cc 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -457,6 +457,16 @@ struct Values { Specialization::Default, true, true}; +#ifdef ANDROID + SwitchableSetting early_release_fences{linkage, + false, + "early_release_fences", + Category::RendererAdvanced, + Specialization::Default, + true, + true}; +#endif + SwitchableSetting async_presentation{linkage, #ifdef ANDROID true, diff --git a/src/video_core/fence_manager.h b/src/video_core/fence_manager.h index 2135f1f2da..613713fe4e 100644 --- a/src/video_core/fence_manager.h +++ b/src/video_core/fence_manager.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -73,9 +76,15 @@ public: void SignalFence(std::function&& func) { bool delay_fence = Settings::IsGPULevelHigh(); + #ifdef __ANDROID__ + if (!delay_fence && Settings::values.early_release_fences.GetValue()) { + TryReleasePendingFences(); + } + #else if constexpr (!can_async_check) { TryReleasePendingFences(); } + #endif const bool should_flush = ShouldFlush(); CommitAsyncFlushes(); TFence new_fence = CreateFence(!should_flush); -- 2.39.5