From 9fae048a5a2c63777c080f0c432d31997de7478a Mon Sep 17 00:00:00 2001 From: CamilleLaVey Date: Wed, 27 Aug 2025 21:28:23 +0200 Subject: [PATCH 01/12] revert [jit] Increase x86_64 default code size to full 2GiB hugepage (#318) (#337) revert [jit] Increase x86_64 default code size to full 2GiB hugepage (#318) Abuses the existence of transparent huge pages on Unix. 4*2 = 8GiB virtual memory used total by JIT. May reduce native host TLB trees. -------------- WIP: Wasn't meant to be merged, it's going to be refined to be added later when more data/ testing have been made about this approach. Signed-off-by: lizzie Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/318 Reviewed-by: Shinmegumi Co-authored-by: lizzie Co-committed-by: lizzie Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/337 Co-authored-by: CamilleLaVey Co-committed-by: CamilleLaVey --- src/core/arm/dynarmic/arm_dynarmic_32.cpp | 2 +- src/core/arm/dynarmic/arm_dynarmic_64.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.cpp b/src/core/arm/dynarmic/arm_dynarmic_32.cpp index db159388bf..1731ef1aec 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_32.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_32.cpp @@ -215,7 +215,7 @@ std::shared_ptr ArmDynarmic32::MakeJit(Common::PageTable* pa #ifdef ARCHITECTURE_arm64 config.code_cache_size = std::uint32_t(128_MiB); #else - config.code_cache_size = std::uint32_t(2_GiB); + config.code_cache_size = std::uint32_t(512_MiB); #endif // Allow memory fault handling to work diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.cpp b/src/core/arm/dynarmic/arm_dynarmic_64.cpp index dcff0ddf3f..9674e88d9d 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_64.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_64.cpp @@ -273,7 +273,7 @@ std::shared_ptr ArmDynarmic64::MakeJit(Common::PageTable* pa #ifdef ARCHITECTURE_arm64 config.code_cache_size = std::uint32_t(128_MiB); #else - config.code_cache_size = std::uint32_t(2_GiB); + config.code_cache_size = std::uint32_t(512_MiB); #endif // Allow memory fault handling to work From 445d0b5cb702bfba803ac47a0fc158d674d81dc4 Mon Sep 17 00:00:00 2001 From: MaranBr Date: Tue, 26 Aug 2025 17:18:14 -0400 Subject: [PATCH 02/12] Add an option to control Host MMU Emulation --- src/common/settings.cpp | 3 +++ src/common/settings.h | 9 +++++++++ src/core/arm/dynarmic/arm_dynarmic_32.cpp | 4 ++++ src/core/arm/dynarmic/arm_dynarmic_64.cpp | 4 ++++ src/yuzu/configuration/shared_translation.cpp | 2 ++ 5 files changed, 22 insertions(+) diff --git a/src/common/settings.cpp b/src/common/settings.cpp index 63d46722ea..105e1510f5 100644 --- a/src/common/settings.cpp +++ b/src/common/settings.cpp @@ -158,6 +158,9 @@ bool IsFastmemEnabled() { if (values.cpu_debug_mode) { return static_cast(values.cpuopt_fastmem); } + if (Settings::values.cpu_accuracy.GetValue() == Settings::CpuAccuracy::Unsafe) { + return static_cast(values.cpuopt_unsafe_mmu); + } return true; } diff --git a/src/common/settings.h b/src/common/settings.h index b846f41318..c503707fd5 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -299,6 +299,15 @@ struct Values { Category::CpuDebug}; Setting cpuopt_ignore_memory_aborts{linkage, true, "cpuopt_ignore_memory_aborts", Category::CpuDebug}; + + SwitchableSetting cpuopt_unsafe_mmu{linkage, +#if defined(_WIN32) || defined(__linux__) || defined(__ANDROID__) + true, +#else + false, +#endif + "cpuopt_unsafe_mmu", + Category::CpuUnsafe}; SwitchableSetting cpuopt_unsafe_unfuse_fma{linkage, true, "cpuopt_unsafe_unfuse_fma", Category::CpuUnsafe}; SwitchableSetting cpuopt_unsafe_reduce_fp_error{ diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.cpp b/src/core/arm/dynarmic/arm_dynarmic_32.cpp index 1731ef1aec..b769b86909 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_32.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_32.cpp @@ -272,6 +272,10 @@ std::shared_ptr ArmDynarmic32::MakeJit(Common::PageTable* pa // Unsafe optimizations if (Settings::values.cpu_accuracy.GetValue() == Settings::CpuAccuracy::Unsafe) { config.unsafe_optimizations = true; + if (!Settings::values.cpuopt_unsafe_mmu) { + config.fastmem_pointer = nullptr; + config.fastmem_exclusive_access = false; + } if (Settings::values.cpuopt_unsafe_unfuse_fma) { config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA; } diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.cpp b/src/core/arm/dynarmic/arm_dynarmic_64.cpp index 9674e88d9d..56fbea031b 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_64.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_64.cpp @@ -330,6 +330,10 @@ std::shared_ptr ArmDynarmic64::MakeJit(Common::PageTable* pa // Unsafe optimizations if (Settings::values.cpu_accuracy.GetValue() == Settings::CpuAccuracy::Unsafe) { config.unsafe_optimizations = true; + if (!Settings::values.cpuopt_unsafe_mmu) { + config.fastmem_pointer = nullptr; + config.fastmem_exclusive_access = false; + } if (Settings::values.cpuopt_unsafe_unfuse_fma) { config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA; } diff --git a/src/yuzu/configuration/shared_translation.cpp b/src/yuzu/configuration/shared_translation.cpp index f6d590c0ee..61a1881b67 100644 --- a/src/yuzu/configuration/shared_translation.cpp +++ b/src/yuzu/configuration/shared_translation.cpp @@ -118,6 +118,8 @@ std::unique_ptr InitializeTranslations(QWidget* parent) // Cpu Debug // Cpu Unsafe + INSERT(Settings, cpuopt_unsafe_mmu, tr("Enable Host MMU Emulation"), + tr("This optimization speeds up memory accesses by the guest program.\nEnabling it causes guest memory reads/writes to be done directly into memory and make use of Host's MMU.\nDisabling this forces all memory accesses to use Software MMU Emulation.")); INSERT( Settings, cpuopt_unsafe_unfuse_fma, From fe737b7cfe33dfbd78b969c24ba6dc7b9f16a6cf Mon Sep 17 00:00:00 2001 From: MaranBr Date: Tue, 26 Aug 2025 18:09:10 -0400 Subject: [PATCH 03/12] Fix build --- src/core/arm/dynarmic/arm_dynarmic_32.cpp | 8 ++++++-- src/core/arm/dynarmic/arm_dynarmic_64.cpp | 6 +++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.cpp b/src/core/arm/dynarmic/arm_dynarmic_32.cpp index b769b86909..da0c4160f9 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_32.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_32.cpp @@ -273,7 +273,7 @@ std::shared_ptr ArmDynarmic32::MakeJit(Common::PageTable* pa if (Settings::values.cpu_accuracy.GetValue() == Settings::CpuAccuracy::Unsafe) { config.unsafe_optimizations = true; if (!Settings::values.cpuopt_unsafe_mmu) { - config.fastmem_pointer = nullptr; + config.fastmem_pointer = std::nullopt; config.fastmem_exclusive_access = false; } if (Settings::values.cpuopt_unsafe_unfuse_fma) { @@ -296,13 +296,17 @@ std::shared_ptr ArmDynarmic32::MakeJit(Common::PageTable* pa // Curated optimizations if (Settings::values.cpu_accuracy.GetValue() == Settings::CpuAccuracy::Auto) { config.unsafe_optimizations = true; +#if defined(_WIN32) || defined(__linux__) || defined(__ANDROID__) + config.fastmem_pointer = std::nullopt; + config.fastmem_exclusive_access = false; +#endif config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA; config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreStandardFPCRValue; config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN; config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreGlobalMonitor; } - // Paranoia mode for debugging optimizations + // Paranoid mode for debugging optimizations if (Settings::values.cpu_accuracy.GetValue() == Settings::CpuAccuracy::Paranoid) { config.unsafe_optimizations = false; config.optimizations = Dynarmic::no_optimizations; diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.cpp b/src/core/arm/dynarmic/arm_dynarmic_64.cpp index 56fbea031b..6a2cb528ca 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_64.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_64.cpp @@ -331,7 +331,7 @@ std::shared_ptr ArmDynarmic64::MakeJit(Common::PageTable* pa if (Settings::values.cpu_accuracy.GetValue() == Settings::CpuAccuracy::Unsafe) { config.unsafe_optimizations = true; if (!Settings::values.cpuopt_unsafe_mmu) { - config.fastmem_pointer = nullptr; + config.fastmem_pointer = std::nullopt; config.fastmem_exclusive_access = false; } if (Settings::values.cpuopt_unsafe_unfuse_fma) { @@ -354,6 +354,10 @@ std::shared_ptr ArmDynarmic64::MakeJit(Common::PageTable* pa // Curated optimizations if (Settings::values.cpu_accuracy.GetValue() == Settings::CpuAccuracy::Auto) { config.unsafe_optimizations = true; +#if defined(_WIN32) || defined(__linux__) || defined(__ANDROID__) + config.fastmem_pointer = std::nullopt; + config.fastmem_exclusive_access = false; +#endif config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA; config.fastmem_address_space_bits = 64; config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreGlobalMonitor; From 2d4bdf30df3aba30f1e71e3a6ad6f5c7771d5e62 Mon Sep 17 00:00:00 2001 From: MaranBr Date: Tue, 26 Aug 2025 18:14:17 -0400 Subject: [PATCH 04/12] Fix logic --- src/common/settings.cpp | 3 +++ src/common/settings.h | 6 +++--- src/core/arm/dynarmic/arm_dynarmic_32.cpp | 2 +- src/core/arm/dynarmic/arm_dynarmic_64.cpp | 2 +- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/common/settings.cpp b/src/common/settings.cpp index 105e1510f5..fdba7be99e 100644 --- a/src/common/settings.cpp +++ b/src/common/settings.cpp @@ -161,6 +161,9 @@ bool IsFastmemEnabled() { if (Settings::values.cpu_accuracy.GetValue() == Settings::CpuAccuracy::Unsafe) { return static_cast(values.cpuopt_unsafe_mmu); } +#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__sun__) + return false; +#endif return true; } diff --git a/src/common/settings.h b/src/common/settings.h index c503707fd5..c2f1562011 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -301,10 +301,10 @@ struct Values { Category::CpuDebug}; SwitchableSetting cpuopt_unsafe_mmu{linkage, -#if defined(_WIN32) || defined(__linux__) || defined(__ANDROID__) - true, -#else +#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__sun__) false, +#else + true, #endif "cpuopt_unsafe_mmu", Category::CpuUnsafe}; diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.cpp b/src/core/arm/dynarmic/arm_dynarmic_32.cpp index da0c4160f9..b530f8cd09 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_32.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_32.cpp @@ -296,7 +296,7 @@ std::shared_ptr ArmDynarmic32::MakeJit(Common::PageTable* pa // Curated optimizations if (Settings::values.cpu_accuracy.GetValue() == Settings::CpuAccuracy::Auto) { config.unsafe_optimizations = true; -#if defined(_WIN32) || defined(__linux__) || defined(__ANDROID__) +#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__sun__) config.fastmem_pointer = std::nullopt; config.fastmem_exclusive_access = false; #endif diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.cpp b/src/core/arm/dynarmic/arm_dynarmic_64.cpp index 6a2cb528ca..7e7fec01c4 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_64.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_64.cpp @@ -354,7 +354,7 @@ std::shared_ptr ArmDynarmic64::MakeJit(Common::PageTable* pa // Curated optimizations if (Settings::values.cpu_accuracy.GetValue() == Settings::CpuAccuracy::Auto) { config.unsafe_optimizations = true; -#if defined(_WIN32) || defined(__linux__) || defined(__ANDROID__) +#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__sun__) config.fastmem_pointer = std::nullopt; config.fastmem_exclusive_access = false; #endif From 456ad8b8ba56791362e3185ce1fe385f2f542a64 Mon Sep 17 00:00:00 2001 From: crueter Date: Tue, 26 Aug 2025 20:48:43 -0400 Subject: [PATCH 05/12] [desktop] fix unsafe configuration groupbox visibility Signed-off-by: crueter --- src/yuzu/configuration/configure_cpu.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/yuzu/configuration/configure_cpu.cpp b/src/yuzu/configuration/configure_cpu.cpp index 74def6fc60..17081a81bc 100644 --- a/src/yuzu/configuration/configure_cpu.cpp +++ b/src/yuzu/configuration/configure_cpu.cpp @@ -91,14 +91,11 @@ void ConfigureCpu::Setup(const ConfigurationShared::Builder& builder) { } UpdateGroup(accuracy_combobox->currentIndex()); - UpdateGroup(backend_combobox->currentIndex()); } void ConfigureCpu::UpdateGroup(int index) { - const auto accuracy = static_cast( - combobox_translations.at(Settings::EnumMetadata::Index())[index] - .first); - ui->unsafe_group->setVisible(accuracy == Settings::CpuAccuracy::Unsafe); + // TODO(crueter): see if this works on NCE + ui->unsafe_group->setVisible(index == (int) Settings::CpuAccuracy::Unsafe); } void ConfigureCpu::ApplyConfiguration() { From 15fe07b85e2dda200b12ae0b87996e52c7acd78c Mon Sep 17 00:00:00 2001 From: crueter Date: Tue, 26 Aug 2025 20:50:03 -0400 Subject: [PATCH 06/12] [desktop] explicitly reference fastmem for unsafe_mmu Signed-off-by: crueter --- src/yuzu/configuration/shared_translation.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/yuzu/configuration/shared_translation.cpp b/src/yuzu/configuration/shared_translation.cpp index 61a1881b67..2795c9191e 100644 --- a/src/yuzu/configuration/shared_translation.cpp +++ b/src/yuzu/configuration/shared_translation.cpp @@ -118,7 +118,7 @@ std::unique_ptr InitializeTranslations(QWidget* parent) // Cpu Debug // Cpu Unsafe - INSERT(Settings, cpuopt_unsafe_mmu, tr("Enable Host MMU Emulation"), + INSERT(Settings, cpuopt_unsafe_mmu, tr("Enable Host MMU Emulation (fastmem)"), tr("This optimization speeds up memory accesses by the guest program.\nEnabling it causes guest memory reads/writes to be done directly into memory and make use of Host's MMU.\nDisabling this forces all memory accesses to use Software MMU Emulation.")); INSERT( Settings, From bcb10bc818edde07712f9a0bef97e1027c172d59 Mon Sep 17 00:00:00 2001 From: MaranBr Date: Tue, 26 Aug 2025 21:04:24 -0400 Subject: [PATCH 07/12] Restore deleted code --- src/yuzu/configuration/configure_cpu.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/yuzu/configuration/configure_cpu.cpp b/src/yuzu/configuration/configure_cpu.cpp index 17081a81bc..40657e9d7d 100644 --- a/src/yuzu/configuration/configure_cpu.cpp +++ b/src/yuzu/configuration/configure_cpu.cpp @@ -91,6 +91,7 @@ void ConfigureCpu::Setup(const ConfigurationShared::Builder& builder) { } UpdateGroup(accuracy_combobox->currentIndex()); + UpdateGroup(backend_combobox->currentIndex()); } void ConfigureCpu::UpdateGroup(int index) { From f26bde2f184692f08213dcea2138ba8dba71a4c5 Mon Sep 17 00:00:00 2001 From: MaranBr Date: Tue, 26 Aug 2025 21:09:01 -0400 Subject: [PATCH 08/12] Change variable name to better match the purpose of the option --- src/common/settings.cpp | 2 +- src/common/settings.h | 4 ++-- src/core/arm/dynarmic/arm_dynarmic_32.cpp | 2 +- src/core/arm/dynarmic/arm_dynarmic_64.cpp | 2 +- src/yuzu/configuration/shared_translation.cpp | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/common/settings.cpp b/src/common/settings.cpp index fdba7be99e..19140bce0d 100644 --- a/src/common/settings.cpp +++ b/src/common/settings.cpp @@ -159,7 +159,7 @@ bool IsFastmemEnabled() { return static_cast(values.cpuopt_fastmem); } if (Settings::values.cpu_accuracy.GetValue() == Settings::CpuAccuracy::Unsafe) { - return static_cast(values.cpuopt_unsafe_mmu); + return static_cast(values.cpuopt_unsafe_host_mmu); } #if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__sun__) return false; diff --git a/src/common/settings.h b/src/common/settings.h index c2f1562011..d2411c3e5a 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -300,13 +300,13 @@ struct Values { Setting cpuopt_ignore_memory_aborts{linkage, true, "cpuopt_ignore_memory_aborts", Category::CpuDebug}; - SwitchableSetting cpuopt_unsafe_mmu{linkage, + SwitchableSetting cpuopt_unsafe_host_mmu{linkage, #if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__sun__) false, #else true, #endif - "cpuopt_unsafe_mmu", + "cpuopt_unsafe_host_mmu", Category::CpuUnsafe}; SwitchableSetting cpuopt_unsafe_unfuse_fma{linkage, true, "cpuopt_unsafe_unfuse_fma", Category::CpuUnsafe}; diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.cpp b/src/core/arm/dynarmic/arm_dynarmic_32.cpp index b530f8cd09..5e798e8442 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_32.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_32.cpp @@ -272,7 +272,7 @@ std::shared_ptr ArmDynarmic32::MakeJit(Common::PageTable* pa // Unsafe optimizations if (Settings::values.cpu_accuracy.GetValue() == Settings::CpuAccuracy::Unsafe) { config.unsafe_optimizations = true; - if (!Settings::values.cpuopt_unsafe_mmu) { + if (!Settings::values.cpuopt_unsafe_host_mmu) { config.fastmem_pointer = std::nullopt; config.fastmem_exclusive_access = false; } diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.cpp b/src/core/arm/dynarmic/arm_dynarmic_64.cpp index 7e7fec01c4..4331c88be1 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_64.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_64.cpp @@ -330,7 +330,7 @@ std::shared_ptr ArmDynarmic64::MakeJit(Common::PageTable* pa // Unsafe optimizations if (Settings::values.cpu_accuracy.GetValue() == Settings::CpuAccuracy::Unsafe) { config.unsafe_optimizations = true; - if (!Settings::values.cpuopt_unsafe_mmu) { + if (!Settings::values.cpuopt_unsafe_host_mmu) { config.fastmem_pointer = std::nullopt; config.fastmem_exclusive_access = false; } diff --git a/src/yuzu/configuration/shared_translation.cpp b/src/yuzu/configuration/shared_translation.cpp index 2795c9191e..fca4c94893 100644 --- a/src/yuzu/configuration/shared_translation.cpp +++ b/src/yuzu/configuration/shared_translation.cpp @@ -118,7 +118,7 @@ std::unique_ptr InitializeTranslations(QWidget* parent) // Cpu Debug // Cpu Unsafe - INSERT(Settings, cpuopt_unsafe_mmu, tr("Enable Host MMU Emulation (fastmem)"), + INSERT(Settings, cpuopt_unsafe_host_mmu, tr("Enable Host MMU Emulation (fastmem)"), tr("This optimization speeds up memory accesses by the guest program.\nEnabling it causes guest memory reads/writes to be done directly into memory and make use of Host's MMU.\nDisabling this forces all memory accesses to use Software MMU Emulation.")); INSERT( Settings, From 4b99f720600d3fb3969733ce0cfd25a62c900f85 Mon Sep 17 00:00:00 2001 From: MaranBr Date: Tue, 26 Aug 2025 21:59:03 -0400 Subject: [PATCH 09/12] Fix a little mistake --- src/yuzu/configuration/configure_cpu.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/yuzu/configuration/configure_cpu.cpp b/src/yuzu/configuration/configure_cpu.cpp index 40657e9d7d..17081a81bc 100644 --- a/src/yuzu/configuration/configure_cpu.cpp +++ b/src/yuzu/configuration/configure_cpu.cpp @@ -91,7 +91,6 @@ void ConfigureCpu::Setup(const ConfigurationShared::Builder& builder) { } UpdateGroup(accuracy_combobox->currentIndex()); - UpdateGroup(backend_combobox->currentIndex()); } void ConfigureCpu::UpdateGroup(int index) { From 5741ed51644d59e87ca892978a656b0cb98f6c9e Mon Sep 17 00:00:00 2001 From: crueter Date: Tue, 26 Aug 2025 22:09:13 -0400 Subject: [PATCH 10/12] fix backend Signed-off-by: crueter --- src/yuzu/configuration/configure_cpu.cpp | 9 ++++++--- src/yuzu/configuration/configure_cpu.h | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/yuzu/configuration/configure_cpu.cpp b/src/yuzu/configuration/configure_cpu.cpp index 17081a81bc..6407efbb26 100644 --- a/src/yuzu/configuration/configure_cpu.cpp +++ b/src/yuzu/configuration/configure_cpu.cpp @@ -90,12 +90,15 @@ void ConfigureCpu::Setup(const ConfigurationShared::Builder& builder) { unsafe_layout->addWidget(widget); } - UpdateGroup(accuracy_combobox->currentIndex()); + UpdateGroup(); } -void ConfigureCpu::UpdateGroup(int index) { +void ConfigureCpu::UpdateGroup() +{ + const u32 accuracy = accuracy_combobox->currentIndex(); + const u32 backend = backend_combobox->currentIndex(); // TODO(crueter): see if this works on NCE - ui->unsafe_group->setVisible(index == (int) Settings::CpuAccuracy::Unsafe); + ui->unsafe_group->setVisible(accuracy == (u32) Settings::CpuAccuracy::Unsafe && backend == (u32) Settings::CpuBackend::Dynarmic); } void ConfigureCpu::ApplyConfiguration() { diff --git a/src/yuzu/configuration/configure_cpu.h b/src/yuzu/configuration/configure_cpu.h index 7bbeac4963..098e0e397b 100644 --- a/src/yuzu/configuration/configure_cpu.h +++ b/src/yuzu/configuration/configure_cpu.h @@ -39,7 +39,7 @@ private: void changeEvent(QEvent* event) override; void RetranslateUI(); - void UpdateGroup(int index); + void UpdateGroup(); void Setup(const ConfigurationShared::Builder& builder); From 2840ddc398e65c17ffafa9a5d8c181530cc455ff Mon Sep 17 00:00:00 2001 From: PavelBARABANOV Date: Wed, 27 Aug 2025 21:38:49 +0300 Subject: [PATCH 11/12] android toggle --- .../yuzu_emu/features/settings/model/BooleanSetting.kt | 1 + .../yuzu_emu/features/settings/model/view/SettingsItem.kt | 7 +++++++ .../features/settings/ui/SettingsFragmentPresenter.kt | 1 + src/android/app/src/main/res/values/strings.xml | 2 ++ 4 files changed, 11 insertions(+) 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 21a159676d..30f859a761 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 @@ -18,6 +18,7 @@ enum class BooleanSetting(override val key: String) : AbstractBooleanSetting { USE_FAST_CPU_TIME("use_fast_cpu_time"), USE_CUSTOM_CPU_TICKS("use_custom_cpu_ticks"), SKIP_CPU_INNER_INVALIDATION("skip_cpu_inner_invalidation"), + CPUOPT_UNSAFE_MMU("cpuopt_unsafe_mmu"), 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 062038aa44..e7a749176c 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 @@ -673,6 +673,13 @@ abstract class SettingsItem( descriptionId = R.string.skip_cpu_inner_invalidation_description ) ) + put( + SwitchSetting( + BooleanSetting.CPUOPT_UNSAFE_MMU, + titleId = R.string.cpuopt_unsafe_mmu, + descriptionId = R.string.cpuopt_unsafe_mmu_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 672bcd492c..97a074266d 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 @@ -466,6 +466,7 @@ class SettingsFragmentPresenter( add(BooleanSetting.USE_CUSTOM_CPU_TICKS.key) add(IntSetting.CPU_TICKS.key) add(BooleanSetting.SKIP_CPU_INNER_INVALIDATION.key) + add(BooleanSetting.CPUOPT_UNSAFE_MMU.key) add(BooleanSetting.USE_LRU_CACHE.key) add(BooleanSetting.CORE_SYNC_CORE_SPEED.key) add(BooleanSetting.SYNC_MEMORY_OPERATIONS.key) diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index 975bd1741a..15a6feccf2 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -109,6 +109,8 @@ Ticks Skip CPU Inner Invalidation 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. + Enable Host MMU Emulation + This optimization speeds up memory accesses by the guest program.\nEnabling it causes guest memory reads/writes to be done directly into memory and make use of Host's MMU. Disabling this forces all memory accesses to use Software MMU Emulation. CPU Clock Use Boost (1700MHz) to run at the Switch\'s highest native clock, or Fast (2000MHz) to run at 2x clock. Memory Layout From 927328b2fb3d5274ac0d65c185ebb49e3ab4c0dd Mon Sep 17 00:00:00 2001 From: PavelBARABANOV Date: Wed, 27 Aug 2025 22:09:07 +0300 Subject: [PATCH 12/12] fix toggle --- .../yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt | 2 +- .../yuzu_emu/features/settings/model/view/SettingsItem.kt | 6 +++--- .../features/settings/ui/SettingsFragmentPresenter.kt | 2 +- src/android/app/src/main/res/values/strings.xml | 4 ++-- src/common/settings.h | 5 ++++- 5 files changed, 11 insertions(+), 8 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 30f859a761..d91c026acf 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 @@ -18,7 +18,7 @@ enum class BooleanSetting(override val key: String) : AbstractBooleanSetting { USE_FAST_CPU_TIME("use_fast_cpu_time"), USE_CUSTOM_CPU_TICKS("use_custom_cpu_ticks"), SKIP_CPU_INNER_INVALIDATION("skip_cpu_inner_invalidation"), - CPUOPT_UNSAFE_MMU("cpuopt_unsafe_mmu"), + CPUOPT_UNSAFE_HOST_MMU("cpuopt_unsafe_host_mmu"), 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 e7a749176c..a689b6ce76 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 @@ -675,9 +675,9 @@ abstract class SettingsItem( ) put( SwitchSetting( - BooleanSetting.CPUOPT_UNSAFE_MMU, - titleId = R.string.cpuopt_unsafe_mmu, - descriptionId = R.string.cpuopt_unsafe_mmu_description + BooleanSetting.CPUOPT_UNSAFE_HOST_MMU, + titleId = R.string.cpuopt_unsafe_host_mmu, + descriptionId = R.string.cpuopt_unsafe_host_mmu_description ) ) put( 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 97a074266d..14d62ceec3 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 @@ -466,7 +466,7 @@ class SettingsFragmentPresenter( add(BooleanSetting.USE_CUSTOM_CPU_TICKS.key) add(IntSetting.CPU_TICKS.key) add(BooleanSetting.SKIP_CPU_INNER_INVALIDATION.key) - add(BooleanSetting.CPUOPT_UNSAFE_MMU.key) + add(BooleanSetting.CPUOPT_UNSAFE_HOST_MMU.key) add(BooleanSetting.USE_LRU_CACHE.key) add(BooleanSetting.CORE_SYNC_CORE_SPEED.key) add(BooleanSetting.SYNC_MEMORY_OPERATIONS.key) diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index 15a6feccf2..f73fc1d9aa 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -109,8 +109,8 @@ Ticks Skip CPU Inner Invalidation 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. - Enable Host MMU Emulation - This optimization speeds up memory accesses by the guest program.\nEnabling it causes guest memory reads/writes to be done directly into memory and make use of Host's MMU. Disabling this forces all memory accesses to use Software MMU Emulation. + Enable Host MMU Emulation + This optimization speeds up memory accesses by the guest program. Enabling it causes guest memory reads/writes to be done directly into memory and make use of Host\'s MMU. Disabling this forces all memory accesses to use Software MMU Emulation. 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 d2411c3e5a..1142087858 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -307,7 +307,10 @@ struct Values { true, #endif "cpuopt_unsafe_host_mmu", - Category::CpuUnsafe}; + Category::CpuUnsafe, + Specialization::Default, + true, + true}; SwitchableSetting cpuopt_unsafe_unfuse_fma{linkage, true, "cpuopt_unsafe_unfuse_fma", Category::CpuUnsafe}; SwitchableSetting cpuopt_unsafe_reduce_fp_error{