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);