Просмотр исходного кода

configure_cpu: Show/Hide debugging options

MerryMage 6 лет назад
Родитель
Сommit
505aa3a4c1

+ 25 - 23
src/core/arm/dynarmic/arm_dynarmic_32.cpp

@@ -143,29 +143,31 @@ std::shared_ptr<Dynarmic::A32::Jit> ARM_Dynarmic_32::MakeJit(Common::PageTable&
     config.wall_clock_cntpct = uses_wall_clock;
     config.wall_clock_cntpct = uses_wall_clock;
 
 
     // Safe optimizations
     // Safe optimizations
-    if (!Settings::values.cpuopt_page_tables) {
-        config.page_table = nullptr;
-    }
-    if (!Settings::values.cpuopt_block_linking) {
-        config.optimizations &= ~Dynarmic::OptimizationFlag::BlockLinking;
-    }
-    if (!Settings::values.cpuopt_return_stack_buffer) {
-        config.optimizations &= ~Dynarmic::OptimizationFlag::ReturnStackBuffer;
-    }
-    if (!Settings::values.cpuopt_fast_dispatcher) {
-        config.optimizations &= ~Dynarmic::OptimizationFlag::FastDispatch;
-    }
-    if (!Settings::values.cpuopt_context_elimination) {
-        config.optimizations &= ~Dynarmic::OptimizationFlag::GetSetElimination;
-    }
-    if (!Settings::values.cpuopt_const_prop) {
-        config.optimizations &= ~Dynarmic::OptimizationFlag::ConstProp;
-    }
-    if (!Settings::values.cpuopt_misc_ir) {
-        config.optimizations &= ~Dynarmic::OptimizationFlag::MiscIROpt;
-    }
-    if (!Settings::values.cpuopt_reduce_misalign_checks) {
-        config.only_detect_misalignment_via_page_table_on_page_boundary = false;
+    if (Settings::values.cpu_accuracy != Settings::CPUAccuracy::Accurate) {
+        if (!Settings::values.cpuopt_page_tables) {
+            config.page_table = nullptr;
+        }
+        if (!Settings::values.cpuopt_block_linking) {
+            config.optimizations &= ~Dynarmic::OptimizationFlag::BlockLinking;
+        }
+        if (!Settings::values.cpuopt_return_stack_buffer) {
+            config.optimizations &= ~Dynarmic::OptimizationFlag::ReturnStackBuffer;
+        }
+        if (!Settings::values.cpuopt_fast_dispatcher) {
+            config.optimizations &= ~Dynarmic::OptimizationFlag::FastDispatch;
+        }
+        if (!Settings::values.cpuopt_context_elimination) {
+            config.optimizations &= ~Dynarmic::OptimizationFlag::GetSetElimination;
+        }
+        if (!Settings::values.cpuopt_const_prop) {
+            config.optimizations &= ~Dynarmic::OptimizationFlag::ConstProp;
+        }
+        if (!Settings::values.cpuopt_misc_ir) {
+            config.optimizations &= ~Dynarmic::OptimizationFlag::MiscIROpt;
+        }
+        if (!Settings::values.cpuopt_reduce_misalign_checks) {
+            config.only_detect_misalignment_via_page_table_on_page_boundary = false;
+        }
     }
     }
 
 
     return std::make_unique<Dynarmic::A32::Jit>(config);
     return std::make_unique<Dynarmic::A32::Jit>(config);

+ 25 - 23
src/core/arm/dynarmic/arm_dynarmic_64.cpp

@@ -195,29 +195,31 @@ std::shared_ptr<Dynarmic::A64::Jit> ARM_Dynarmic_64::MakeJit(Common::PageTable&
     config.wall_clock_cntpct = uses_wall_clock;
     config.wall_clock_cntpct = uses_wall_clock;
 
 
     // Safe optimizations
     // Safe optimizations
-    if (!Settings::values.cpuopt_page_tables) {
-        config.page_table = nullptr;
-    }
-    if (!Settings::values.cpuopt_block_linking) {
-        config.optimizations &= ~Dynarmic::OptimizationFlag::BlockLinking;
-    }
-    if (!Settings::values.cpuopt_return_stack_buffer) {
-        config.optimizations &= ~Dynarmic::OptimizationFlag::ReturnStackBuffer;
-    }
-    if (!Settings::values.cpuopt_fast_dispatcher) {
-        config.optimizations &= ~Dynarmic::OptimizationFlag::FastDispatch;
-    }
-    if (!Settings::values.cpuopt_context_elimination) {
-        config.optimizations &= ~Dynarmic::OptimizationFlag::GetSetElimination;
-    }
-    if (!Settings::values.cpuopt_const_prop) {
-        config.optimizations &= ~Dynarmic::OptimizationFlag::ConstProp;
-    }
-    if (!Settings::values.cpuopt_misc_ir) {
-        config.optimizations &= ~Dynarmic::OptimizationFlag::MiscIROpt;
-    }
-    if (!Settings::values.cpuopt_reduce_misalign_checks) {
-        config.only_detect_misalignment_via_page_table_on_page_boundary = false;
+    if (Settings::values.cpu_accuracy != Settings::CPUAccuracy::Accurate) {
+        if (!Settings::values.cpuopt_page_tables) {
+            config.page_table = nullptr;
+        }
+        if (!Settings::values.cpuopt_block_linking) {
+            config.optimizations &= ~Dynarmic::OptimizationFlag::BlockLinking;
+        }
+        if (!Settings::values.cpuopt_return_stack_buffer) {
+            config.optimizations &= ~Dynarmic::OptimizationFlag::ReturnStackBuffer;
+        }
+        if (!Settings::values.cpuopt_fast_dispatcher) {
+            config.optimizations &= ~Dynarmic::OptimizationFlag::FastDispatch;
+        }
+        if (!Settings::values.cpuopt_context_elimination) {
+            config.optimizations &= ~Dynarmic::OptimizationFlag::GetSetElimination;
+        }
+        if (!Settings::values.cpuopt_const_prop) {
+            config.optimizations &= ~Dynarmic::OptimizationFlag::ConstProp;
+        }
+        if (!Settings::values.cpuopt_misc_ir) {
+            config.optimizations &= ~Dynarmic::OptimizationFlag::MiscIROpt;
+        }
+        if (!Settings::values.cpuopt_reduce_misalign_checks) {
+            config.only_detect_misalignment_via_page_table_on_page_boundary = false;
+        }
     }
     }
 
 
     return std::make_shared<Dynarmic::A64::Jit>(config);
     return std::make_shared<Dynarmic::A64::Jit>(config);

+ 7 - 0
src/core/settings.h

@@ -382,6 +382,11 @@ enum class GPUAccuracy : u32 {
     Extreme = 2,
     Extreme = 2,
 };
 };
 
 
+enum class CPUAccuracy {
+    Accurate = 0,
+    DebugMode = 1,
+};
+
 extern bool configuring_global;
 extern bool configuring_global;
 
 
 template <typename Type>
 template <typename Type>
@@ -428,6 +433,8 @@ struct Values {
     Setting<bool> use_multi_core;
     Setting<bool> use_multi_core;
 
 
     // Cpu
     // Cpu
+    CPUAccuracy cpu_accuracy;
+
     bool cpuopt_page_tables;
     bool cpuopt_page_tables;
     bool cpuopt_block_linking;
     bool cpuopt_block_linking;
     bool cpuopt_return_stack_buffer;
     bool cpuopt_return_stack_buffer;

+ 6 - 0
src/yuzu/configuration/config.cpp

@@ -635,6 +635,9 @@ void Config::ReadCpuValues() {
     qt_config->beginGroup(QStringLiteral("Cpu"));
     qt_config->beginGroup(QStringLiteral("Cpu"));
 
 
     if (global) {
     if (global) {
+        Settings::values.cpu_accuracy = static_cast<Settings::CPUAccuracy>(
+            ReadSetting(QStringLiteral("cpu_accuracy"), 0).toInt());
+
         Settings::values.cpuopt_page_tables =
         Settings::values.cpuopt_page_tables =
             ReadSetting(QStringLiteral("cpuopt_page_tables"), true).toBool();
             ReadSetting(QStringLiteral("cpuopt_page_tables"), true).toBool();
         Settings::values.cpuopt_block_linking =
         Settings::values.cpuopt_block_linking =
@@ -1125,6 +1128,9 @@ void Config::SaveCpuValues() {
     qt_config->beginGroup(QStringLiteral("Cpu"));
     qt_config->beginGroup(QStringLiteral("Cpu"));
 
 
     if (global) {
     if (global) {
+        WriteSetting(QStringLiteral("cpu_accuracy"),
+                     static_cast<int>(Settings::values.cpu_accuracy), 0);
+
         WriteSetting(QStringLiteral("cpuopt_page_tables"), Settings::values.cpuopt_page_tables,
         WriteSetting(QStringLiteral("cpuopt_page_tables"), Settings::values.cpuopt_page_tables,
                      true);
                      true);
         WriteSetting(QStringLiteral("cpuopt_block_linking"), Settings::values.cpuopt_block_linking,
         WriteSetting(QStringLiteral("cpuopt_block_linking"), Settings::values.cpuopt_block_linking,

+ 22 - 0
src/yuzu/configuration/configure_cpu.cpp

@@ -15,6 +15,9 @@ ConfigureCpu::ConfigureCpu(QWidget* parent) : QWidget(parent), ui(new Ui::Config
     ui->setupUi(this);
     ui->setupUi(this);
 
 
     SetConfiguration();
     SetConfiguration();
+
+    connect(ui->accuracy, qOverload<int>(&QComboBox::currentIndexChanged), this,
+            &ConfigureCpu::UpdateGroups);
 }
 }
 
 
 ConfigureCpu::~ConfigureCpu() = default;
 ConfigureCpu::~ConfigureCpu() = default;
@@ -22,6 +25,10 @@ ConfigureCpu::~ConfigureCpu() = default;
 void ConfigureCpu::SetConfiguration() {
 void ConfigureCpu::SetConfiguration() {
     const bool runtime_lock = !Core::System::GetInstance().IsPoweredOn();
     const bool runtime_lock = !Core::System::GetInstance().IsPoweredOn();
 
 
+    ui->accuracy->setEnabled(runtime_lock);
+    ui->accuracy->setCurrentIndex(static_cast<int>(Settings::values.cpu_accuracy));
+    UpdateGroups(static_cast<int>(Settings::values.cpu_accuracy));
+
     ui->cpuopt_page_tables->setEnabled(runtime_lock);
     ui->cpuopt_page_tables->setEnabled(runtime_lock);
     ui->cpuopt_page_tables->setChecked(Settings::values.cpuopt_page_tables);
     ui->cpuopt_page_tables->setChecked(Settings::values.cpuopt_page_tables);
     ui->cpuopt_block_linking->setEnabled(runtime_lock);
     ui->cpuopt_block_linking->setEnabled(runtime_lock);
@@ -40,7 +47,22 @@ void ConfigureCpu::SetConfiguration() {
     ui->cpuopt_reduce_misalign_checks->setChecked(Settings::values.cpuopt_reduce_misalign_checks);
     ui->cpuopt_reduce_misalign_checks->setChecked(Settings::values.cpuopt_reduce_misalign_checks);
 }
 }
 
 
+void ConfigureCpu::UpdateGroups(int index) {
+    switch (index) {
+    case 0:
+    default:
+        ui->group_safe->setVisible(false);
+        break;
+    case 1:
+        ui->group_safe->setVisible(true);
+        break;
+    }
+}
+
 void ConfigureCpu::ApplyConfiguration() {
 void ConfigureCpu::ApplyConfiguration() {
+    Settings::values.cpu_accuracy =
+        static_cast<Settings::CPUAccuracy>(ui->accuracy->currentIndex());
+
     Settings::values.cpuopt_page_tables = ui->cpuopt_page_tables->isChecked();
     Settings::values.cpuopt_page_tables = ui->cpuopt_page_tables->isChecked();
     Settings::values.cpuopt_block_linking = ui->cpuopt_block_linking->isChecked();
     Settings::values.cpuopt_block_linking = ui->cpuopt_block_linking->isChecked();
     Settings::values.cpuopt_return_stack_buffer = ui->cpuopt_return_stack_buffer->isChecked();
     Settings::values.cpuopt_return_stack_buffer = ui->cpuopt_return_stack_buffer->isChecked();

+ 2 - 0
src/yuzu/configuration/configure_cpu.h

@@ -25,6 +25,8 @@ private:
     void changeEvent(QEvent* event) override;
     void changeEvent(QEvent* event) override;
     void RetranslateUI();
     void RetranslateUI();
 
 
+    void UpdateGroups(int index);
+
     void SetConfiguration();
     void SetConfiguration();
 
 
     std::unique_ptr<Ui::ConfigureCpu> ui;
     std::unique_ptr<Ui::ConfigureCpu> ui;

+ 48 - 0
src/yuzu/configuration/configure_cpu.ui

@@ -18,6 +18,54 @@
     <layout class="QVBoxLayout">
     <layout class="QVBoxLayout">
      <item>
      <item>
       <widget class="QGroupBox">
       <widget class="QGroupBox">
+       <property name="title">
+        <string>General</string>
+       </property>
+       <layout class="QVBoxLayout">
+        <item>
+         <layout class="QHBoxLayout">
+          <item>
+           <widget class="QLabel">
+            <property name="text">
+             <string>Accuracy:</string>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QComboBox" name="accuracy">
+            <item>
+             <property name="text">
+              <string>Accurate</string>
+             </property>
+            </item>
+            <item>
+             <property name="text">
+              <string>Debugging Mode (Debugging ONLY)</string>
+             </property>
+            </item>
+           </widget>
+          </item>
+         </layout>
+        </item>
+        <item>
+         <widget class="QLabel">
+          <property name="wordWrap">
+            <bool>1</bool>
+          </property>
+          <property name="text">
+           <string>We recommend setting accuracy to "Accurate".</string>
+          </property>
+         </widget>
+        </item>
+       </layout>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <layout class="QVBoxLayout">
+     <item>
+      <widget class="QGroupBox" name="group_safe">
        <property name="title">
        <property name="title">
         <string>Safe CPU Optimizations</string>
         <string>Safe CPU Optimizations</string>
        </property>
        </property>