diff options
| -rw-r--r-- | src/common/settings.h | 3 | ||||
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic_32.cpp | 50 | ||||
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic_64.cpp | 50 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_cpu.ui | 5 |
4 files changed, 63 insertions, 45 deletions
diff --git a/src/common/settings.h b/src/common/settings.h index a37d83fb3..86e0fa140 100644 --- a/src/common/settings.h +++ b/src/common/settings.h | |||
| @@ -38,6 +38,7 @@ enum class CPUAccuracy : u32 { | |||
| 38 | Auto = 0, | 38 | Auto = 0, |
| 39 | Accurate = 1, | 39 | Accurate = 1, |
| 40 | Unsafe = 2, | 40 | Unsafe = 2, |
| 41 | Paranoid = 3, | ||
| 41 | }; | 42 | }; |
| 42 | 43 | ||
| 43 | enum class FullscreenMode : u32 { | 44 | enum class FullscreenMode : u32 { |
| @@ -470,7 +471,7 @@ struct Values { | |||
| 470 | 471 | ||
| 471 | // Cpu | 472 | // Cpu |
| 472 | RangedSetting<CPUAccuracy> cpu_accuracy{CPUAccuracy::Auto, CPUAccuracy::Auto, | 473 | RangedSetting<CPUAccuracy> cpu_accuracy{CPUAccuracy::Auto, CPUAccuracy::Auto, |
| 473 | CPUAccuracy::Unsafe, "cpu_accuracy"}; | 474 | CPUAccuracy::Paranoid, "cpu_accuracy"}; |
| 474 | // TODO: remove cpu_accuracy_first_time, migration setting added 8 July 2021 | 475 | // TODO: remove cpu_accuracy_first_time, migration setting added 8 July 2021 |
| 475 | BasicSetting<bool> cpu_accuracy_first_time{true, "cpu_accuracy_first_time"}; | 476 | BasicSetting<bool> cpu_accuracy_first_time{true, "cpu_accuracy_first_time"}; |
| 476 | BasicSetting<bool> cpu_debug_mode{false, "cpu_debug_mode"}; | 477 | BasicSetting<bool> cpu_debug_mode{false, "cpu_debug_mode"}; |
diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.cpp b/src/core/arm/dynarmic/arm_dynarmic_32.cpp index 286976623..d4cbd0c20 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_32.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_32.cpp | |||
| @@ -186,35 +186,41 @@ std::shared_ptr<Dynarmic::A32::Jit> ARM_Dynarmic_32::MakeJit(Common::PageTable* | |||
| 186 | if (!Settings::values.cpuopt_recompile_exclusives) { | 186 | if (!Settings::values.cpuopt_recompile_exclusives) { |
| 187 | config.recompile_on_exclusive_fastmem_failure = false; | 187 | config.recompile_on_exclusive_fastmem_failure = false; |
| 188 | } | 188 | } |
| 189 | } | 189 | } else { |
| 190 | // Unsafe optimizations | ||
| 191 | if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Unsafe) { | ||
| 192 | config.unsafe_optimizations = true; | ||
| 193 | if (Settings::values.cpuopt_unsafe_unfuse_fma) { | ||
| 194 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA; | ||
| 195 | } | ||
| 196 | if (Settings::values.cpuopt_unsafe_reduce_fp_error) { | ||
| 197 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_ReducedErrorFP; | ||
| 198 | } | ||
| 199 | if (Settings::values.cpuopt_unsafe_ignore_standard_fpcr) { | ||
| 200 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreStandardFPCRValue; | ||
| 201 | } | ||
| 202 | if (Settings::values.cpuopt_unsafe_inaccurate_nan) { | ||
| 203 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN; | ||
| 204 | } | ||
| 205 | if (Settings::values.cpuopt_unsafe_ignore_global_monitor) { | ||
| 206 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreGlobalMonitor; | ||
| 207 | } | ||
| 208 | } | ||
| 190 | 209 | ||
| 191 | // Unsafe optimizations | 210 | // Curated optimizations |
| 192 | if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Unsafe) { | 211 | if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Auto) { |
| 193 | config.unsafe_optimizations = true; | 212 | config.unsafe_optimizations = true; |
| 194 | if (Settings::values.cpuopt_unsafe_unfuse_fma) { | ||
| 195 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA; | 213 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA; |
| 196 | } | ||
| 197 | if (Settings::values.cpuopt_unsafe_reduce_fp_error) { | ||
| 198 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_ReducedErrorFP; | ||
| 199 | } | ||
| 200 | if (Settings::values.cpuopt_unsafe_ignore_standard_fpcr) { | ||
| 201 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreStandardFPCRValue; | 214 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreStandardFPCRValue; |
| 202 | } | ||
| 203 | if (Settings::values.cpuopt_unsafe_inaccurate_nan) { | ||
| 204 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN; | 215 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN; |
| 205 | } | ||
| 206 | if (Settings::values.cpuopt_unsafe_ignore_global_monitor) { | ||
| 207 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreGlobalMonitor; | 216 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreGlobalMonitor; |
| 208 | } | 217 | } |
| 209 | } | ||
| 210 | 218 | ||
| 211 | // Curated optimizations | 219 | // Paranoia mode for debugging optimizations |
| 212 | if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Auto) { | 220 | if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Paranoid) { |
| 213 | config.unsafe_optimizations = true; | 221 | config.unsafe_optimizations = false; |
| 214 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA; | 222 | config.optimizations = Dynarmic::no_optimizations; |
| 215 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreStandardFPCRValue; | 223 | } |
| 216 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN; | ||
| 217 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreGlobalMonitor; | ||
| 218 | } | 224 | } |
| 219 | 225 | ||
| 220 | return std::make_unique<Dynarmic::A32::Jit>(config); | 226 | 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 d96226c41..a2d893450 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_64.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_64.cpp | |||
| @@ -246,35 +246,41 @@ std::shared_ptr<Dynarmic::A64::Jit> ARM_Dynarmic_64::MakeJit(Common::PageTable* | |||
| 246 | if (!Settings::values.cpuopt_recompile_exclusives) { | 246 | if (!Settings::values.cpuopt_recompile_exclusives) { |
| 247 | config.recompile_on_exclusive_fastmem_failure = false; | 247 | config.recompile_on_exclusive_fastmem_failure = false; |
| 248 | } | 248 | } |
| 249 | } | 249 | } else { |
| 250 | // Unsafe optimizations | ||
| 251 | if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Unsafe) { | ||
| 252 | config.unsafe_optimizations = true; | ||
| 253 | if (Settings::values.cpuopt_unsafe_unfuse_fma) { | ||
| 254 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA; | ||
| 255 | } | ||
| 256 | if (Settings::values.cpuopt_unsafe_reduce_fp_error) { | ||
| 257 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_ReducedErrorFP; | ||
| 258 | } | ||
| 259 | if (Settings::values.cpuopt_unsafe_inaccurate_nan) { | ||
| 260 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN; | ||
| 261 | } | ||
| 262 | if (Settings::values.cpuopt_unsafe_fastmem_check) { | ||
| 263 | config.fastmem_address_space_bits = 64; | ||
| 264 | } | ||
| 265 | if (Settings::values.cpuopt_unsafe_ignore_global_monitor) { | ||
| 266 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreGlobalMonitor; | ||
| 267 | } | ||
| 268 | } | ||
| 250 | 269 | ||
| 251 | // Unsafe optimizations | 270 | // Curated optimizations |
| 252 | if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Unsafe) { | 271 | if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Auto) { |
| 253 | config.unsafe_optimizations = true; | 272 | config.unsafe_optimizations = true; |
| 254 | if (Settings::values.cpuopt_unsafe_unfuse_fma) { | ||
| 255 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA; | 273 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA; |
| 256 | } | ||
| 257 | if (Settings::values.cpuopt_unsafe_reduce_fp_error) { | ||
| 258 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_ReducedErrorFP; | ||
| 259 | } | ||
| 260 | if (Settings::values.cpuopt_unsafe_inaccurate_nan) { | ||
| 261 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN; | 274 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN; |
| 262 | } | ||
| 263 | if (Settings::values.cpuopt_unsafe_fastmem_check) { | ||
| 264 | config.fastmem_address_space_bits = 64; | 275 | config.fastmem_address_space_bits = 64; |
| 265 | } | ||
| 266 | if (Settings::values.cpuopt_unsafe_ignore_global_monitor) { | ||
| 267 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreGlobalMonitor; | 276 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreGlobalMonitor; |
| 268 | } | 277 | } |
| 269 | } | ||
| 270 | 278 | ||
| 271 | // Curated optimizations | 279 | // Paranoia mode for debugging optimizations |
| 272 | if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Auto) { | 280 | if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Paranoid) { |
| 273 | config.unsafe_optimizations = true; | 281 | config.unsafe_optimizations = false; |
| 274 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA; | 282 | config.optimizations = Dynarmic::no_optimizations; |
| 275 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN; | 283 | } |
| 276 | config.fastmem_address_space_bits = 64; | ||
| 277 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreGlobalMonitor; | ||
| 278 | } | 284 | } |
| 279 | 285 | ||
| 280 | return std::make_shared<Dynarmic::A64::Jit>(config); | 286 | return std::make_shared<Dynarmic::A64::Jit>(config); |
diff --git a/src/yuzu/configuration/configure_cpu.ui b/src/yuzu/configuration/configure_cpu.ui index 5d80a8c91..2888395d4 100644 --- a/src/yuzu/configuration/configure_cpu.ui +++ b/src/yuzu/configuration/configure_cpu.ui | |||
| @@ -52,6 +52,11 @@ | |||
| 52 | <string>Unsafe</string> | 52 | <string>Unsafe</string> |
| 53 | </property> | 53 | </property> |
| 54 | </item> | 54 | </item> |
| 55 | <item> | ||
| 56 | <property name="text"> | ||
| 57 | <string>Paranoid</string> | ||
| 58 | </property> | ||
| 59 | </item> | ||
| 55 | </widget> | 60 | </widget> |
| 56 | </item> | 61 | </item> |
| 57 | </layout> | 62 | </layout> |