diff options
| author | 2021-01-02 17:36:02 +0000 | |
|---|---|---|
| committer | 2021-01-02 20:13:21 +0000 | |
| commit | 57c9da1b397b7d19b604f318502a881db87f0ba4 (patch) | |
| tree | 0e00979bbab0dd7939d0184e4e95c4ba1e8e5fa7 | |
| parent | Merge pull request #5209 from Morph1984/refactor-controller-connect (diff) | |
| download | yuzu-57c9da1b397b7d19b604f318502a881db87f0ba4.tar.gz yuzu-57c9da1b397b7d19b604f318502a881db87f0ba4.tar.xz yuzu-57c9da1b397b7d19b604f318502a881db87f0ba4.zip | |
dynarmic: Add Unsafe_InaccurateNaN optimization
| m--------- | externals/dynarmic | 0 | ||||
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic_32.cpp | 3 | ||||
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic_64.cpp | 3 | ||||
| -rw-r--r-- | src/core/settings.h | 1 | ||||
| -rw-r--r-- | src/yuzu/configuration/config.cpp | 4 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_cpu.cpp | 3 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_cpu.ui | 12 |
7 files changed, 26 insertions, 0 deletions
diff --git a/externals/dynarmic b/externals/dynarmic | |||
| Subproject 4a9a0d07f7376b439430e686721e8176c7b56ce | Subproject 6023bcd8ad8c95bb08edf48cb889bfe99ff86be | ||
diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.cpp b/src/core/arm/dynarmic/arm_dynarmic_32.cpp index 8aaf11eee..0831dd5d2 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_32.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_32.cpp | |||
| @@ -181,6 +181,9 @@ std::shared_ptr<Dynarmic::A32::Jit> ARM_Dynarmic_32::MakeJit(Common::PageTable& | |||
| 181 | if (Settings::values.cpuopt_unsafe_reduce_fp_error) { | 181 | if (Settings::values.cpuopt_unsafe_reduce_fp_error) { |
| 182 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_ReducedErrorFP; | 182 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_ReducedErrorFP; |
| 183 | } | 183 | } |
| 184 | if (Settings::values.cpuopt_unsafe_inaccurate_nan) { | ||
| 185 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN; | ||
| 186 | } | ||
| 184 | } | 187 | } |
| 185 | 188 | ||
| 186 | return std::make_unique<Dynarmic::A32::Jit>(config); | 189 | 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 d2e1dc724..4c5ebca22 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_64.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_64.cpp | |||
| @@ -212,6 +212,9 @@ std::shared_ptr<Dynarmic::A64::Jit> ARM_Dynarmic_64::MakeJit(Common::PageTable& | |||
| 212 | if (Settings::values.cpuopt_unsafe_reduce_fp_error) { | 212 | if (Settings::values.cpuopt_unsafe_reduce_fp_error) { |
| 213 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_ReducedErrorFP; | 213 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_ReducedErrorFP; |
| 214 | } | 214 | } |
| 215 | if (Settings::values.cpuopt_unsafe_inaccurate_nan) { | ||
| 216 | config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN; | ||
| 217 | } | ||
| 215 | } | 218 | } |
| 216 | 219 | ||
| 217 | return std::make_shared<Dynarmic::A64::Jit>(config); | 220 | return std::make_shared<Dynarmic::A64::Jit>(config); |
diff --git a/src/core/settings.h b/src/core/settings.h index 0cd3c0c84..66edc4e48 100644 --- a/src/core/settings.h +++ b/src/core/settings.h | |||
| @@ -131,6 +131,7 @@ struct Values { | |||
| 131 | 131 | ||
| 132 | bool cpuopt_unsafe_unfuse_fma; | 132 | bool cpuopt_unsafe_unfuse_fma; |
| 133 | bool cpuopt_unsafe_reduce_fp_error; | 133 | bool cpuopt_unsafe_reduce_fp_error; |
| 134 | bool cpuopt_unsafe_inaccurate_nan; | ||
| 134 | 135 | ||
| 135 | // Renderer | 136 | // Renderer |
| 136 | Setting<RendererBackend> renderer_backend; | 137 | Setting<RendererBackend> renderer_backend; |
diff --git a/src/yuzu/configuration/config.cpp b/src/yuzu/configuration/config.cpp index 34c2a5f8b..43cd11ba0 100644 --- a/src/yuzu/configuration/config.cpp +++ b/src/yuzu/configuration/config.cpp | |||
| @@ -764,6 +764,8 @@ void Config::ReadCpuValues() { | |||
| 764 | ReadSetting(QStringLiteral("cpuopt_unsafe_unfuse_fma"), true).toBool(); | 764 | ReadSetting(QStringLiteral("cpuopt_unsafe_unfuse_fma"), true).toBool(); |
| 765 | Settings::values.cpuopt_unsafe_reduce_fp_error = | 765 | Settings::values.cpuopt_unsafe_reduce_fp_error = |
| 766 | ReadSetting(QStringLiteral("cpuopt_unsafe_reduce_fp_error"), true).toBool(); | 766 | ReadSetting(QStringLiteral("cpuopt_unsafe_reduce_fp_error"), true).toBool(); |
| 767 | Settings::values.cpuopt_unsafe_inaccurate_nan = | ||
| 768 | ReadSetting(QStringLiteral("cpuopt_unsafe_inaccurate_nan"), true).toBool(); | ||
| 767 | } | 769 | } |
| 768 | 770 | ||
| 769 | qt_config->endGroup(); | 771 | qt_config->endGroup(); |
| @@ -1327,6 +1329,8 @@ void Config::SaveCpuValues() { | |||
| 1327 | Settings::values.cpuopt_unsafe_unfuse_fma, true); | 1329 | Settings::values.cpuopt_unsafe_unfuse_fma, true); |
| 1328 | WriteSetting(QStringLiteral("cpuopt_unsafe_reduce_fp_error"), | 1330 | WriteSetting(QStringLiteral("cpuopt_unsafe_reduce_fp_error"), |
| 1329 | Settings::values.cpuopt_unsafe_reduce_fp_error, true); | 1331 | Settings::values.cpuopt_unsafe_reduce_fp_error, true); |
| 1332 | WriteSetting(QStringLiteral("cpuopt_unsafe_inaccurate_nan"), | ||
| 1333 | Settings::values.cpuopt_unsafe_inaccurate_nan, true); | ||
| 1330 | } | 1334 | } |
| 1331 | 1335 | ||
| 1332 | qt_config->endGroup(); | 1336 | qt_config->endGroup(); |
diff --git a/src/yuzu/configuration/configure_cpu.cpp b/src/yuzu/configuration/configure_cpu.cpp index 37fcd6adc..d055cbd60 100644 --- a/src/yuzu/configuration/configure_cpu.cpp +++ b/src/yuzu/configuration/configure_cpu.cpp | |||
| @@ -36,6 +36,8 @@ void ConfigureCpu::SetConfiguration() { | |||
| 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); |
| 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(Settings::values.cpuopt_unsafe_reduce_fp_error); |
| 39 | ui->cpuopt_unsafe_inaccurate_nan->setEnabled(runtime_lock); | ||
| 40 | ui->cpuopt_unsafe_inaccurate_nan->setChecked(Settings::values.cpuopt_unsafe_inaccurate_nan); | ||
| 39 | } | 41 | } |
| 40 | 42 | ||
| 41 | void ConfigureCpu::AccuracyUpdated(int index) { | 43 | void ConfigureCpu::AccuracyUpdated(int index) { |
| @@ -61,6 +63,7 @@ void ConfigureCpu::ApplyConfiguration() { | |||
| 61 | static_cast<Settings::CPUAccuracy>(ui->accuracy->currentIndex()); | 63 | static_cast<Settings::CPUAccuracy>(ui->accuracy->currentIndex()); |
| 62 | Settings::values.cpuopt_unsafe_unfuse_fma = ui->cpuopt_unsafe_unfuse_fma->isChecked(); | 64 | Settings::values.cpuopt_unsafe_unfuse_fma = ui->cpuopt_unsafe_unfuse_fma->isChecked(); |
| 63 | Settings::values.cpuopt_unsafe_reduce_fp_error = ui->cpuopt_unsafe_reduce_fp_error->isChecked(); | 65 | Settings::values.cpuopt_unsafe_reduce_fp_error = ui->cpuopt_unsafe_reduce_fp_error->isChecked(); |
| 66 | Settings::values.cpuopt_unsafe_inaccurate_nan = ui->cpuopt_unsafe_inaccurate_nan->isChecked(); | ||
| 64 | } | 67 | } |
| 65 | 68 | ||
| 66 | void ConfigureCpu::changeEvent(QEvent* event) { | 69 | void ConfigureCpu::changeEvent(QEvent* event) { |
diff --git a/src/yuzu/configuration/configure_cpu.ui b/src/yuzu/configuration/configure_cpu.ui index ebdd2e6e9..bcd0962e9 100644 --- a/src/yuzu/configuration/configure_cpu.ui +++ b/src/yuzu/configuration/configure_cpu.ui | |||
| @@ -109,6 +109,18 @@ | |||
| 109 | </property> | 109 | </property> |
| 110 | </widget> | 110 | </widget> |
| 111 | </item> | 111 | </item> |
| 112 | <item> | ||
| 113 | <widget class="QCheckBox" name="cpuopt_unsafe_inaccurate_nan"> | ||
| 114 | <property name="text"> | ||
| 115 | <string>Inaccurate NaN handling</string> | ||
| 116 | </property> | ||
| 117 | <property name="toolTip"> | ||
| 118 | <string> | ||
| 119 | <div>This option improves speed by removing NaN checking. Please note this also reduces accuracy of certain floating-point instructions.</div> | ||
| 120 | </string> | ||
| 121 | </property> | ||
| 122 | </widget> | ||
| 123 | </item> | ||
| 112 | </layout> | 124 | </layout> |
| 113 | </widget> | 125 | </widget> |
| 114 | </item> | 126 | </item> |