diff options
Diffstat (limited to '')
| -rw-r--r-- | src/common/settings.h | 9 | ||||
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic_32.cpp | 22 | ||||
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic_64.cpp | 22 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_cpu.ui | 13 |
4 files changed, 50 insertions, 16 deletions
diff --git a/src/common/settings.h b/src/common/settings.h index bf83186f5..f9988c266 100644 --- a/src/common/settings.h +++ b/src/common/settings.h | |||
| @@ -31,9 +31,10 @@ enum class GPUAccuracy : u32 { | |||
| 31 | }; | 31 | }; |
| 32 | 32 | ||
| 33 | enum class CPUAccuracy : u32 { | 33 | enum class CPUAccuracy : u32 { |
| 34 | Accurate = 0, | 34 | Auto = 0, |
| 35 | Unsafe = 1, | 35 | Accurate = 1, |
| 36 | DebugMode = 2, | 36 | Unsafe = 2, |
| 37 | DebugMode = 3, | ||
| 37 | }; | 38 | }; |
| 38 | 39 | ||
| 39 | /** The BasicSetting class is a simple resource manager. It defines a label and default value | 40 | /** The BasicSetting class is a simple resource manager. It defines a label and default value |
| @@ -284,7 +285,7 @@ struct Values { | |||
| 284 | Setting<bool> use_multi_core{true, "use_multi_core"}; | 285 | Setting<bool> use_multi_core{true, "use_multi_core"}; |
| 285 | 286 | ||
| 286 | // Cpu | 287 | // Cpu |
| 287 | Setting<CPUAccuracy> cpu_accuracy{CPUAccuracy::Accurate, "cpu_accuracy"}; | 288 | Setting<CPUAccuracy> cpu_accuracy{CPUAccuracy::Auto, "cpu_accuracy"}; |
| 288 | 289 | ||
| 289 | BasicSetting<bool> cpuopt_page_tables{true, "cpuopt_page_tables"}; | 290 | BasicSetting<bool> cpuopt_page_tables{true, "cpuopt_page_tables"}; |
| 290 | BasicSetting<bool> cpuopt_block_linking{true, "cpuopt_block_linking"}; | 291 | BasicSetting<bool> cpuopt_block_linking{true, "cpuopt_block_linking"}; |
diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.cpp b/src/core/arm/dynarmic/arm_dynarmic_32.cpp index 77a44f862..23be0447a 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_32.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_32.cpp | |||
| @@ -183,16 +183,30 @@ std::shared_ptr<Dynarmic::A32::Jit> ARM_Dynarmic_32::MakeJit(Common::PageTable* | |||
| 183 | // Unsafe optimizations | 183 | // Unsafe optimizations |
| 184 | if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Unsafe) { | 184 | if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Unsafe) { |
| 185 | config.unsafe_optimizations = true; | 185 | config.unsafe_optimizations = true; |
| 186 | if (Settings::values.cpuopt_unsafe_unfuse_fma.GetValue()) { | 186 | if (Settings::values.cpuopt_unsafe_unfuse_fma) { |
| 187 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA; | 187 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA; |
| 188 | } | 188 | } |
| 189 | if (Settings::values.cpuopt_unsafe_reduce_fp_error.GetValue()) { | 189 | if (Settings::values.cpuopt_unsafe_reduce_fp_error) { |
| 190 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_ReducedErrorFP; | 190 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_ReducedErrorFP; |
| 191 | } | 191 | } |
| 192 | if (Settings::values.cpuopt_unsafe_ignore_standard_fpcr.GetValue()) { | 192 | if (Settings::values.cpuopt_unsafe_ignore_standard_fpcr) { |
| 193 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreStandardFPCRValue; | 193 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreStandardFPCRValue; |
| 194 | } | 194 | } |
| 195 | if (Settings::values.cpuopt_unsafe_inaccurate_nan.GetValue()) { | 195 | if (Settings::values.cpuopt_unsafe_inaccurate_nan) { |
| 196 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN; | ||
| 197 | } | ||
| 198 | } | ||
| 199 | |||
| 200 | // Curated optimizations | ||
| 201 | if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Auto) { | ||
| 202 | config.unsafe_optimizations = true; | ||
| 203 | if (Settings::values.cpuopt_unsafe_unfuse_fma) { | ||
| 204 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA; | ||
| 205 | } | ||
| 206 | if (Settings::values.cpuopt_unsafe_ignore_standard_fpcr) { | ||
| 207 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreStandardFPCRValue; | ||
| 208 | } | ||
| 209 | if (Settings::values.cpuopt_unsafe_inaccurate_nan) { | ||
| 196 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN; | 210 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN; |
| 197 | } | 211 | } |
| 198 | } | 212 | } |
diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.cpp b/src/core/arm/dynarmic/arm_dynarmic_64.cpp index 75332e348..6ff69db2f 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_64.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_64.cpp | |||
| @@ -223,16 +223,30 @@ std::shared_ptr<Dynarmic::A64::Jit> ARM_Dynarmic_64::MakeJit(Common::PageTable* | |||
| 223 | // Unsafe optimizations | 223 | // Unsafe optimizations |
| 224 | if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Unsafe) { | 224 | if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Unsafe) { |
| 225 | config.unsafe_optimizations = true; | 225 | config.unsafe_optimizations = true; |
| 226 | if (Settings::values.cpuopt_unsafe_unfuse_fma.GetValue()) { | 226 | if (Settings::values.cpuopt_unsafe_unfuse_fma) { |
| 227 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA; | 227 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA; |
| 228 | } | 228 | } |
| 229 | if (Settings::values.cpuopt_unsafe_reduce_fp_error.GetValue()) { | 229 | if (Settings::values.cpuopt_unsafe_reduce_fp_error) { |
| 230 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_ReducedErrorFP; | 230 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_ReducedErrorFP; |
| 231 | } | 231 | } |
| 232 | if (Settings::values.cpuopt_unsafe_inaccurate_nan.GetValue()) { | 232 | if (Settings::values.cpuopt_unsafe_inaccurate_nan) { |
| 233 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN; | 233 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN; |
| 234 | } | 234 | } |
| 235 | if (Settings::values.cpuopt_unsafe_fastmem_check.GetValue()) { | 235 | if (Settings::values.cpuopt_unsafe_fastmem_check) { |
| 236 | config.fastmem_address_space_bits = 64; | ||
| 237 | } | ||
| 238 | } | ||
| 239 | |||
| 240 | // Curated optimizations | ||
| 241 | if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Auto) { | ||
| 242 | config.unsafe_optimizations = true; | ||
| 243 | if (Settings::values.cpuopt_unsafe_unfuse_fma) { | ||
| 244 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA; | ||
| 245 | } | ||
| 246 | if (Settings::values.cpuopt_unsafe_inaccurate_nan) { | ||
| 247 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN; | ||
| 248 | } | ||
| 249 | if (Settings::values.cpuopt_unsafe_fastmem_check) { | ||
| 236 | config.fastmem_address_space_bits = 64; | 250 | config.fastmem_address_space_bits = 64; |
| 237 | } | 251 | } |
| 238 | } | 252 | } |
diff --git a/src/yuzu/configuration/configure_cpu.ui b/src/yuzu/configuration/configure_cpu.ui index 0e296d4e5..49e30bdbb 100644 --- a/src/yuzu/configuration/configure_cpu.ui +++ b/src/yuzu/configuration/configure_cpu.ui | |||
| @@ -6,8 +6,8 @@ | |||
| 6 | <rect> | 6 | <rect> |
| 7 | <x>0</x> | 7 | <x>0</x> |
| 8 | <y>0</y> | 8 | <y>0</y> |
| 9 | <width>400</width> | 9 | <width>448</width> |
| 10 | <height>321</height> | 10 | <height>433</height> |
| 11 | </rect> | 11 | </rect> |
| 12 | </property> | 12 | </property> |
| 13 | <property name="windowTitle"> | 13 | <property name="windowTitle"> |
| @@ -17,7 +17,7 @@ | |||
| 17 | <item> | 17 | <item> |
| 18 | <layout class="QVBoxLayout"> | 18 | <layout class="QVBoxLayout"> |
| 19 | <item> | 19 | <item> |
| 20 | <widget class="QGroupBox"> | 20 | <widget class="QGroupBox" name="groupBox"> |
| 21 | <property name="title"> | 21 | <property name="title"> |
| 22 | <string>General</string> | 22 | <string>General</string> |
| 23 | </property> | 23 | </property> |
| @@ -36,6 +36,11 @@ | |||
| 36 | <widget class="QComboBox" name="accuracy"> | 36 | <widget class="QComboBox" name="accuracy"> |
| 37 | <item> | 37 | <item> |
| 38 | <property name="text"> | 38 | <property name="text"> |
| 39 | <string>Auto</string> | ||
| 40 | </property> | ||
| 41 | </item> | ||
| 42 | <item> | ||
| 43 | <property name="text"> | ||
| 39 | <string>Accurate</string> | 44 | <string>Accurate</string> |
| 40 | </property> | 45 | </property> |
| 41 | </item> | 46 | </item> |
| @@ -57,7 +62,7 @@ | |||
| 57 | <item> | 62 | <item> |
| 58 | <widget class="QLabel" name="label_recommended_accuracy"> | 63 | <widget class="QLabel" name="label_recommended_accuracy"> |
| 59 | <property name="text"> | 64 | <property name="text"> |
| 60 | <string>We recommend setting accuracy to "Accurate".</string> | 65 | <string>We recommend setting accuracy to "Auto".</string> |
| 61 | </property> | 66 | </property> |
| 62 | <property name="wordWrap"> | 67 | <property name="wordWrap"> |
| 63 | <bool>false</bool> | 68 | <bool>false</bool> |