From 92c38b97f73f00b3d02079eb5537fdac89ed738f Mon Sep 17 00:00:00 2001
From: Gamer64 <76565986+Gamer64ytb@users.noreply.github.com>
Date: Mon, 30 Jun 2025 17:22:17 +0200
Subject: [PATCH] Add a Toggle for CPU Inner invalidation
---
.../yuzu_emu/features/settings/model/BooleanSetting.kt | 1 +
.../features/settings/model/view/SettingsItem.kt | 7 +++++++
.../features/settings/ui/SettingsFragmentPresenter.kt | 1 +
src/android/app/src/main/res/values/strings.xml | 2 ++
src/common/settings.h | 1 +
src/video_core/rasterizer_interface.h | 9 ++++++---
src/yuzu/configuration/shared_translation.cpp | 6 ++++++
7 files changed, 24 insertions(+), 3 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 21dc51513d..09bb948801 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
@@ -17,6 +17,7 @@ enum class BooleanSetting(override val key: String) : AbstractBooleanSetting {
RENDERER_USE_SPEED_LIMIT("use_speed_limit"),
USE_FAST_CPU_TIME("use_fast_cpu_time"),
USE_CUSTOM_CPU_TICKS("use_custom_cpu_ticks"),
+ CPU_INNER_INVALIDATION("cpu_inner_invalidation"),
USE_DOCKED_MODE("use_docked_mode"),
USE_AUTO_STUB("use_auto_stub"),
RENDERER_USE_DISK_SHADER_CACHE("use_disk_shader_cache"),
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 6ec678717b..e843515c21 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
@@ -638,6 +638,13 @@ abstract class SettingsItem(
max = 65535
)
)
+ put(
+ SwitchSetting(
+ BooleanSetting.CPU_INNER_INVALIDATION,
+ titleId = R.string.cpu_inner_invalidation,
+ descriptionId = R.string.cpu_inner_invalidation_description
+ )
+ )
put(
SwitchSetting(
BooleanSetting.RENDERER_REACTIVE_FLUSHING,
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 a6110a354a..5f8779f50d 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
@@ -462,6 +462,7 @@ class SettingsFragmentPresenter(
add(IntSetting.FAST_CPU_TIME.key)
add(BooleanSetting.USE_CUSTOM_CPU_TICKS.key)
add(IntSetting.CPU_TICKS.key)
+ add(BooleanSetting.CPU_INNER_INVALIDATION.key)
add(BooleanSetting.USE_LRU_CACHE.key)
add(BooleanSetting.CORE_SYNC_CORE_SPEED.key)
add(IntSetting.MEMORY_LAYOUT.key)
diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml
index 01d4d83e27..e0442518d8 100644
--- a/src/android/app/src/main/res/values/strings.xml
+++ b/src/android/app/src/main/res/values/strings.xml
@@ -99,6 +99,8 @@
Custom CPU Ticks
Set a custom value of CPU ticks. Higher values can increase performance, but may also cause the game to freeze. A range of 77–21000 is recommended.
Ticks
+ CPU Inner Invalidation
+ Ensures that any memory regions that are marked for invalidation get cleared from the cache. Reduces the performance, as long as invalidating memory regions takes up valuable processing time and CPU resources, and having it off may cause glitches on some games.
CPU Clock
Use Boost (1700MHz) to run at the Switch\'s highest native clock, or Fast (2000MHz) to run at 2x clock.
Memory Layout
diff --git a/src/common/settings.h b/src/common/settings.h
index 2d5a1c4736..81da4baabb 100644
--- a/src/common/settings.h
+++ b/src/common/settings.h
@@ -450,6 +450,7 @@ struct Values {
VramUsageMode::Aggressive,
"vram_usage_mode",
Category::RendererAdvanced};
+ SwitchableSetting cpu_inner_invalidation{linkage, false, "cpu_inner_invalidation", Category::RendererAdvanced};
SwitchableSetting async_presentation{linkage,
#ifdef ANDROID
true,
diff --git a/src/video_core/rasterizer_interface.h b/src/video_core/rasterizer_interface.h
index 949feeb4f5..45b3c16386 100644
--- a/src/video_core/rasterizer_interface.h
+++ b/src/video_core/rasterizer_interface.h
@@ -9,6 +9,7 @@
#include
#include "common/common_types.h"
#include "common/polyfill_thread.h"
+#include "common/settings.h"
#include "video_core/cache_types.h"
#include "video_core/engines/fermi_2d.h"
#include "video_core/gpu.h"
@@ -100,9 +101,11 @@ public:
VideoCommon::CacheType which = VideoCommon::CacheType::All) = 0;
virtual void InnerInvalidation(std::span> sequences) {
- /*for (const auto& [cpu_addr, size] : sequences) {
- InvalidateRegion(cpu_addr, size);
- }*/
+ if (Settings::values.cpu_inner_invalidation.GetValue()) {
+ for (const auto& [cpu_addr, size] : sequences) {
+ InvalidateRegion(cpu_addr, size);
+ }
+ }
}
/// Notify rasterizer that any caches of the specified region are desync with guest
diff --git a/src/yuzu/configuration/shared_translation.cpp b/src/yuzu/configuration/shared_translation.cpp
index 2ff2626b6c..da27f53b11 100644
--- a/src/yuzu/configuration/shared_translation.cpp
+++ b/src/yuzu/configuration/shared_translation.cpp
@@ -250,6 +250,12 @@ std::unique_ptr InitializeTranslations(QWidget* parent)
"of available video memory for performance. Has no effect on integrated graphics. "
"Aggressive mode may severely impact the performance of other applications such as "
"recording software."));
+ INSERT(Settings,
+ cpu_inner_invalidation,
+ tr("CPU Inner Invalidation"),
+ tr("Ensures that any memory regions that are marked for invalidation get cleared from the cache.\n"
+ "Reduces the performance, as long as invalidating memory regions takes up valuable processing "
+ "time and CPU resources, and having it off may cause glitches on some games."));
INSERT(
Settings,
vsync_mode,