aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGamer64 <76565986+Gamer64ytb@users.noreply.github.com>2025-07-09 04:23:07 +0200
committerGamer64 <76565986+Gamer64ytb@users.noreply.github.com>2025-07-09 04:23:22 +0200
commit3e44389bfcde32ce70be2bf17e374c0e50bcc138 (patch)
tree53a879e468f404f92c214772cd0203ab9fa30de0 /src
parent693404bf3755e6e9b09b83bdaccff7423542a081 (diff)
[Rasterizer]: Implement "Skip CPU Inner Invalidation" hack
Diffstat (limited to 'src')
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt1
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt7
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt1
-rw-r--r--src/android/app/src/main/res/values/strings.xml2
-rw-r--r--src/common/settings.h7
-rw-r--r--src/video_core/rasterizer_interface.h7
-rw-r--r--src/yuzu/configuration/shared_translation.cpp5
7 files changed, 28 insertions, 2 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 79cfed1cd0..a558afab47 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"),
+ SKIP_CPU_INNER_INVALIDATION("skip_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 4e206ab541..ec56362f77 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
@@ -657,6 +657,13 @@ abstract class SettingsItem(
)
put(
SwitchSetting(
+ BooleanSetting.SKIP_CPU_INNER_INVALIDATION,
+ titleId = R.string.skip_cpu_inner_invalidation,
+ descriptionId = R.string.skip_cpu_inner_invalidation_description
+ )
+ )
+ put(
+ SwitchSetting(
BooleanSetting.RENDERER_REACTIVE_FLUSHING,
titleId = R.string.renderer_reactive_flushing,
descriptionId = R.string.renderer_reactive_flushing_description
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 430e2f3426..31e2873b58 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
@@ -463,6 +463,7 @@ class SettingsFragmentPresenter(
add(IntSetting.FAST_CPU_TIME.key)
add(BooleanSetting.USE_CUSTOM_CPU_TICKS.key)
add(IntSetting.CPU_TICKS.key)
+ add(BooleanSetting.SKIP_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 658dfedc6b..6f446758b5 100644
--- a/src/android/app/src/main/res/values/strings.xml
+++ b/src/android/app/src/main/res/values/strings.xml
@@ -104,6 +104,8 @@
<string name="custom_cpu_ticks">Custom CPU Ticks</string>
<string name="custom_cpu_ticks_description">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.</string>
<string name="cpu_ticks">Ticks</string>
+ <string name="skip_cpu_inner_invalidation">Skip CPU Inner Invalidation</string>
+ <string name="skip_cpu_inner_invalidation_description">Skips certain CPU-side cache invalidations during memory updates, reducing CPU usage and improving it's performance. This may cause glitches or crashes on some games.</string>
<string name="fast_cpu_time">CPU Clock</string>
<string name="fast_cpu_time_description">Use Boost (1700MHz) to run at the Switch\'s highest native clock, or Fast (2000MHz) to run at 2x clock.</string>
<string name="memory_layout">Memory Layout</string>
diff --git a/src/common/settings.h b/src/common/settings.h
index 2d5a1c4736..941a4513e6 100644
--- a/src/common/settings.h
+++ b/src/common/settings.h
@@ -450,6 +450,13 @@ struct Values {
VramUsageMode::Aggressive,
"vram_usage_mode",
Category::RendererAdvanced};
+ SwitchableSetting<bool> skip_cpu_inner_invalidation{linkage,
+ true,
+ "skip_cpu_inner_invalidation",
+ Category::RendererAdvanced,
+ Specialization::Default,
+ true,
+ true};
SwitchableSetting<bool> async_presentation{linkage,
#ifdef ANDROID
true,
diff --git a/src/video_core/rasterizer_interface.h b/src/video_core/rasterizer_interface.h
index 6e2eccfbf0..481efbf53b 100644
--- a/src/video_core/rasterizer_interface.h
+++ b/src/video_core/rasterizer_interface.h
@@ -9,6 +9,7 @@
#include <utility>
#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,8 +101,10 @@ public:
VideoCommon::CacheType which = VideoCommon::CacheType::All) = 0;
virtual void InnerInvalidation(std::span<const std::pair<DAddr, std::size_t>> sequences) {
- for (const auto& [cpu_addr, size] : sequences) {
- InvalidateRegion(cpu_addr, size);
+ if (!Settings::values.skip_cpu_inner_invalidation.GetValue()) {
+ for (const auto& [cpu_addr, size] : sequences) {
+ InvalidateRegion(cpu_addr, size);
+ }
}
}
diff --git a/src/yuzu/configuration/shared_translation.cpp b/src/yuzu/configuration/shared_translation.cpp
index 2ff2626b6c..c743e65ae3 100644
--- a/src/yuzu/configuration/shared_translation.cpp
+++ b/src/yuzu/configuration/shared_translation.cpp
@@ -250,6 +250,11 @@ std::unique_ptr<TranslationMap> 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,
+ skip_cpu_inner_invalidation,
+ tr("Skip CPU Inner Invalidation"),
+ tr("Skips certain CPU-side cache invalidations during memory updates, reducing CPU usage and "
+ "improving it's performance. This may cause glitches or crashes on some games."));
INSERT(
Settings,
vsync_mode,