From f8a33f85eff5e7c7ee00a85a133e7a6619a285ab Mon Sep 17 00:00:00 2001
From: bunnei <bunneidev@gmail.com>
Date: Mon, 12 Jun 2023 17:56:44 -0700
Subject: [PATCH] android: settings: Add reactive flushing as a
 default-disabled setting.

---
 .../yuzu/yuzu_emu/features/settings/model/IntSetting.kt  | 5 +++++
 .../features/settings/ui/SettingsFragmentPresenter.kt    | 9 +++++++++
 src/android/app/src/main/jni/config.cpp                  | 4 ++++
 src/android/app/src/main/jni/default_ini.h               | 4 ++++
 src/android/app/src/main/res/values/strings.xml          | 2 ++
 5 files changed, 24 insertions(+)

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 @@
     <string name="renderer_force_max_clock_description">Forces the GPU to run at the maximum possible clocks (thermal constraints will still be applied).</string>
     <string name="renderer_asynchronous_shaders">Use asynchronous shaders</string>
     <string name="renderer_asynchronous_shaders_description">Compiles shaders asynchronously, reducing stutter but may introduce glitches.</string>
+    <string name="renderer_reactive_flushing">Use reactive flushing</string>
+    <string name="renderer_reactive_flushing_description">Improves rendering accuracy in some games at the cost of performance.</string>
     <string name="renderer_debug">Graphics debugging</string>
     <string name="renderer_debug_description">Sets the graphics API to a slow debugging mode.</string>
     <string name="use_disk_shader_cache">Disk shader cache</string>