aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorlizzie <lizzie@eden-emu.dev>2025-10-17 22:09:19 +0200
committercrueter <crueter@eden-emu.dev>2025-10-17 22:09:19 +0200
commitc0fb872d1a63bacca6cfc5528de140fa363191ba (patch)
tree7939efa279a8c5f63ca6adb4a9cb0e42a4bb90b8 /src
parent171a1d23e4d1e65a5932de58277917c22a7d4fc8 (diff)
[arm] Add "debugging" cpu accuracy option to replace CPU debug toggle (#2640)
The debug toggle and the CPU accuracy options are mutually exclusive, if debug toggle on => cpu accuracy is ignored, if debug toggle off => cpu accuracy is used. So just add it to cpu accuracy and avoid the extra hassle. Signed-off-by: lizzie <lizzie@eden-emu.dev> Co-authored-by: crueter <crueter@eden-emu.dev> Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2640 Reviewed-by: crueter <crueter@eden-emu.dev> Co-authored-by: lizzie <lizzie@eden-emu.dev> Co-committed-by: lizzie <lizzie@eden-emu.dev>
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.kt8
-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/arrays.xml2
-rw-r--r--src/android/app/src/main/res/values/strings.xml3
-rw-r--r--src/common/settings.cpp6
-rw-r--r--src/common/settings.h3
-rw-r--r--src/common/settings_enums.h2
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_32.cpp77
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_64.cpp79
-rw-r--r--src/qt_common/config/shared_translation.cpp1
-rw-r--r--src/yuzu/configuration/configure_debug.cpp3
-rw-r--r--src/yuzu/configuration/configure_debug.ui8
13 files changed, 87 insertions, 107 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 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 @@
<item>@string/cpu_accuracy_accurate</item>
<item>@string/cpu_accuracy_unsafe</item>
<item>@string/cpu_accuracy_paranoid</item>
+ <item>@string/cpu_accuracy_debugging</item>
</string-array>
<integer-array name="cpuAccuracyValues">
@@ -340,6 +341,7 @@
<item>1</item>
<item>2</item>
<item>3</item>
+ <item>4</item>
</integer-array>
<string-array name="gamepadButtons">
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 @@
<!-- Debug settings strings -->
<string name="cpu">CPU</string>
- <string name="cpu_debug_mode">CPU Debugging</string>
- <string name="cpu_debug_mode_description">Puts the CPU in a slow debugging mode.</string>
<string name="use_auto_stub">Use Auto Stub</string>
<string name="use_auto_stub_description">Automatically stub missing services and functions. This may improve compatibility but can cause crashes and stability issues.</string>
@@ -1050,6 +1048,7 @@
<string name="cpu_accuracy_accurate">Accurate</string>
<string name="cpu_accuracy_unsafe">Unsafe</string>
<string name="cpu_accuracy_paranoid">Paranoid</string>
+ <string name="cpu_accuracy_debugging">Debugging</string>
<!-- Gamepad Buttons -->
<string name="gamepad_d_pad">D-pad</string>
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<bool>(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<bool>(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<bool> cpu_debug_mode{linkage, false, "cpu_debug_mode", Category::CpuDebug};
-
Setting<bool> cpuopt_page_tables{linkage, true, "cpuopt_page_tables", Category::CpuDebug};
Setting<bool> cpuopt_block_linking{linkage, true, "cpuopt_block_linking", Category::CpuDebug};
Setting<bool> 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<Dynarmic::A32::Jit> 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<Dynarmic::A32::Jit> 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;
- 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;
+ if (Settings::values.cpuopt_unsafe_ignore_global_monitor) {
+ config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreGlobalMonitor;
}
+ 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<Dynarmic::A32::Jit>(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<Dynarmic::A64::Jit> 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<Dynarmic::A64::Jit> 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;
- 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;
+ if (Settings::values.cpuopt_unsafe_ignore_global_monitor) {
+ config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreGlobalMonitor;
}
+ 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<Dynarmic::A64::Jit>(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<ComboboxTranslationMap> 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<Settings::CpuBackend>::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 @@
</property>
</widget>
</item>
- <item row="1" column="0">
- <widget class="QCheckBox" name="enable_cpu_debugging">
- <property name="text">
- <string>Enable CPU Debugging</string>
- </property>
- </widget>
- </item>
<item row="2" column="0">
<widget class="QCheckBox" name="use_debug_asserts">
<property name="text">
@@ -582,7 +575,6 @@
<tabstop>fs_access_log</tabstop>
<tabstop>reporting_services</tabstop>
<tabstop>quest_flag</tabstop>
- <tabstop>enable_cpu_debugging</tabstop>
<tabstop>use_debug_asserts</tabstop>
</tabstops>
<resources/>