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

settings, arm_dynarmic, yuzu qt: Move CPU debugging option

Decouples the CPU debugging mode from the enumeration to its own
boolean. After this, it moves the CPU Debugging tab over to a sub tab
underneath the Debug tab in the configuration UI.
lat9nq 5 лет назад
Родитель
Сommit
dc06e11a7b

+ 1 - 1
src/common/settings.cpp

@@ -93,7 +93,7 @@ bool IsGPULevelHigh() {
 }
 
 bool IsFastmemEnabled() {
-    if (values.cpu_accuracy.GetValue() == CPUAccuracy::DebugMode) {
+    if (values.cpu_debug_mode) {
         return static_cast<bool>(values.cpuopt_fastmem);
     }
     return true;

+ 1 - 1
src/common/settings.h

@@ -34,7 +34,6 @@ enum class CPUAccuracy : u32 {
     Auto = 0,
     Accurate = 1,
     Unsafe = 2,
-    DebugMode = 3,
 };
 
 /** The BasicSetting class is a simple resource manager. It defines a label and default value
@@ -288,6 +287,7 @@ struct Values {
     Setting<CPUAccuracy> cpu_accuracy{CPUAccuracy::Auto, "cpu_accuracy"};
     // TODO: remove cpu_accuracy_first_time, migration setting added 8 July 2021
     BasicSetting<bool> cpu_accuracy_first_time{true, "cpu_accuracy_first_time"};
+    BasicSetting<bool> cpu_debug_mode{false, "cpu_debug_mode"};
 
     BasicSetting<bool> cpuopt_page_tables{true, "cpuopt_page_tables"};
     BasicSetting<bool> cpuopt_block_linking{true, "cpuopt_block_linking"};

+ 1 - 1
src/core/arm/dynarmic/arm_dynarmic_32.cpp

@@ -150,7 +150,7 @@ std::shared_ptr<Dynarmic::A32::Jit> ARM_Dynarmic_32::MakeJit(Common::PageTable*
     config.far_code_offset = 400_MiB;
 
     // Safe optimizations
-    if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::DebugMode) {
+    if (Settings::values.cpu_debug_mode) {
         if (!Settings::values.cpuopt_page_tables) {
             config.page_table = nullptr;
         }

+ 1 - 1
src/core/arm/dynarmic/arm_dynarmic_64.cpp

@@ -190,7 +190,7 @@ std::shared_ptr<Dynarmic::A64::Jit> ARM_Dynarmic_64::MakeJit(Common::PageTable*
     config.far_code_offset = 400_MiB;
 
     // Safe optimizations
-    if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::DebugMode) {
+    if (Settings::values.cpu_debug_mode) {
         if (!Settings::values.cpuopt_page_tables) {
             config.page_table = nullptr;
         }

+ 3 - 0
src/yuzu/CMakeLists.txt

@@ -52,6 +52,9 @@ add_executable(yuzu
     configuration/configure_debug_controller.cpp
     configuration/configure_debug_controller.h
     configuration/configure_debug_controller.ui
+    configuration/configure_debug_tab.cpp
+    configuration/configure_debug_tab.h
+    configuration/configure_debug_tab.ui
     configuration/configure_dialog.cpp
     configuration/configure_dialog.h
     configuration/configure_filesystem.cpp

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

@@ -808,6 +808,7 @@ void Config::ReadCpuValues() {
     ReadGlobalSetting(Settings::values.cpuopt_unsafe_fastmem_check);
 
     if (global) {
+        ReadBasicSetting(Settings::values.cpu_debug_mode);
         ReadBasicSetting(Settings::values.cpuopt_page_tables);
         ReadBasicSetting(Settings::values.cpuopt_block_linking);
         ReadBasicSetting(Settings::values.cpuopt_return_stack_buffer);
@@ -1328,6 +1329,7 @@ void Config::SaveCpuValues() {
     WriteGlobalSetting(Settings::values.cpuopt_unsafe_fastmem_check);
 
     if (global) {
+        WriteBasicSetting(Settings::values.cpu_debug_mode);
         WriteBasicSetting(Settings::values.cpuopt_page_tables);
         WriteBasicSetting(Settings::values.cpuopt_block_linking);
         WriteBasicSetting(Settings::values.cpuopt_return_stack_buffer);

+ 28 - 22
src/yuzu/configuration/configure.ui

@@ -41,7 +41,7 @@
      <item>
       <widget class="QTabWidget" name="tabWidget">
        <property name="currentIndex">
-        <number>0</number>
+        <number>11</number>
        </property>
        <widget class="ConfigureGeneral" name="generalTab">
         <property name="accessibleName">
@@ -107,14 +107,6 @@
          <string>CPU</string>
         </attribute>
        </widget>
-       <widget class="ConfigureCpuDebug" name="cpuDebugTab">
-        <property name="accessibleName">
-         <string>Debug</string>
-        </property>
-        <attribute name="title">
-         <string>Debug</string>
-        </attribute>
-       </widget>
        <widget class="ConfigureGraphics" name="graphicsTab">
         <property name="accessibleName">
          <string>Graphics</string>
@@ -139,7 +131,7 @@
          <string>Audio</string>
         </attribute>
        </widget>
-       <widget class="ConfigureDebug" name="debugTab">
+       <widget class="ConfigureDebugTab" name="debugTab">
         <property name="accessibleName">
          <string>Debug</string>
         </property>
@@ -207,24 +199,12 @@
    <header>configuration/configure_audio.h</header>
    <container>1</container>
   </customwidget>
-  <customwidget>
-   <class>ConfigureDebug</class>
-   <extends>QWidget</extends>
-   <header>configuration/configure_debug.h</header>
-   <container>1</container>
-  </customwidget>
   <customwidget>
    <class>ConfigureCpu</class>
    <extends>QWidget</extends>
    <header>configuration/configure_cpu.h</header>
    <container>1</container>
   </customwidget>
-  <customwidget>
-   <class>ConfigureCpuDebug</class>
-   <extends>QWidget</extends>
-   <header>configuration/configure_cpu_debug.h</header>
-   <container>1</container>
-  </customwidget>
   <customwidget>
    <class>ConfigureGraphics</class>
    <extends>QWidget</extends>
@@ -267,6 +247,12 @@
    <header>configuration/configure_service.h</header>
    <container>1</container>
   </customwidget>
+  <customwidget>
+   <class>ConfigureDebugTab</class>
+   <extends>QWidget</extends>
+   <header>configuration/configure_debug_tab.h</header>
+   <container>1</container>
+  </customwidget>
  </customwidgets>
  <resources/>
  <connections>
@@ -275,12 +261,32 @@
    <signal>accepted()</signal>
    <receiver>ConfigureDialog</receiver>
    <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>20</x>
+     <y>20</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>20</x>
+     <y>20</y>
+    </hint>
+   </hints>
   </connection>
   <connection>
    <sender>buttonBox</sender>
    <signal>rejected()</signal>
    <receiver>ConfigureDialog</receiver>
    <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>20</x>
+     <y>20</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>20</x>
+     <y>20</y>
+    </hint>
+   </hints>
   </connection>
  </connections>
 </ui>

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

@@ -20,8 +20,6 @@ ConfigureCpu::ConfigureCpu(QWidget* parent) : QWidget(parent), ui(new Ui::Config
 
     SetConfiguration();
 
-    connect(ui->accuracy, qOverload<int>(&QComboBox::activated), this,
-            &ConfigureCpu::AccuracyUpdated);
     connect(ui->accuracy, qOverload<int>(&QComboBox::currentIndexChanged), this,
             &ConfigureCpu::UpdateGroup);
 }
@@ -58,20 +56,6 @@ void ConfigureCpu::SetConfiguration() {
     UpdateGroup(ui->accuracy->currentIndex());
 }
 
-void ConfigureCpu::AccuracyUpdated(int index) {
-    if (Settings::IsConfiguringGlobal() &&
-        static_cast<Settings::CPUAccuracy>(index) == Settings::CPUAccuracy::DebugMode) {
-        const auto result = QMessageBox::warning(this, tr("Setting CPU to Debug Mode"),
-                                                 tr("CPU Debug Mode is only intended for developer "
-                                                    "use. Are you sure you want to enable this?"),
-                                                 QMessageBox::Yes | QMessageBox::No);
-        if (result == QMessageBox::No) {
-            ui->accuracy->setCurrentIndex(static_cast<int>(Settings::CPUAccuracy::Accurate));
-            UpdateGroup(static_cast<int>(Settings::CPUAccuracy::Accurate));
-        }
-    }
-}
-
 void ConfigureCpu::UpdateGroup(int index) {
     if (!Settings::IsConfiguringGlobal()) {
         index -= ConfigurationShared::USE_GLOBAL_OFFSET;
@@ -134,8 +118,6 @@ void ConfigureCpu::SetupPerGameUI() {
     ConfigurationShared::SetColoredComboBox(
         ui->accuracy, ui->widget_accuracy,
         static_cast<u32>(Settings::values.cpu_accuracy.GetValue(true)));
-    ui->accuracy->removeItem(static_cast<u32>(Settings::CPUAccuracy::DebugMode) +
-                             ConfigurationShared::USE_GLOBAL_OFFSET);
 
     ConfigurationShared::SetColoredTristate(ui->cpuopt_unsafe_unfuse_fma,
                                             Settings::values.cpuopt_unsafe_unfuse_fma,

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

@@ -29,7 +29,6 @@ private:
     void changeEvent(QEvent* event) override;
     void RetranslateUI();
 
-    void AccuracyUpdated(int index);
     void UpdateGroup(int index);
 
     void SetConfiguration();

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

@@ -49,11 +49,6 @@
                <string>Unsafe</string>
               </property>
              </item>
-             <item>
-              <property name="text">
-               <string>Enable Debug Mode</string>
-              </property>
-             </item>
             </widget>
            </item>
           </layout>

+ 0 - 1
src/yuzu/configuration/configure_cpu_debug.h

@@ -6,7 +6,6 @@
 
 #include <memory>
 #include <QWidget>
-#include "common/settings.h"
 
 namespace Ui {
 class ConfigureCpuDebug;

+ 43 - 51
src/yuzu/configuration/configure_cpu_debug.ui

@@ -6,8 +6,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>400</width>
-    <height>321</height>
+    <width>592</width>
+    <height>503</height>
    </rect>
   </property>
   <property name="windowTitle">
@@ -17,140 +17,132 @@
    <item>
     <layout class="QVBoxLayout">
      <item>
-      <widget class="QGroupBox">
+      <widget class="QGroupBox" name="groupBox">
        <property name="title">
         <string>Toggle CPU Optimizations</string>
        </property>
        <layout class="QVBoxLayout">
         <item>
-         <widget class="QLabel">
-          <property name="wordWrap">
-            <bool>1</bool>
-          </property>
+         <widget class="QLabel" name="label">
           <property name="text">
-           <string>
-            &lt;div&gt;
-            &lt;b&gt;For debugging only.&lt;/b&gt;
-            &lt;br&gt;
-            If you're not sure what these do, keep all of these enabled.
-            &lt;br&gt;
-            These settings, when disabled, only take effect when CPU Accuracy is "Debug Mode".
-            &lt;/div&gt;
-           </string>
+           <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;For debugging only.&lt;/span&gt;&lt;br/&gt;If you're not sure what these do, keep all of these enabled. &lt;br/&gt;These settings, when disabled, only take effect when CPU Debugging is enabled. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+          </property>
+          <property name="wordWrap">
+           <bool>false</bool>
           </property>
          </widget>
         </item>
         <item>
          <widget class="QCheckBox" name="cpuopt_page_tables">
-          <property name="text">
-           <string>Enable inline page tables</string>
-          </property>
           <property name="toolTip">
            <string>
-            &lt;div style="white-space: nowrap"&gt;This optimization speeds up memory accesses by the guest program.&lt;/div&gt;
-            &lt;div style="white-space: nowrap"&gt;Enabling it inlines accesses to PageTable::pointers into emitted code.&lt;/div&gt;
-            &lt;div style="white-space: nowrap"&gt;Disabling this forces all memory accesses to go through the Memory::Read/Memory::Write functions.&lt;/div&gt;
+            &lt;div style=&quot;white-space: nowrap&quot;&gt;This optimization speeds up memory accesses by the guest program.&lt;/div&gt;
+            &lt;div style=&quot;white-space: nowrap&quot;&gt;Enabling it inlines accesses to PageTable::pointers into emitted code.&lt;/div&gt;
+            &lt;div style=&quot;white-space: nowrap&quot;&gt;Disabling this forces all memory accesses to go through the Memory::Read/Memory::Write functions.&lt;/div&gt;
            </string>
           </property>
+          <property name="text">
+           <string>Enable inline page tables</string>
+          </property>
          </widget>
         </item>
         <item>
          <widget class="QCheckBox" name="cpuopt_block_linking">
-          <property name="text">
-           <string>Enable block linking</string>
-          </property>
           <property name="toolTip">
            <string>
             &lt;div&gt;This optimization avoids dispatcher lookups by allowing emitted basic blocks to jump directly to other basic blocks if the destination PC is static.&lt;/div&gt;
            </string>
           </property>
+          <property name="text">
+           <string>Enable block linking</string>
+          </property>
          </widget>
         </item>
         <item>
          <widget class="QCheckBox" name="cpuopt_return_stack_buffer">
-          <property name="text">
-           <string>Enable return stack buffer</string>
-          </property>
           <property name="toolTip">
            <string>
             &lt;div&gt;This optimization avoids dispatcher lookups by keeping track potential return addresses of BL instructions. This approximates what happens with a return stack buffer on a real CPU.&lt;/div&gt;
            </string>
           </property>
+          <property name="text">
+           <string>Enable return stack buffer</string>
+          </property>
          </widget>
         </item>
         <item>
          <widget class="QCheckBox" name="cpuopt_fast_dispatcher">
-          <property name="text">
-           <string>Enable fast dispatcher</string>
-          </property>
           <property name="toolTip">
            <string>
             &lt;div&gt;Enable a two-tiered dispatch system. A faster dispatcher written in assembly has a small MRU cache of jump destinations is used first. If that fails, dispatch falls back to the slower C++ dispatcher.&lt;/div&gt;
            </string>
           </property>
+          <property name="text">
+           <string>Enable fast dispatcher</string>
+          </property>
          </widget>
         </item>
         <item>
          <widget class="QCheckBox" name="cpuopt_context_elimination">
-          <property name="text">
-           <string>Enable context elimination</string>
-          </property>
           <property name="toolTip">
            <string>
             &lt;div&gt;Enables an IR optimization that reduces unnecessary accesses to the CPU context structure.&lt;/div&gt;
            </string>
           </property>
+          <property name="text">
+           <string>Enable context elimination</string>
+          </property>
          </widget>
         </item>
         <item>
          <widget class="QCheckBox" name="cpuopt_const_prop">
-          <property name="text">
-           <string>Enable constant propagation</string>
-          </property>
           <property name="toolTip">
            <string>
             &lt;div&gt;Enables IR optimizations that involve constant propagation.&lt;/div&gt;
            </string>
           </property>
+          <property name="text">
+           <string>Enable constant propagation</string>
+          </property>
          </widget>
         </item>
         <item>
          <widget class="QCheckBox" name="cpuopt_misc_ir">
-          <property name="text">
-           <string>Enable miscellaneous optimizations</string>
-          </property>
           <property name="toolTip">
            <string>
             &lt;div&gt;Enables miscellaneous IR optimizations.&lt;/div&gt;
            </string>
           </property>
+          <property name="text">
+           <string>Enable miscellaneous optimizations</string>
+          </property>
          </widget>
         </item>
         <item>
          <widget class="QCheckBox" name="cpuopt_reduce_misalign_checks">
-          <property name="text">
-           <string>Enable misalignment check reduction</string>
-          </property>
           <property name="toolTip">
            <string>
-            &lt;div style="white-space: nowrap"&gt;When enabled, a misalignment is only triggered when an access crosses a page boundary.&lt;/div&gt;
-            &lt;div style="white-space: nowrap"&gt;When disabled, a misalignment is triggered on all misaligned accesses.&lt;/div&gt;
+            &lt;div style=&quot;white-space: nowrap&quot;&gt;When enabled, a misalignment is only triggered when an access crosses a page boundary.&lt;/div&gt;
+            &lt;div style=&quot;white-space: nowrap&quot;&gt;When disabled, a misalignment is triggered on all misaligned accesses.&lt;/div&gt;
            </string>
           </property>
+          <property name="text">
+           <string>Enable misalignment check reduction</string>
+          </property>
          </widget>
         </item>
         <item>
          <widget class="QCheckBox" name="cpuopt_fastmem">
-          <property name="text">
-           <string>Enable Host MMU Emulation</string>
-          </property>
           <property name="toolTip">
            <string>
-            &lt;div style="white-space: nowrap"&gt;This optimization speeds up memory accesses by the guest program.&lt;/div&gt;
-            &lt;div style="white-space: nowrap"&gt;Enabling it causes guest memory reads/writes to be done directly into memory and make use of Host's MMU.&lt;/div&gt;
-            &lt;div style="white-space: nowrap"&gt;Disabling this forces all memory accesses to use Software MMU Emulation.&lt;/div&gt;
+            &lt;div style=&quot;white-space: nowrap&quot;&gt;This optimization speeds up memory accesses by the guest program.&lt;/div&gt;
+            &lt;div style=&quot;white-space: nowrap&quot;&gt;Enabling it causes guest memory reads/writes to be done directly into memory and make use of Host's MMU.&lt;/div&gt;
+            &lt;div style=&quot;white-space: nowrap&quot;&gt;Disabling this forces all memory accesses to use Software MMU Emulation.&lt;/div&gt;
            </string>
           </property>
+          <property name="text">
+           <string>Enable Host MMU Emulation</string>
+          </property>
          </widget>
         </item>
        </layout>

+ 3 - 0
src/yuzu/configuration/configure_debug.cpp

@@ -43,6 +43,8 @@ void ConfigureDebug::SetConfiguration() {
     ui->use_auto_stub->setChecked(Settings::values.use_auto_stub.GetValue());
     ui->enable_graphics_debugging->setEnabled(runtime_lock);
     ui->enable_graphics_debugging->setChecked(Settings::values.renderer_debug.GetValue());
+    ui->enable_cpu_debugging->setEnabled(runtime_lock);
+    ui->enable_cpu_debugging->setChecked(Settings::values.cpu_debug_mode.GetValue());
     ui->disable_macro_jit->setEnabled(runtime_lock);
     ui->disable_macro_jit->setChecked(Settings::values.disable_macro_jit.GetValue());
     ui->extended_logging->setChecked(Settings::values.extended_logging.GetValue());
@@ -58,6 +60,7 @@ void ConfigureDebug::ApplyConfiguration() {
     Settings::values.use_debug_asserts = ui->use_debug_asserts->isChecked();
     Settings::values.use_auto_stub = ui->use_auto_stub->isChecked();
     Settings::values.renderer_debug = ui->enable_graphics_debugging->isChecked();
+    Settings::values.cpu_debug_mode = ui->enable_cpu_debugging->isChecked();
     Settings::values.disable_macro_jit = ui->disable_macro_jit->isChecked();
     Settings::values.extended_logging = ui->extended_logging->isChecked();
     Debugger::ToggleConsole();

+ 35 - 28
src/yuzu/configuration/configure_debug.ui

@@ -7,7 +7,7 @@
     <x>0</x>
     <y>0</y>
     <width>400</width>
-    <height>486</height>
+    <height>777</height>
    </rect>
   </property>
   <property name="windowTitle">
@@ -192,34 +192,41 @@
         </property>
        </widget>
       </item>
-       <item>
-         <widget class="QCheckBox" name="use_debug_asserts">
-           <property name="text">
-             <string>Enable Debug Asserts</string>
-           </property>
-         </widget>
-       </item>
-       <item>
-         <widget class="QCheckBox" name="use_auto_stub">
-           <property name="text">
-             <string>Enable Auto-Stub</string>
-           </property>
-         </widget>
-       </item>
       <item>
-        <widget class="QLabel" name="label_5">
-          <property name="font">
-            <font>
-              <italic>true</italic>
-            </font>
-          </property>
-          <property name="text">
-            <string>This will be reset automatically when yuzu closes.</string>
-          </property>
-          <property name="indent">
-            <number>20</number>
-          </property>
-        </widget>
+       <widget class="QCheckBox" name="enable_cpu_debugging">
+        <property name="text">
+         <string>Enable CPU Debugging</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QCheckBox" name="use_debug_asserts">
+        <property name="text">
+         <string>Enable Debug Asserts</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QCheckBox" name="use_auto_stub">
+        <property name="text">
+         <string>Enable Auto-Stub</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QLabel" name="label_5">
+        <property name="font">
+         <font>
+          <italic>true</italic>
+         </font>
+        </property>
+        <property name="text">
+         <string>This will be reset automatically when yuzu closes.</string>
+        </property>
+        <property name="indent">
+         <number>20</number>
+        </property>
+       </widget>
       </item>
      </layout>
     </widget>

+ 38 - 0
src/yuzu/configuration/configure_debug_tab.cpp

@@ -0,0 +1,38 @@
+// Copyright 2021 yuzu Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include "ui_configure_debug_tab.h"
+#include "yuzu/configuration/configure_debug_tab.h"
+
+ConfigureDebugTab::ConfigureDebugTab(QWidget* parent)
+    : QWidget(parent), ui(new Ui::ConfigureDebugTab) {
+    ui->setupUi(this);
+
+    SetConfiguration();
+}
+
+ConfigureDebugTab::~ConfigureDebugTab() = default;
+
+void ConfigureDebugTab::ApplyConfiguration() {
+    ui->debugTab->ApplyConfiguration();
+    ui->cpuDebugTab->ApplyConfiguration();
+}
+
+void ConfigureDebugTab::SetCurrentIndex(int index) {
+    ui->tabWidget->setCurrentIndex(index);
+}
+
+void ConfigureDebugTab::changeEvent(QEvent* event) {
+    if (event->type() == QEvent::LanguageChange) {
+        RetranslateUI();
+    }
+
+    QWidget::changeEvent(event);
+}
+
+void ConfigureDebugTab::RetranslateUI() {
+    ui->retranslateUi(this);
+}
+
+void ConfigureDebugTab::SetConfiguration() {}

+ 32 - 0
src/yuzu/configuration/configure_debug_tab.h

@@ -0,0 +1,32 @@
+// Copyright 2021 yuzu Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#pragma once
+
+#include <memory>
+#include <QWidget>
+
+namespace Ui {
+class ConfigureDebugTab;
+}
+
+class ConfigureDebugTab : public QWidget {
+    Q_OBJECT
+
+public:
+    explicit ConfigureDebugTab(QWidget* parent = nullptr);
+    ~ConfigureDebugTab() override;
+
+    void ApplyConfiguration();
+
+    void SetCurrentIndex(int index);
+
+private:
+    void changeEvent(QEvent* event) override;
+    void RetranslateUI();
+
+    void SetConfiguration();
+
+    std::unique_ptr<Ui::ConfigureDebugTab> ui;
+};

+ 52 - 0
src/yuzu/configuration/configure_debug_tab.ui

@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>ConfigureDebugTab</class>
+ <widget class="QWidget" name="ConfigureDebugTab">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>320</width>
+    <height>240</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Form</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <item>
+    <widget class="QTabWidget" name="tabWidget">
+     <property name="currentIndex">
+      <number>1</number>
+     </property>
+     <widget class="ConfigureDebug" name="debugTab">
+      <attribute name="title">
+       <string>General</string>
+      </attribute>
+     </widget>
+     <widget class="ConfigureCpuDebug" name="cpuDebugTab">
+      <attribute name="title">
+       <string>CPU</string>
+      </attribute>
+     </widget>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <customwidgets>
+  <customwidget>
+   <class>ConfigureDebug</class>
+   <extends>QWidget</extends>
+   <header>configuration/configure_debug.h</header>
+   <container>1</container>
+  </customwidget>
+  <customwidget>
+   <class>ConfigureCpuDebug</class>
+   <extends>QWidget</extends>
+   <header>configuration/configure_cpu_debug.h</header>
+   <container>1</container>
+  </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>

+ 4 - 2
src/yuzu/configuration/configure_dialog.cpp

@@ -8,6 +8,7 @@
 #include <QListWidgetItem>
 #include <QPushButton>
 #include <QSignalBlocker>
+#include <QTabWidget>
 #include "common/settings.h"
 #include "core/core.h"
 #include "ui_configure.h"
@@ -32,6 +33,8 @@ ConfigureDialog::ConfigureDialog(QWidget* parent, HotkeyRegistry& registry,
     SetConfiguration();
     PopulateSelectionList();
 
+    connect(ui->tabWidget, &QTabWidget::currentChanged, this,
+            [this]() { ui->debugTab->SetCurrentIndex(0); });
     connect(ui->uiTab, &ConfigureUi::LanguageChanged, this, &ConfigureDialog::OnLanguageChanged);
     connect(ui->selectorList, &QListWidget::itemSelectionChanged, this,
             &ConfigureDialog::UpdateVisibleTabs);
@@ -59,7 +62,6 @@ void ConfigureDialog::ApplyConfiguration() {
     ui->inputTab->ApplyConfiguration();
     ui->hotkeysTab->ApplyConfiguration(registry);
     ui->cpuTab->ApplyConfiguration();
-    ui->cpuDebugTab->ApplyConfiguration();
     ui->graphicsTab->ApplyConfiguration();
     ui->graphicsAdvancedTab->ApplyConfiguration();
     ui->audioTab->ApplyConfiguration();
@@ -102,7 +104,7 @@ void ConfigureDialog::PopulateSelectionList() {
     const std::array<std::pair<QString, QList<QWidget*>>, 6> items{
         {{tr("General"), {ui->generalTab, ui->hotkeysTab, ui->uiTab, ui->webTab, ui->debugTab}},
          {tr("System"), {ui->systemTab, ui->profileManagerTab, ui->serviceTab, ui->filesystemTab}},
-         {tr("CPU"), {ui->cpuTab, ui->cpuDebugTab}},
+         {tr("CPU"), {ui->cpuTab}},
          {tr("Graphics"), {ui->graphicsTab, ui->graphicsAdvancedTab}},
          {tr("Audio"), {ui->audioTab}},
          {tr("Controls"), ui->inputTab->GetSubTabs()}},