diff options
| author | 2021-05-15 20:46:48 -0400 | |
|---|---|---|
| committer | 2021-05-15 20:46:48 -0400 | |
| commit | e169fdad4f89675f5b56a3ca5004d593792426a0 (patch) | |
| tree | e52425c637fd16bacb4ee72fa18922c10b0fc5b9 /src | |
| parent | Merge pull request #6300 from Morph1984/mbedtls (diff) | |
| download | yuzu-e169fdad4f89675f5b56a3ca5004d593792426a0.tar.gz yuzu-e169fdad4f89675f5b56a3ca5004d593792426a0.tar.xz yuzu-e169fdad4f89675f5b56a3ca5004d593792426a0.zip | |
general: Make CPU accuracy and related a Settings::Setting
Required to make CPU accuracy and unsafe settings available to use as a
per-game setting.
Diffstat (limited to 'src')
| -rw-r--r-- | src/common/settings.cpp | 2 | ||||
| -rw-r--r-- | src/common/settings.h | 8 | ||||
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic_32.cpp | 10 | ||||
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic_64.cpp | 10 | ||||
| -rw-r--r-- | src/yuzu/configuration/config.cpp | 33 | ||||
| -rw-r--r-- | src/yuzu/configuration/config.h | 1 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_cpu.cpp | 24 |
7 files changed, 47 insertions, 41 deletions
diff --git a/src/common/settings.cpp b/src/common/settings.cpp index 702b6598d..b9a549c81 100644 --- a/src/common/settings.cpp +++ b/src/common/settings.cpp | |||
| @@ -42,7 +42,7 @@ void LogSettings() { | |||
| 42 | log_setting("System_RegionIndex", values.region_index.GetValue()); | 42 | log_setting("System_RegionIndex", values.region_index.GetValue()); |
| 43 | log_setting("System_TimeZoneIndex", values.time_zone_index.GetValue()); | 43 | log_setting("System_TimeZoneIndex", values.time_zone_index.GetValue()); |
| 44 | log_setting("Core_UseMultiCore", values.use_multi_core.GetValue()); | 44 | log_setting("Core_UseMultiCore", values.use_multi_core.GetValue()); |
| 45 | log_setting("CPU_Accuracy", values.cpu_accuracy); | 45 | log_setting("CPU_Accuracy", values.cpu_accuracy.GetValue()); |
| 46 | log_setting("Renderer_UseResolutionFactor", values.resolution_factor.GetValue()); | 46 | log_setting("Renderer_UseResolutionFactor", values.resolution_factor.GetValue()); |
| 47 | log_setting("Renderer_UseFrameLimit", values.use_frame_limit.GetValue()); | 47 | log_setting("Renderer_UseFrameLimit", values.use_frame_limit.GetValue()); |
| 48 | log_setting("Renderer_FrameLimit", values.frame_limit.GetValue()); | 48 | log_setting("Renderer_FrameLimit", values.frame_limit.GetValue()); |
diff --git a/src/common/settings.h b/src/common/settings.h index d39b4aa45..68dc2ea7d 100644 --- a/src/common/settings.h +++ b/src/common/settings.h | |||
| @@ -115,7 +115,7 @@ struct Values { | |||
| 115 | Setting<bool> use_multi_core; | 115 | Setting<bool> use_multi_core; |
| 116 | 116 | ||
| 117 | // Cpu | 117 | // Cpu |
| 118 | CPUAccuracy cpu_accuracy; | 118 | Setting<CPUAccuracy> cpu_accuracy; |
| 119 | 119 | ||
| 120 | bool cpuopt_page_tables; | 120 | bool cpuopt_page_tables; |
| 121 | bool cpuopt_block_linking; | 121 | bool cpuopt_block_linking; |
| @@ -126,9 +126,9 @@ struct Values { | |||
| 126 | bool cpuopt_misc_ir; | 126 | bool cpuopt_misc_ir; |
| 127 | bool cpuopt_reduce_misalign_checks; | 127 | bool cpuopt_reduce_misalign_checks; |
| 128 | 128 | ||
| 129 | bool cpuopt_unsafe_unfuse_fma; | 129 | Setting<bool> cpuopt_unsafe_unfuse_fma; |
| 130 | bool cpuopt_unsafe_reduce_fp_error; | 130 | Setting<bool> cpuopt_unsafe_reduce_fp_error; |
| 131 | bool cpuopt_unsafe_inaccurate_nan; | 131 | Setting<bool> cpuopt_unsafe_inaccurate_nan; |
| 132 | 132 | ||
| 133 | // Renderer | 133 | // Renderer |
| 134 | Setting<RendererBackend> renderer_backend; | 134 | Setting<RendererBackend> renderer_backend; |
diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.cpp b/src/core/arm/dynarmic/arm_dynarmic_32.cpp index 42a37e84f..3535a3d11 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_32.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_32.cpp | |||
| @@ -142,7 +142,7 @@ std::shared_ptr<Dynarmic::A32::Jit> ARM_Dynarmic_32::MakeJit(Common::PageTable* | |||
| 142 | config.far_code_offset = 256 * 1024 * 1024; | 142 | config.far_code_offset = 256 * 1024 * 1024; |
| 143 | 143 | ||
| 144 | // Safe optimizations | 144 | // Safe optimizations |
| 145 | if (Settings::values.cpu_accuracy == Settings::CPUAccuracy::DebugMode) { | 145 | if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::DebugMode) { |
| 146 | if (!Settings::values.cpuopt_page_tables) { | 146 | if (!Settings::values.cpuopt_page_tables) { |
| 147 | config.page_table = nullptr; | 147 | config.page_table = nullptr; |
| 148 | } | 148 | } |
| @@ -170,15 +170,15 @@ std::shared_ptr<Dynarmic::A32::Jit> ARM_Dynarmic_32::MakeJit(Common::PageTable* | |||
| 170 | } | 170 | } |
| 171 | 171 | ||
| 172 | // Unsafe optimizations | 172 | // Unsafe optimizations |
| 173 | if (Settings::values.cpu_accuracy == Settings::CPUAccuracy::Unsafe) { | 173 | if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Unsafe) { |
| 174 | config.unsafe_optimizations = true; | 174 | config.unsafe_optimizations = true; |
| 175 | if (Settings::values.cpuopt_unsafe_unfuse_fma) { | 175 | if (Settings::values.cpuopt_unsafe_unfuse_fma.GetValue()) { |
| 176 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA; | 176 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA; |
| 177 | } | 177 | } |
| 178 | if (Settings::values.cpuopt_unsafe_reduce_fp_error) { | 178 | if (Settings::values.cpuopt_unsafe_reduce_fp_error.GetValue()) { |
| 179 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_ReducedErrorFP; | 179 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_ReducedErrorFP; |
| 180 | } | 180 | } |
| 181 | if (Settings::values.cpuopt_unsafe_inaccurate_nan) { | 181 | if (Settings::values.cpuopt_unsafe_inaccurate_nan.GetValue()) { |
| 182 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN; | 182 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN; |
| 183 | } | 183 | } |
| 184 | } | 184 | } |
diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.cpp b/src/core/arm/dynarmic/arm_dynarmic_64.cpp index 653bb7a77..7e1f654db 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_64.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_64.cpp | |||
| @@ -182,7 +182,7 @@ std::shared_ptr<Dynarmic::A64::Jit> ARM_Dynarmic_64::MakeJit(Common::PageTable* | |||
| 182 | config.far_code_offset = 256 * 1024 * 1024; | 182 | config.far_code_offset = 256 * 1024 * 1024; |
| 183 | 183 | ||
| 184 | // Safe optimizations | 184 | // Safe optimizations |
| 185 | if (Settings::values.cpu_accuracy == Settings::CPUAccuracy::DebugMode) { | 185 | if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::DebugMode) { |
| 186 | if (!Settings::values.cpuopt_page_tables) { | 186 | if (!Settings::values.cpuopt_page_tables) { |
| 187 | config.page_table = nullptr; | 187 | config.page_table = nullptr; |
| 188 | } | 188 | } |
| @@ -210,15 +210,15 @@ std::shared_ptr<Dynarmic::A64::Jit> ARM_Dynarmic_64::MakeJit(Common::PageTable* | |||
| 210 | } | 210 | } |
| 211 | 211 | ||
| 212 | // Unsafe optimizations | 212 | // Unsafe optimizations |
| 213 | if (Settings::values.cpu_accuracy == Settings::CPUAccuracy::Unsafe) { | 213 | if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Unsafe) { |
| 214 | config.unsafe_optimizations = true; | 214 | config.unsafe_optimizations = true; |
| 215 | if (Settings::values.cpuopt_unsafe_unfuse_fma) { | 215 | if (Settings::values.cpuopt_unsafe_unfuse_fma.GetValue()) { |
| 216 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA; | 216 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA; |
| 217 | } | 217 | } |
| 218 | if (Settings::values.cpuopt_unsafe_reduce_fp_error) { | 218 | if (Settings::values.cpuopt_unsafe_reduce_fp_error.GetValue()) { |
| 219 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_ReducedErrorFP; | 219 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_ReducedErrorFP; |
| 220 | } | 220 | } |
| 221 | if (Settings::values.cpuopt_unsafe_inaccurate_nan) { | 221 | if (Settings::values.cpuopt_unsafe_inaccurate_nan.GetValue()) { |
| 222 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN; | 222 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN; |
| 223 | } | 223 | } |
| 224 | } | 224 | } |
diff --git a/src/yuzu/configuration/config.cpp b/src/yuzu/configuration/config.cpp index e80a3df77..24d46c7cc 100644 --- a/src/yuzu/configuration/config.cpp +++ b/src/yuzu/configuration/config.cpp | |||
| @@ -737,8 +737,7 @@ void Config::ReadCpuValues() { | |||
| 737 | qt_config->beginGroup(QStringLiteral("Cpu")); | 737 | qt_config->beginGroup(QStringLiteral("Cpu")); |
| 738 | 738 | ||
| 739 | if (global) { | 739 | if (global) { |
| 740 | Settings::values.cpu_accuracy = static_cast<Settings::CPUAccuracy>( | 740 | ReadSettingGlobal(Settings::values.cpu_accuracy, QStringLiteral("cpu_accuracy"), 0); |
| 741 | ReadSetting(QStringLiteral("cpu_accuracy"), 0).toInt()); | ||
| 742 | 741 | ||
| 743 | Settings::values.cpuopt_page_tables = | 742 | Settings::values.cpuopt_page_tables = |
| 744 | ReadSetting(QStringLiteral("cpuopt_page_tables"), true).toBool(); | 743 | ReadSetting(QStringLiteral("cpuopt_page_tables"), true).toBool(); |
| @@ -757,12 +756,12 @@ void Config::ReadCpuValues() { | |||
| 757 | Settings::values.cpuopt_reduce_misalign_checks = | 756 | Settings::values.cpuopt_reduce_misalign_checks = |
| 758 | ReadSetting(QStringLiteral("cpuopt_reduce_misalign_checks"), true).toBool(); | 757 | ReadSetting(QStringLiteral("cpuopt_reduce_misalign_checks"), true).toBool(); |
| 759 | 758 | ||
| 760 | Settings::values.cpuopt_unsafe_unfuse_fma = | 759 | ReadSettingGlobal(Settings::values.cpuopt_unsafe_unfuse_fma, |
| 761 | ReadSetting(QStringLiteral("cpuopt_unsafe_unfuse_fma"), true).toBool(); | 760 | QStringLiteral("cpuopt_unsafe_unfuse_fma"), true); |
| 762 | Settings::values.cpuopt_unsafe_reduce_fp_error = | 761 | ReadSettingGlobal(Settings::values.cpuopt_unsafe_reduce_fp_error, |
| 763 | ReadSetting(QStringLiteral("cpuopt_unsafe_reduce_fp_error"), true).toBool(); | 762 | QStringLiteral("cpuopt_unsafe_reduce_fp_error"), true); |
| 764 | Settings::values.cpuopt_unsafe_inaccurate_nan = | 763 | ReadSettingGlobal(Settings::values.cpuopt_unsafe_inaccurate_nan, |
| 765 | ReadSetting(QStringLiteral("cpuopt_unsafe_inaccurate_nan"), true).toBool(); | 764 | QStringLiteral("cpuopt_unsafe_inaccurate_nan"), true); |
| 766 | } | 765 | } |
| 767 | 766 | ||
| 768 | qt_config->endGroup(); | 767 | qt_config->endGroup(); |
| @@ -1314,8 +1313,10 @@ void Config::SaveCpuValues() { | |||
| 1314 | qt_config->beginGroup(QStringLiteral("Cpu")); | 1313 | qt_config->beginGroup(QStringLiteral("Cpu")); |
| 1315 | 1314 | ||
| 1316 | if (global) { | 1315 | if (global) { |
| 1317 | WriteSetting(QStringLiteral("cpu_accuracy"), | 1316 | WriteSettingGlobal(QStringLiteral("cpu_accuracy"), |
| 1318 | static_cast<int>(Settings::values.cpu_accuracy), 0); | 1317 | static_cast<u32>(Settings::values.cpu_accuracy.GetValue(global)), |
| 1318 | Settings::values.renderer_backend.UsingGlobal(), | ||
| 1319 | static_cast<u32>(Settings::CPUAccuracy::Accurate)); | ||
| 1319 | 1320 | ||
| 1320 | WriteSetting(QStringLiteral("cpuopt_page_tables"), Settings::values.cpuopt_page_tables, | 1321 | WriteSetting(QStringLiteral("cpuopt_page_tables"), Settings::values.cpuopt_page_tables, |
| 1321 | true); | 1322 | true); |
| @@ -1332,12 +1333,12 @@ void Config::SaveCpuValues() { | |||
| 1332 | WriteSetting(QStringLiteral("cpuopt_reduce_misalign_checks"), | 1333 | WriteSetting(QStringLiteral("cpuopt_reduce_misalign_checks"), |
| 1333 | Settings::values.cpuopt_reduce_misalign_checks, true); | 1334 | Settings::values.cpuopt_reduce_misalign_checks, true); |
| 1334 | 1335 | ||
| 1335 | WriteSetting(QStringLiteral("cpuopt_unsafe_unfuse_fma"), | 1336 | WriteSettingGlobal(QStringLiteral("cpuopt_unsafe_unfuse_fma"), |
| 1336 | Settings::values.cpuopt_unsafe_unfuse_fma, true); | 1337 | Settings::values.cpuopt_unsafe_unfuse_fma, true); |
| 1337 | WriteSetting(QStringLiteral("cpuopt_unsafe_reduce_fp_error"), | 1338 | WriteSettingGlobal(QStringLiteral("cpuopt_unsafe_reduce_fp_error"), |
| 1338 | Settings::values.cpuopt_unsafe_reduce_fp_error, true); | 1339 | Settings::values.cpuopt_unsafe_reduce_fp_error, true); |
| 1339 | WriteSetting(QStringLiteral("cpuopt_unsafe_inaccurate_nan"), | 1340 | WriteSettingGlobal(QStringLiteral("cpuopt_unsafe_inaccurate_nan"), |
| 1340 | Settings::values.cpuopt_unsafe_inaccurate_nan, true); | 1341 | Settings::values.cpuopt_unsafe_inaccurate_nan, true); |
| 1341 | } | 1342 | } |
| 1342 | 1343 | ||
| 1343 | qt_config->endGroup(); | 1344 | qt_config->endGroup(); |
diff --git a/src/yuzu/configuration/config.h b/src/yuzu/configuration/config.h index 5a2c026b3..ce3355588 100644 --- a/src/yuzu/configuration/config.h +++ b/src/yuzu/configuration/config.h | |||
| @@ -132,5 +132,6 @@ private: | |||
| 132 | }; | 132 | }; |
| 133 | 133 | ||
| 134 | // These metatype declarations cannot be in common/settings.h because core is devoid of QT | 134 | // These metatype declarations cannot be in common/settings.h because core is devoid of QT |
| 135 | Q_DECLARE_METATYPE(Settings::CPUAccuracy); | ||
| 135 | Q_DECLARE_METATYPE(Settings::RendererBackend); | 136 | Q_DECLARE_METATYPE(Settings::RendererBackend); |
| 136 | Q_DECLARE_METATYPE(Settings::GPUAccuracy); | 137 | Q_DECLARE_METATYPE(Settings::GPUAccuracy); |
diff --git a/src/yuzu/configuration/configure_cpu.cpp b/src/yuzu/configuration/configure_cpu.cpp index 4f99bc80f..a59ea3087 100644 --- a/src/yuzu/configuration/configure_cpu.cpp +++ b/src/yuzu/configuration/configure_cpu.cpp | |||
| @@ -29,15 +29,17 @@ void ConfigureCpu::SetConfiguration() { | |||
| 29 | const bool runtime_lock = !Core::System::GetInstance().IsPoweredOn(); | 29 | const bool runtime_lock = !Core::System::GetInstance().IsPoweredOn(); |
| 30 | 30 | ||
| 31 | ui->accuracy->setEnabled(runtime_lock); | 31 | ui->accuracy->setEnabled(runtime_lock); |
| 32 | ui->accuracy->setCurrentIndex(static_cast<int>(Settings::values.cpu_accuracy)); | 32 | ui->accuracy->setCurrentIndex(static_cast<int>(Settings::values.cpu_accuracy.GetValue())); |
| 33 | UpdateGroup(static_cast<int>(Settings::values.cpu_accuracy)); | 33 | UpdateGroup(static_cast<int>(Settings::values.cpu_accuracy.GetValue())); |
| 34 | 34 | ||
| 35 | ui->cpuopt_unsafe_unfuse_fma->setEnabled(runtime_lock); | 35 | ui->cpuopt_unsafe_unfuse_fma->setEnabled(runtime_lock); |
| 36 | ui->cpuopt_unsafe_unfuse_fma->setChecked(Settings::values.cpuopt_unsafe_unfuse_fma); | 36 | ui->cpuopt_unsafe_unfuse_fma->setChecked(Settings::values.cpuopt_unsafe_unfuse_fma.GetValue()); |
| 37 | ui->cpuopt_unsafe_reduce_fp_error->setEnabled(runtime_lock); | 37 | ui->cpuopt_unsafe_reduce_fp_error->setEnabled(runtime_lock); |
| 38 | ui->cpuopt_unsafe_reduce_fp_error->setChecked(Settings::values.cpuopt_unsafe_reduce_fp_error); | 38 | ui->cpuopt_unsafe_reduce_fp_error->setChecked( |
| 39 | Settings::values.cpuopt_unsafe_reduce_fp_error.GetValue()); | ||
| 39 | ui->cpuopt_unsafe_inaccurate_nan->setEnabled(runtime_lock); | 40 | ui->cpuopt_unsafe_inaccurate_nan->setEnabled(runtime_lock); |
| 40 | ui->cpuopt_unsafe_inaccurate_nan->setChecked(Settings::values.cpuopt_unsafe_inaccurate_nan); | 41 | ui->cpuopt_unsafe_inaccurate_nan->setChecked( |
| 42 | Settings::values.cpuopt_unsafe_inaccurate_nan.GetValue()); | ||
| 41 | } | 43 | } |
| 42 | 44 | ||
| 43 | void ConfigureCpu::AccuracyUpdated(int index) { | 45 | void ConfigureCpu::AccuracyUpdated(int index) { |
| @@ -59,11 +61,13 @@ void ConfigureCpu::UpdateGroup(int index) { | |||
| 59 | } | 61 | } |
| 60 | 62 | ||
| 61 | void ConfigureCpu::ApplyConfiguration() { | 63 | void ConfigureCpu::ApplyConfiguration() { |
| 62 | Settings::values.cpu_accuracy = | 64 | Settings::values.cpu_accuracy.SetValue( |
| 63 | static_cast<Settings::CPUAccuracy>(ui->accuracy->currentIndex()); | 65 | static_cast<Settings::CPUAccuracy>(ui->accuracy->currentIndex())); |
| 64 | Settings::values.cpuopt_unsafe_unfuse_fma = ui->cpuopt_unsafe_unfuse_fma->isChecked(); | 66 | Settings::values.cpuopt_unsafe_unfuse_fma.SetValue(ui->cpuopt_unsafe_unfuse_fma->isChecked()); |
| 65 | Settings::values.cpuopt_unsafe_reduce_fp_error = ui->cpuopt_unsafe_reduce_fp_error->isChecked(); | 67 | Settings::values.cpuopt_unsafe_reduce_fp_error.SetValue( |
| 66 | Settings::values.cpuopt_unsafe_inaccurate_nan = ui->cpuopt_unsafe_inaccurate_nan->isChecked(); | 68 | ui->cpuopt_unsafe_reduce_fp_error->isChecked()); |
| 69 | Settings::values.cpuopt_unsafe_inaccurate_nan.SetValue( | ||
| 70 | ui->cpuopt_unsafe_inaccurate_nan->isChecked()); | ||
| 67 | } | 71 | } |
| 68 | 72 | ||
| 69 | void ConfigureCpu::changeEvent(QEvent* event) { | 73 | void ConfigureCpu::changeEvent(QEvent* event) { |