diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/IntSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/IntSetting.kt
index c5722a5a17..2178746d6f 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/IntSetting.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/IntSetting.kt
@@ -33,6 +33,11 @@ enum class IntSetting(
Settings.SECTION_RENDERER,
0
),
+ RENDERER_REACTIVE_FLUSHING(
+ "use_reactive_flushing",
+ Settings.SECTION_RENDERER,
+ 0
+ ),
RENDERER_DEBUG(
"debug",
Settings.SECTION_RENDERER,
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 061046b2e7..1ceaa6fb4a 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
@@ -321,6 +321,15 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView)
IntSetting.RENDERER_ASYNCHRONOUS_SHADERS.defaultValue
)
)
+ add(
+ SwitchSetting(
+ IntSetting.RENDERER_REACTIVE_FLUSHING,
+ R.string.renderer_reactive_flushing,
+ R.string.renderer_reactive_flushing_description,
+ IntSetting.RENDERER_REACTIVE_FLUSHING.key,
+ IntSetting.RENDERER_REACTIVE_FLUSHING.defaultValue
+ )
+ )
}
}
diff --git a/src/android/app/src/main/jni/config.cpp b/src/android/app/src/main/jni/config.cpp
index 2d622a048c..e0b4772dae 100644
--- a/src/android/app/src/main/jni/config.cpp
+++ b/src/android/app/src/main/jni/config.cpp
@@ -239,6 +239,10 @@ void Config::ReadValues() {
Settings::values.renderer_force_max_clock =
config->GetBoolean("Renderer", "force_max_clock", true);
+ // Disable use_reactive_flushing by default on Android
+ Settings::values.use_reactive_flushing =
+ config->GetBoolean("Renderer", "use_reactive_flushing", false);
+
// Audio
ReadSetting("Audio", Settings::values.sink_id);
ReadSetting("Audio", Settings::values.audio_output_device_id);
diff --git a/src/android/app/src/main/jni/default_ini.h b/src/android/app/src/main/jni/default_ini.h
index c5dfaff54e..c929988585 100644
--- a/src/android/app/src/main/jni/default_ini.h
+++ b/src/android/app/src/main/jni/default_ini.h
@@ -328,6 +328,10 @@ shader_backend =
# 0 (default): Off, 1: On
use_asynchronous_shaders =
+# Uses reactive flushing instead of predictive flushing. Allowing a more accurate syncing of memory.
+# 0 (default): Off, 1: On
+use_reactive_flushing =
+
# NVDEC emulation.
# 0: Disabled, 1: CPU Decoding, 2 (default): GPU Decoding
nvdec_emulation =
diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml
index 7dae63dcbc..c236811fad 100644
--- a/src/android/app/src/main/res/values/strings.xml
+++ b/src/android/app/src/main/res/values/strings.xml
@@ -169,6 +169,8 @@
Forces the GPU to run at the maximum possible clocks (thermal constraints will still be applied).
Use asynchronous shaders
Compiles shaders asynchronously, reducing stutter but may introduce glitches.
+ Use reactive flushing
+ Improves rendering accuracy in some games at the cost of performance.
Graphics debugging
Sets the graphics API to a slow debugging mode.
Disk shader cache