diff options
| author | Gamer64 <76565986+Gamer64ytb@users.noreply.github.com> | 2025-07-09 04:23:07 +0200 |
|---|---|---|
| committer | Gamer64 <76565986+Gamer64ytb@users.noreply.github.com> | 2025-07-09 04:23:22 +0200 |
| commit | 3e44389bfcde32ce70be2bf17e374c0e50bcc138 (patch) | |
| tree | 53a879e468f404f92c214772cd0203ab9fa30de0 | |
| parent | 693404bf3755e6e9b09b83bdaccff7423542a081 (diff) | |
[Rasterizer]: Implement "Skip CPU Inner Invalidation" hack
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, |
