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 dd9b03f28e..b53a557d1a 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/shared_translation.cpp b/src/qt_common/shared_translation.cpp index 054d28e8e2..910d0c0404 100644 --- a/src/qt_common/shared_translation.cpp +++ b/src/qt_common/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 b825348760..fbeceaaa0d 100644 --- a/src/yuzu/configuration/configure_debug.cpp +++ b/src/yuzu/configuration/configure_debug.cpp @@ -62,8 +62,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); @@ -106,7 +104,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