summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar lat9nq2023-05-18 22:54:58 -0400
committerGravatar lat9nq2023-07-21 10:56:07 -0400
commitdaa31121ee75dedcb636011e02815b816a7cc446 (patch)
treeea05baafa53b7acf49724299ddbe6897279af313 /src
parentconfiguration: Use a mapping of setting value to name (diff)
downloadyuzu-daa31121ee75dedcb636011e02815b816a7cc446.tar.gz
yuzu-daa31121ee75dedcb636011e02815b816a7cc446.tar.xz
yuzu-daa31121ee75dedcb636011e02815b816a7cc446.zip
configure_cpu: Generate UI
Diffstat (limited to 'src')
-rw-r--r--src/yuzu/configuration/configure_cpu.cpp138
-rw-r--r--src/yuzu/configuration/configure_cpu.h11
-rw-r--r--src/yuzu/configuration/configure_cpu.ui129
-rw-r--r--src/yuzu/configuration/configure_dialog.cpp3
-rw-r--r--src/yuzu/configuration/configure_per_game.cpp3
5 files changed, 94 insertions, 190 deletions
diff --git a/src/yuzu/configuration/configure_cpu.cpp b/src/yuzu/configuration/configure_cpu.cpp
index ecaeb1a6b..0982e006d 100644
--- a/src/yuzu/configuration/configure_cpu.cpp
+++ b/src/yuzu/configuration/configure_cpu.cpp
@@ -5,88 +5,83 @@
5#include <memory> 5#include <memory>
6#include "common/common_types.h" 6#include "common/common_types.h"
7#include "common/settings.h" 7#include "common/settings.h"
8#include "configuration/shared_widget.h"
8#include "core/core.h" 9#include "core/core.h"
9#include "ui_configure_cpu.h" 10#include "ui_configure_cpu.h"
10#include "yuzu/configuration/configuration_shared.h" 11#include "yuzu/configuration/configuration_shared.h"
11#include "yuzu/configuration/configure_cpu.h" 12#include "yuzu/configuration/configure_cpu.h"
12 13
13ConfigureCpu::ConfigureCpu(const Core::System& system_, 14ConfigureCpu::ConfigureCpu(
14 std::shared_ptr<std::forward_list<ConfigurationShared::Tab*>> group, 15 const Core::System& system_,
15 QWidget* parent) 16 std::shared_ptr<std::forward_list<ConfigurationShared::Tab*>> group,
16 : Tab(group, parent), ui{std::make_unique<Ui::ConfigureCpu>()}, system{system_} { 17 const ConfigurationShared::TranslationMap& translations_,
18 const ConfigurationShared::ComboboxTranslationMap& combobox_translations_, QWidget* parent)
19 : Tab(group, parent), ui{std::make_unique<Ui::ConfigureCpu>()}, system{system_},
20 translations{translations_}, combobox_translations{combobox_translations_} {
17 ui->setupUi(this); 21 ui->setupUi(this);
18 22
19 SetupPerGameUI(); 23 Setup();
20 24
21 SetConfiguration(); 25 SetConfiguration();
22 26
23 connect(ui->accuracy, qOverload<int>(&QComboBox::currentIndexChanged), this, 27 connect(accuracy_combobox, qOverload<int>(&QComboBox::currentIndexChanged), this,
24 &ConfigureCpu::UpdateGroup); 28 &ConfigureCpu::UpdateGroup);
25} 29}
26 30
27ConfigureCpu::~ConfigureCpu() = default; 31ConfigureCpu::~ConfigureCpu() = default;
28 32
29void ConfigureCpu::SetConfiguration() { 33void ConfigureCpu::SetConfiguration() {}
34void ConfigureCpu::Setup() {
30 const bool runtime_lock = !system.IsPoweredOn(); 35 const bool runtime_lock = !system.IsPoweredOn();
36 auto* accuracy_layout = ui->widget_accuracy->layout();
37 auto* unsafe_layout = ui->unsafe_widget->layout();
38 std::map<std::string, QWidget*> unsafe_hold{};
39
40 std::forward_list<Settings::BasicSetting*> settings;
41 const auto push = [&](Settings::Category category) {
42 for (const auto setting : Settings::values.linkage.by_category[category]) {
43 settings.push_front(setting);
44 }
45 };
46
47 push(Settings::Category::Cpu);
48 push(Settings::Category::CpuUnsafe);
49
50 for (const auto setting : settings) {
51 auto* widget = new ConfigurationShared::Widget(setting, translations, combobox_translations,
52 this, runtime_lock, apply_funcs);
53
54 if (!widget->Valid()) {
55 delete widget;
56 continue;
57 }
58
59 if (setting->Id() == Settings::values.cpu_accuracy.Id()) {
60 accuracy_layout->addWidget(widget);
61 accuracy_combobox = widget->combobox;
62 } else {
63 unsafe_hold.insert({setting->GetLabel(), widget});
64 }
65 }
31 66
32 ui->accuracy->setEnabled(runtime_lock); 67 for (const auto& [label, widget] : unsafe_hold) {
33 ui->cpuopt_unsafe_unfuse_fma->setEnabled(runtime_lock); 68 unsafe_layout->addWidget(widget);
34 ui->cpuopt_unsafe_reduce_fp_error->setEnabled(runtime_lock);
35 ui->cpuopt_unsafe_ignore_standard_fpcr->setEnabled(runtime_lock);
36 ui->cpuopt_unsafe_inaccurate_nan->setEnabled(runtime_lock);
37 ui->cpuopt_unsafe_fastmem_check->setEnabled(runtime_lock);
38 ui->cpuopt_unsafe_ignore_global_monitor->setEnabled(runtime_lock);
39
40 ui->cpuopt_unsafe_unfuse_fma->setChecked(Settings::values.cpuopt_unsafe_unfuse_fma.GetValue());
41 ui->cpuopt_unsafe_reduce_fp_error->setChecked(
42 Settings::values.cpuopt_unsafe_reduce_fp_error.GetValue());
43 ui->cpuopt_unsafe_ignore_standard_fpcr->setChecked(
44 Settings::values.cpuopt_unsafe_ignore_standard_fpcr.GetValue());
45 ui->cpuopt_unsafe_inaccurate_nan->setChecked(
46 Settings::values.cpuopt_unsafe_inaccurate_nan.GetValue());
47 ui->cpuopt_unsafe_fastmem_check->setChecked(
48 Settings::values.cpuopt_unsafe_fastmem_check.GetValue());
49 ui->cpuopt_unsafe_ignore_global_monitor->setChecked(
50 Settings::values.cpuopt_unsafe_ignore_global_monitor.GetValue());
51
52 if (Settings::IsConfiguringGlobal()) {
53 ui->accuracy->setCurrentIndex(static_cast<int>(Settings::values.cpu_accuracy.GetValue()));
54 } else {
55 ConfigurationShared::SetPerGameSetting(ui->accuracy, &Settings::values.cpu_accuracy);
56 ConfigurationShared::SetHighlight(ui->widget_accuracy,
57 !Settings::values.cpu_accuracy.UsingGlobal());
58 } 69 }
59 UpdateGroup(ui->accuracy->currentIndex()); 70
71 UpdateGroup(accuracy_combobox->currentIndex());
60} 72}
61 73
62void ConfigureCpu::UpdateGroup(int index) { 74void ConfigureCpu::UpdateGroup(int index) {
63 if (!Settings::IsConfiguringGlobal()) { 75 const auto accuracy = static_cast<Settings::CPUAccuracy>(
64 index -= ConfigurationShared::USE_GLOBAL_OFFSET; 76 combobox_translations.at(typeid(Settings::CPUAccuracy))[index].first);
65 }
66 const auto accuracy = static_cast<Settings::CPUAccuracy>(index);
67 ui->unsafe_group->setVisible(accuracy == Settings::CPUAccuracy::Unsafe); 77 ui->unsafe_group->setVisible(accuracy == Settings::CPUAccuracy::Unsafe);
68} 78}
69 79
70void ConfigureCpu::ApplyConfiguration() { 80void ConfigureCpu::ApplyConfiguration() {
71 ConfigurationShared::ApplyPerGameSetting(&Settings::values.cpu_accuracy, ui->accuracy); 81 const bool is_powered_on = system.IsPoweredOn();
72 ConfigurationShared::ApplyPerGameSetting(&Settings::values.cpuopt_unsafe_unfuse_fma, 82 for (const auto& apply_func : apply_funcs) {
73 ui->cpuopt_unsafe_unfuse_fma, 83 apply_func(is_powered_on);
74 cpuopt_unsafe_unfuse_fma); 84 }
75 ConfigurationShared::ApplyPerGameSetting(&Settings::values.cpuopt_unsafe_reduce_fp_error,
76 ui->cpuopt_unsafe_reduce_fp_error,
77 cpuopt_unsafe_reduce_fp_error);
78 ConfigurationShared::ApplyPerGameSetting(&Settings::values.cpuopt_unsafe_ignore_standard_fpcr,
79 ui->cpuopt_unsafe_ignore_standard_fpcr,
80 cpuopt_unsafe_ignore_standard_fpcr);
81 ConfigurationShared::ApplyPerGameSetting(&Settings::values.cpuopt_unsafe_inaccurate_nan,
82 ui->cpuopt_unsafe_inaccurate_nan,
83 cpuopt_unsafe_inaccurate_nan);
84 ConfigurationShared::ApplyPerGameSetting(&Settings::values.cpuopt_unsafe_fastmem_check,
85 ui->cpuopt_unsafe_fastmem_check,
86 cpuopt_unsafe_fastmem_check);
87 ConfigurationShared::ApplyPerGameSetting(&Settings::values.cpuopt_unsafe_ignore_global_monitor,
88 ui->cpuopt_unsafe_ignore_global_monitor,
89 cpuopt_unsafe_ignore_global_monitor);
90} 85}
91 86
92void ConfigureCpu::changeEvent(QEvent* event) { 87void ConfigureCpu::changeEvent(QEvent* event) {
@@ -100,32 +95,3 @@ void ConfigureCpu::changeEvent(QEvent* event) {
100void ConfigureCpu::RetranslateUI() { 95void ConfigureCpu::RetranslateUI() {
101 ui->retranslateUi(this); 96 ui->retranslateUi(this);
102} 97}
103
104void ConfigureCpu::SetupPerGameUI() {
105 if (Settings::IsConfiguringGlobal()) {
106 return;
107 }
108
109 ConfigurationShared::SetColoredComboBox(
110 ui->accuracy, ui->widget_accuracy,
111 static_cast<u32>(Settings::values.cpu_accuracy.GetValue(true)));
112
113 ConfigurationShared::SetColoredTristate(ui->cpuopt_unsafe_unfuse_fma,
114 Settings::values.cpuopt_unsafe_unfuse_fma,
115 cpuopt_unsafe_unfuse_fma);
116 ConfigurationShared::SetColoredTristate(ui->cpuopt_unsafe_reduce_fp_error,
117 Settings::values.cpuopt_unsafe_reduce_fp_error,
118 cpuopt_unsafe_reduce_fp_error);
119 ConfigurationShared::SetColoredTristate(ui->cpuopt_unsafe_ignore_standard_fpcr,
120 Settings::values.cpuopt_unsafe_ignore_standard_fpcr,
121 cpuopt_unsafe_ignore_standard_fpcr);
122 ConfigurationShared::SetColoredTristate(ui->cpuopt_unsafe_inaccurate_nan,
123 Settings::values.cpuopt_unsafe_inaccurate_nan,
124 cpuopt_unsafe_inaccurate_nan);
125 ConfigurationShared::SetColoredTristate(ui->cpuopt_unsafe_fastmem_check,
126 Settings::values.cpuopt_unsafe_fastmem_check,
127 cpuopt_unsafe_fastmem_check);
128 ConfigurationShared::SetColoredTristate(ui->cpuopt_unsafe_ignore_global_monitor,
129 Settings::values.cpuopt_unsafe_ignore_global_monitor,
130 cpuopt_unsafe_ignore_global_monitor);
131}
diff --git a/src/yuzu/configuration/configure_cpu.h b/src/yuzu/configuration/configure_cpu.h
index 187d080b6..fb970122d 100644
--- a/src/yuzu/configuration/configure_cpu.h
+++ b/src/yuzu/configuration/configure_cpu.h
@@ -19,6 +19,8 @@ class ConfigureCpu : public ConfigurationShared::Tab {
19public: 19public:
20 explicit ConfigureCpu(const Core::System& system_, 20 explicit ConfigureCpu(const Core::System& system_,
21 std::shared_ptr<std::forward_list<ConfigurationShared::Tab*>> group, 21 std::shared_ptr<std::forward_list<ConfigurationShared::Tab*>> group,
22 const ConfigurationShared::TranslationMap& translations,
23 const ConfigurationShared::ComboboxTranslationMap& combobox_translations,
22 QWidget* parent = nullptr); 24 QWidget* parent = nullptr);
23 ~ConfigureCpu() override; 25 ~ConfigureCpu() override;
24 26
@@ -31,7 +33,7 @@ private:
31 33
32 void UpdateGroup(int index); 34 void UpdateGroup(int index);
33 35
34 void SetupPerGameUI(); 36 void Setup();
35 37
36 std::unique_ptr<Ui::ConfigureCpu> ui; 38 std::unique_ptr<Ui::ConfigureCpu> ui;
37 39
@@ -43,4 +45,11 @@ private:
43 ConfigurationShared::CheckState cpuopt_unsafe_ignore_global_monitor; 45 ConfigurationShared::CheckState cpuopt_unsafe_ignore_global_monitor;
44 46
45 const Core::System& system; 47 const Core::System& system;
48
49 const ConfigurationShared::TranslationMap& translations;
50 const ConfigurationShared::ComboboxTranslationMap& combobox_translations;
51
52 std::forward_list<std::function<void(bool)>> apply_funcs{};
53
54 QComboBox* accuracy_combobox;
46}; 55};
diff --git a/src/yuzu/configuration/configure_cpu.ui b/src/yuzu/configuration/configure_cpu.ui
index 8ae569ee6..835788c1f 100644
--- a/src/yuzu/configuration/configure_cpu.ui
+++ b/src/yuzu/configuration/configure_cpu.ui
@@ -27,38 +27,19 @@
27 <layout class="QVBoxLayout"> 27 <layout class="QVBoxLayout">
28 <item> 28 <item>
29 <widget class="QWidget" name="widget_accuracy" native="true"> 29 <widget class="QWidget" name="widget_accuracy" native="true">
30 <layout class="QHBoxLayout" name="layout_accuracy"> 30 <layout class="QVBoxLayout" name="verticalLayout">
31 <item> 31 <property name="leftMargin">
32 <widget class="QLabel" name="label_accuracy"> 32 <number>0</number>
33 <property name="text"> 33 </property>
34 <string>Accuracy:</string> 34 <property name="topMargin">
35 </property> 35 <number>0</number>
36 </widget> 36 </property>
37 </item> 37 <property name="rightMargin">
38 <item> 38 <number>0</number>
39 <widget class="QComboBox" name="accuracy"> 39 </property>
40 <item> 40 <property name="bottomMargin">
41 <property name="text"> 41 <number>0</number>
42 <string>Auto</string> 42 </property>
43 </property>
44 </item>
45 <item>
46 <property name="text">
47 <string>Accurate</string>
48 </property>
49 </item>
50 <item>
51 <property name="text">
52 <string>Unsafe</string>
53 </property>
54 </item>
55 <item>
56 <property name="text">
57 <string>Paranoid (disables most optimizations)</string>
58 </property>
59 </item>
60 </widget>
61 </item>
62 </layout> 43 </layout>
63 </widget> 44 </widget>
64 </item> 45 </item>
@@ -96,75 +77,21 @@
96 </widget> 77 </widget>
97 </item> 78 </item>
98 <item> 79 <item>
99 <widget class="QCheckBox" name="cpuopt_unsafe_unfuse_fma"> 80 <widget class="QWidget" name="unsafe_widget" native="true">
100 <property name="toolTip"> 81 <layout class="QVBoxLayout" name="unsafe_layout">
101 <string> 82 <property name="leftMargin">
102 &lt;div&gt;This option improves speed by reducing accuracy of fused-multiply-add instructions on CPUs without native FMA support.&lt;/div&gt; 83 <number>0</number>
103 </string> 84 </property>
104 </property> 85 <property name="topMargin">
105 <property name="text"> 86 <number>0</number>
106 <string>Unfuse FMA (improve performance on CPUs without FMA)</string> 87 </property>
107 </property> 88 <property name="rightMargin">
108 </widget> 89 <number>0</number>
109 </item> 90 </property>
110 <item> 91 <property name="bottomMargin">
111 <widget class="QCheckBox" name="cpuopt_unsafe_reduce_fp_error"> 92 <number>0</number>
112 <property name="toolTip"> 93 </property>
113 <string> 94 </layout>
114 &lt;div&gt;This option improves the speed of some approximate floating-point functions by using less accurate native approximations.&lt;/div&gt;
115 </string>
116 </property>
117 <property name="text">
118 <string>Faster FRSQRTE and FRECPE</string>
119 </property>
120 </widget>
121 </item>
122 <item>
123 <widget class="QCheckBox" name="cpuopt_unsafe_ignore_standard_fpcr">
124 <property name="toolTip">
125 <string>
126 &lt;div&gt;This option improves the speed of 32 bits ASIMD floating-point functions by running with incorrect rounding modes.&lt;/div&gt;
127 </string>
128 </property>
129 <property name="text">
130 <string>Faster ASIMD instructions (32 bits only)</string>
131 </property>
132 </widget>
133 </item>
134 <item>
135 <widget class="QCheckBox" name="cpuopt_unsafe_inaccurate_nan">
136 <property name="toolTip">
137 <string>
138 &lt;div&gt;This option improves speed by removing NaN checking. Please note this also reduces accuracy of certain floating-point instructions.&lt;/div&gt;
139 </string>
140 </property>
141 <property name="text">
142 <string>Inaccurate NaN handling</string>
143 </property>
144 </widget>
145 </item>
146 <item>
147 <widget class="QCheckBox" name="cpuopt_unsafe_fastmem_check">
148 <property name="toolTip">
149 <string>
150 &lt;div&gt;This option improves speed by eliminating a safety check before every memory read/write in guest. Disabling it may allow a game to read/write the emulator's memory.&lt;/div&gt;
151 </string>
152 </property>
153 <property name="text">
154 <string>Disable address space checks</string>
155 </property>
156 </widget>
157 </item>
158 <item>
159 <widget class="QCheckBox" name="cpuopt_unsafe_ignore_global_monitor">
160 <property name="toolTip">
161 <string>
162 &lt;div&gt;This option improves speed by relying only on the semantics of cmpxchg to ensure safety of exclusive access instructions. Please note this may result in deadlocks and other race conditions.&lt;/div&gt;
163 </string>
164 </property>
165 <property name="text">
166 <string>Ignore global monitor</string>
167 </property>
168 </widget> 95 </widget>
169 </item> 96 </item>
170 </layout> 97 </layout>
diff --git a/src/yuzu/configuration/configure_dialog.cpp b/src/yuzu/configuration/configure_dialog.cpp
index 1a339a227..c7d132fc8 100644
--- a/src/yuzu/configuration/configure_dialog.cpp
+++ b/src/yuzu/configuration/configure_dialog.cpp
@@ -37,7 +37,8 @@ ConfigureDialog::ConfigureDialog(QWidget* parent, HotkeyRegistry& registry_,
37 combobox_translations{ConfigurationShared::ComboboxEnumeration(this)}, 37 combobox_translations{ConfigurationShared::ComboboxEnumeration(this)},
38 audio_tab{std::make_unique<ConfigureAudio>(system_, nullptr, *translations, 38 audio_tab{std::make_unique<ConfigureAudio>(system_, nullptr, *translations,
39 *combobox_translations, this)}, 39 *combobox_translations, this)},
40 cpu_tab{std::make_unique<ConfigureCpu>(system_, nullptr, this)}, 40 cpu_tab{std::make_unique<ConfigureCpu>(system_, nullptr, *translations,
41 *combobox_translations, this)},
41 debug_tab_tab{std::make_unique<ConfigureDebugTab>(system_, this)}, 42 debug_tab_tab{std::make_unique<ConfigureDebugTab>(system_, this)},
42 filesystem_tab{std::make_unique<ConfigureFilesystem>(this)}, 43 filesystem_tab{std::make_unique<ConfigureFilesystem>(this)},
43 general_tab{std::make_unique<ConfigureGeneral>(system_, nullptr, *translations, 44 general_tab{std::make_unique<ConfigureGeneral>(system_, nullptr, *translations,
diff --git a/src/yuzu/configuration/configure_per_game.cpp b/src/yuzu/configuration/configure_per_game.cpp
index 845ffeeb8..5863beca0 100644
--- a/src/yuzu/configuration/configure_per_game.cpp
+++ b/src/yuzu/configuration/configure_per_game.cpp
@@ -53,7 +53,8 @@ ConfigurePerGame::ConfigurePerGame(QWidget* parent, u64 title_id_, const std::st
53 addons_tab = std::make_unique<ConfigurePerGameAddons>(system_, this); 53 addons_tab = std::make_unique<ConfigurePerGameAddons>(system_, this);
54 audio_tab = std::make_unique<ConfigureAudio>(system_, tab_group, *translations, 54 audio_tab = std::make_unique<ConfigureAudio>(system_, tab_group, *translations,
55 *combobox_translations, this); 55 *combobox_translations, this);
56 cpu_tab = std::make_unique<ConfigureCpu>(system_, tab_group, this); 56 cpu_tab = std::make_unique<ConfigureCpu>(system_, tab_group, *translations,
57 *combobox_translations, this);
57 graphics_advanced_tab = std::make_unique<ConfigureGraphicsAdvanced>( 58 graphics_advanced_tab = std::make_unique<ConfigureGraphicsAdvanced>(
58 system_, tab_group, *translations, *combobox_translations, this); 59 system_, tab_group, *translations, *combobox_translations, this);
59 graphics_tab = std::make_unique<ConfigureGraphics>( 60 graphics_tab = std::make_unique<ConfigureGraphics>(