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 b26fb1dec5..e9fe2be53c 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 @@ -10,7 +10,6 @@ import org.yuzu.yuzu_emu.utils.NativeConfig enum class BooleanSetting(override val key: String) : AbstractBooleanSetting { AUDIO_MUTED("audio_muted"), - CPU_DEBUG_MODE("cpu_debug_mode"), FASTMEM("cpuopt_fastmem"), FASTMEM_EXCLUSIVES("cpuopt_fastmem_exclusives"), CORE_SYNC_CORE_SPEED("sync_core_speed"), 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 ebc726225a..8c35155e78 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 @@ -764,13 +764,6 @@ abstract class SettingsItem( descriptionId = R.string.use_auto_stub_description ) ) - put( - SwitchSetting( - BooleanSetting.CPU_DEBUG_MODE, - titleId = R.string.cpu_debug_mode, - descriptionId = R.string.cpu_debug_mode_description - ) - ) val fastmem = object : AbstractBooleanSetting { override fun getBoolean(needsGlobal: Boolean): Boolean = @@ -784,7 +777,6 @@ abstract class SettingsItem( override val key: String = FASTMEM_COMBINED override val isRuntimeModifiable: Boolean = false - override val pairedSettingKey = BooleanSetting.CPU_DEBUG_MODE.key override val defaultValue: Boolean = true override val isSwitchable: Boolean = true override var global: Boolean 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 0d882a7f01..d39c0c49bb 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 @@ -1158,7 +1158,6 @@ class SettingsFragmentPresenter( add(IntSetting.CPU_BACKEND.key) add(IntSetting.CPU_ACCURACY.key) add(BooleanSetting.USE_AUTO_STUB.key) - add(BooleanSetting.CPU_DEBUG_MODE.key) add(SettingsItem.FASTMEM_COMBINED) add(HeaderSetting(R.string.log)) diff --git a/src/android/app/src/main/res/values/arrays.xml b/src/android/app/src/main/res/values/arrays.xml index 2150d401db..60d4593665 100644 --- a/src/android/app/src/main/res/values/arrays.xml +++ b/src/android/app/src/main/res/values/arrays.xml @@ -333,6 +333,7 @@ @string/cpu_accuracy_accurate @string/cpu_accuracy_unsafe @string/cpu_accuracy_paranoid + @string/cpu_accuracy_debugging @@ -340,6 +341,7 @@ 1 2 3 + 4 diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index 00206a5df5..50dc68e000 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -543,8 +543,6 @@ CPU - CPU Debugging - Puts the CPU in a slow debugging mode. Use Auto Stub Automatically stub missing services and functions. This may improve compatibility but can cause crashes and stability issues. @@ -1050,6 +1048,7 @@ Accurate Unsafe Paranoid + Debugging D-pad diff --git a/src/common/settings.cpp b/src/common/settings.cpp index b849d7cb6a..e817acc36e 100644 --- a/src/common/settings.cpp +++ b/src/common/settings.cpp @@ -163,11 +163,11 @@ bool IsDMALevelSafe() { } bool IsFastmemEnabled() { - if (values.cpu_debug_mode) { - return static_cast(values.cpuopt_fastmem); + if (values.cpu_accuracy.GetValue() == Settings::CpuAccuracy::Debugging) { + return bool(values.cpuopt_fastmem); } if (values.cpu_accuracy.GetValue() == CpuAccuracy::Unsafe) { - return static_cast(values.cpuopt_unsafe_host_mmu); + return bool(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 22602a8afd..4eea9cf265 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -275,9 +275,6 @@ struct Values { true, true, &use_custom_cpu_ticks}; - - SwitchableSetting cpu_debug_mode{linkage, false, "cpu_debug_mode", Category::CpuDebug}; - Setting cpuopt_page_tables{linkage, true, "cpuopt_page_tables", Category::CpuDebug}; Setting cpuopt_block_linking{linkage, true, "cpuopt_block_linking", Category::CpuDebug}; Setting cpuopt_return_stack_buffer{linkage, true, "cpuopt_return_stack_buffer", diff --git a/src/common/settings_enums.h b/src/common/settings_enums.h index ccf6f1cfb2..c8a5fc7bd9 100644 --- a/src/common/settings_enums.h +++ b/src/common/settings_enums.h @@ -136,7 +136,7 @@ ENUM(ShaderBackend, Glsl, Glasm, SpirV); ENUM(GpuAccuracy, Normal, High, Extreme); ENUM(DmaAccuracy, Default, Unsafe, Safe); ENUM(CpuBackend, Dynarmic, Nce); -ENUM(CpuAccuracy, Auto, Accurate, Unsafe, Paranoid); +ENUM(CpuAccuracy, Auto, Accurate, Unsafe, Paranoid, Debugging); ENUM(CpuClock, Boost, Fast) ENUM(MemoryLayout, Memory_4Gb, Memory_6Gb, Memory_8Gb, Memory_10Gb, Memory_12Gb); ENUM(ConfirmStop, Ask_Always, Ask_Based_On_Game, Ask_Never); diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.cpp b/src/core/arm/dynarmic/arm_dynarmic_32.cpp index d2035d0fe0..3c72ab2396 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_32.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_32.cpp @@ -229,7 +229,8 @@ std::shared_ptr ArmDynarmic32::MakeJit(Common::PageTable* pa } // Safe optimizations - if (Settings::values.cpu_debug_mode) { + switch (Settings::values.cpu_accuracy.GetValue()) { + case Settings::CpuAccuracy::Debugging: if (!Settings::values.cpuopt_page_tables) { config.page_table = nullptr; } @@ -267,51 +268,51 @@ std::shared_ptr ArmDynarmic32::MakeJit(Common::PageTable* pa if (!Settings::values.cpuopt_ignore_memory_aborts) { config.check_halt_on_memory_access = true; } - } else { - // Unsafe optimizations - if (Settings::values.cpu_accuracy.GetValue() == Settings::CpuAccuracy::Unsafe) { - config.unsafe_optimizations = true; - if (!Settings::values.cpuopt_unsafe_host_mmu) { - config.fastmem_pointer = std::nullopt; - config.fastmem_exclusive_access = false; - } - if (Settings::values.cpuopt_unsafe_unfuse_fma) { - config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA; - } - if (Settings::values.cpuopt_unsafe_reduce_fp_error) { - config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_ReducedErrorFP; - } - if (Settings::values.cpuopt_unsafe_ignore_standard_fpcr) { - config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreStandardFPCRValue; - } - if (Settings::values.cpuopt_unsafe_inaccurate_nan) { - config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN; - } - if (Settings::values.cpuopt_unsafe_ignore_global_monitor) { - config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreGlobalMonitor; - } - } - - // Curated optimizations - if (Settings::values.cpu_accuracy.GetValue() == Settings::CpuAccuracy::Auto) { - config.unsafe_optimizations = true; -#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__sun__) + break; + // Unsafe optimizations + case Settings::CpuAccuracy::Unsafe: + config.unsafe_optimizations = true; + if (!Settings::values.cpuopt_unsafe_host_mmu) { config.fastmem_pointer = std::nullopt; config.fastmem_exclusive_access = false; -#endif + } + if (Settings::values.cpuopt_unsafe_unfuse_fma) { config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA; + } + if (Settings::values.cpuopt_unsafe_reduce_fp_error) { + config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_ReducedErrorFP; + } + if (Settings::values.cpuopt_unsafe_ignore_standard_fpcr) { config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreStandardFPCRValue; + } + if (Settings::values.cpuopt_unsafe_inaccurate_nan) { config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN; + } + if (Settings::values.cpuopt_unsafe_ignore_global_monitor) { config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreGlobalMonitor; } - - // Paranoia mode for debugging optimizations - if (Settings::values.cpu_accuracy.GetValue() == Settings::CpuAccuracy::Paranoid) { - config.unsafe_optimizations = false; - config.optimizations = Dynarmic::no_optimizations; - } + break; + // Curated optimizations + case Settings::CpuAccuracy::Auto: + config.unsafe_optimizations = true; +#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__sun__) + 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; + break; + // Paranoia mode for debugging optimizations + case Settings::CpuAccuracy::Paranoid: + config.unsafe_optimizations = false; + config.optimizations = Dynarmic::no_optimizations; + break; + case Settings::CpuAccuracy::Accurate: + default: + break; } - return std::make_unique(config); } diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.cpp b/src/core/arm/dynarmic/arm_dynarmic_64.cpp index 438b7b691c..707d51d2a2 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_64.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_64.cpp @@ -287,8 +287,9 @@ std::shared_ptr ArmDynarmic64::MakeJit(Common::PageTable* pa config.code_cache_size = std::uint32_t(8_MiB); } - // Safe optimizations - if (Settings::values.cpu_debug_mode) { + switch (Settings::values.cpu_accuracy.GetValue()) { + // Debug mode + case Settings::CpuAccuracy::Debugging: if (!Settings::values.cpuopt_page_tables) { config.page_table = nullptr; } @@ -326,50 +327,50 @@ std::shared_ptr ArmDynarmic64::MakeJit(Common::PageTable* pa if (!Settings::values.cpuopt_ignore_memory_aborts) { config.check_halt_on_memory_access = true; } - } else { - // Unsafe optimizations - if (Settings::values.cpu_accuracy.GetValue() == Settings::CpuAccuracy::Unsafe) { - config.unsafe_optimizations = true; - if (!Settings::values.cpuopt_unsafe_host_mmu) { - config.fastmem_pointer = std::nullopt; - config.fastmem_exclusive_access = false; - } - if (Settings::values.cpuopt_unsafe_unfuse_fma) { - config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA; - } - if (Settings::values.cpuopt_unsafe_reduce_fp_error) { - config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_ReducedErrorFP; - } - if (Settings::values.cpuopt_unsafe_inaccurate_nan) { - config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN; - } - if (Settings::values.cpuopt_unsafe_fastmem_check) { - config.fastmem_address_space_bits = 64; - } - if (Settings::values.cpuopt_unsafe_ignore_global_monitor) { - config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreGlobalMonitor; - } - } - - // Curated optimizations - if (Settings::values.cpu_accuracy.GetValue() == Settings::CpuAccuracy::Auto) { - config.unsafe_optimizations = true; -#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__sun__) + break; + // Unsafe optimizations + case Settings::CpuAccuracy::Unsafe: + config.unsafe_optimizations = true; + if (!Settings::values.cpuopt_unsafe_host_mmu) { config.fastmem_pointer = std::nullopt; config.fastmem_exclusive_access = false; -#endif + } + if (Settings::values.cpuopt_unsafe_unfuse_fma) { config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA; + } + if (Settings::values.cpuopt_unsafe_reduce_fp_error) { + config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_ReducedErrorFP; + } + if (Settings::values.cpuopt_unsafe_inaccurate_nan) { + config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN; + } + if (Settings::values.cpuopt_unsafe_fastmem_check) { config.fastmem_address_space_bits = 64; + } + if (Settings::values.cpuopt_unsafe_ignore_global_monitor) { config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreGlobalMonitor; } - - // Paranoia mode for debugging optimizations - if (Settings::values.cpu_accuracy.GetValue() == Settings::CpuAccuracy::Paranoid) { - config.unsafe_optimizations = false; - config.optimizations = Dynarmic::no_optimizations; - } + break; + // Safe optimisations + case Settings::CpuAccuracy::Auto: + config.unsafe_optimizations = true; +#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__sun__) + 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; + break; + // Paranoia mode for debugging optimizations + case Settings::CpuAccuracy::Paranoid: + config.unsafe_optimizations = false; + config.optimizations = Dynarmic::no_optimizations; + break; + case Settings::CpuAccuracy::Accurate: + default: + break; } - return std::make_shared(config); } diff --git a/src/qt_common/config/shared_translation.cpp b/src/qt_common/config/shared_translation.cpp index 9bd2fa6868..1957614208 100644 --- a/src/qt_common/config/shared_translation.cpp +++ b/src/qt_common/config/shared_translation.cpp @@ -510,6 +510,7 @@ std::unique_ptr ComboboxEnumeration(QObject* parent) PAIR(CpuAccuracy, Accurate, tr("Accurate")), PAIR(CpuAccuracy, Unsafe, tr("Unsafe")), PAIR(CpuAccuracy, Paranoid, tr("Paranoid (disables most optimizations)")), + PAIR(CpuAccuracy, Debugging, tr("Debugging")), }}); translations->insert({Settings::EnumMetadata::Index(), { diff --git a/src/yuzu/configuration/configure_debug.cpp b/src/yuzu/configuration/configure_debug.cpp index 0ee82853fc..70fd90734f 100644 --- a/src/yuzu/configuration/configure_debug.cpp +++ b/src/yuzu/configuration/configure_debug.cpp @@ -61,8 +61,6 @@ void ConfigureDebug::SetConfiguration() { ui->enable_graphics_debugging->setChecked(Settings::values.renderer_debug.GetValue()); ui->enable_shader_feedback->setEnabled(runtime_lock); ui->enable_shader_feedback->setChecked(Settings::values.renderer_shader_feedback.GetValue()); - ui->enable_cpu_debugging->setEnabled(runtime_lock); - ui->enable_cpu_debugging->setChecked(Settings::values.cpu_debug_mode.GetValue()); ui->enable_nsight_aftermath->setEnabled(runtime_lock); ui->enable_nsight_aftermath->setChecked(Settings::values.enable_nsight_aftermath.GetValue()); ui->dump_shaders->setEnabled(runtime_lock); @@ -103,7 +101,6 @@ void ConfigureDebug::ApplyConfiguration() { Settings::values.enable_renderdoc_hotkey = ui->enable_renderdoc_hotkey->isChecked(); Settings::values.disable_buffer_reorder = ui->disable_buffer_reorder->isChecked(); Settings::values.renderer_shader_feedback = ui->enable_shader_feedback->isChecked(); - Settings::values.cpu_debug_mode = ui->enable_cpu_debugging->isChecked(); Settings::values.enable_nsight_aftermath = ui->enable_nsight_aftermath->isChecked(); Settings::values.dump_shaders = ui->dump_shaders->isChecked(); Settings::values.dump_macros = ui->dump_macros->isChecked(); diff --git a/src/yuzu/configuration/configure_debug.ui b/src/yuzu/configuration/configure_debug.ui index bd7125712c..1f302bf118 100644 --- a/src/yuzu/configuration/configure_debug.ui +++ b/src/yuzu/configuration/configure_debug.ui @@ -435,13 +435,6 @@ - - - - Enable CPU Debugging - - - @@ -582,7 +575,6 @@ fs_access_log reporting_services quest_flag - enable_cpu_debugging use_debug_asserts