early-access version 1864
This commit is contained in:
		| @@ -1,7 +1,7 @@ | ||||
| yuzu emulator early access | ||||
| ============= | ||||
|  | ||||
| This is the source code for early-access 1863. | ||||
| This is the source code for early-access 1864. | ||||
|  | ||||
| ## Legal Notice | ||||
|  | ||||
|   | ||||
							
								
								
									
										20
									
								
								dist/qt_themes/default/style.qss
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										20
									
								
								dist/qt_themes/default/style.qss
									
									
									
									
										vendored
									
									
								
							| @@ -38,6 +38,26 @@ QPushButton#RendererStatusBarButton:!checked { | ||||
|     color: #0066ff; | ||||
| } | ||||
|  | ||||
| QPushButton#GPUStatusBarButton { | ||||
|     color: #656565; | ||||
|     border: 1px solid transparent; | ||||
|     background-color: transparent; | ||||
|     padding: 0px 3px 0px 3px; | ||||
|     text-align: center; | ||||
| } | ||||
|  | ||||
| QPushButton#GPUStatusBarButton:hover { | ||||
|     border: 1px solid #76797C; | ||||
| } | ||||
|  | ||||
| QPushButton#GPUStatusBarButton:checked { | ||||
|     color: #ff8040; | ||||
| } | ||||
|  | ||||
| QPushButton#GPUStatusBarButton:!checked { | ||||
|     color: #40dd40; | ||||
| } | ||||
|  | ||||
| QPushButton#buttonRefreshDevices { | ||||
|     min-width: 21px; | ||||
|     min-height: 21px; | ||||
|   | ||||
							
								
								
									
										21
									
								
								dist/qt_themes/qdarkstyle/style.qss
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										21
									
								
								dist/qt_themes/qdarkstyle/style.qss
									
									
									
									
										vendored
									
									
								
							| @@ -1283,6 +1283,27 @@ QPushButton#RendererStatusBarButton:!checked { | ||||
|     color: #00ccdd; | ||||
| } | ||||
|  | ||||
| QPushButton#GPUStatusBarButton { | ||||
|     min-width: 0px; | ||||
|     color: #656565; | ||||
|     border: 1px solid transparent; | ||||
|     background-color: transparent; | ||||
|     padding: 0px 3px 0px 3px; | ||||
|     text-align: center; | ||||
| } | ||||
|  | ||||
| QPushButton#GPUStatusBarButton:hover { | ||||
|     border: 1px solid #76797C; | ||||
| } | ||||
|  | ||||
| QPushButton#GPUStatusBarButton:checked { | ||||
|     color: #ff8040; | ||||
| } | ||||
|  | ||||
| QPushButton#GPUStatusBarButton:!checked { | ||||
|     color: #40dd40; | ||||
| } | ||||
|  | ||||
| QPushButton#buttonRefreshDevices { | ||||
|     min-width: 23px; | ||||
|     min-height: 23px; | ||||
|   | ||||
| @@ -2186,6 +2186,27 @@ QPushButton#RendererStatusBarButton:!checked { | ||||
|   color: #00ccdd; | ||||
| } | ||||
|  | ||||
| QPushButton#GPUStatusBarButton { | ||||
|   min-width: 0px; | ||||
|   color: #656565; | ||||
|   border: 1px solid transparent; | ||||
|   background-color: transparent; | ||||
|   padding: 0px 3px 0px 3px; | ||||
|   text-align: center; | ||||
| } | ||||
|  | ||||
| QPushButton#GPUStatusBarButton:hover { | ||||
|   border: 1px solid #76797C; | ||||
| } | ||||
|  | ||||
| QPushButton#GPUStatusBarButton:checked { | ||||
|   color: #ff8040; | ||||
| } | ||||
|  | ||||
| QPushButton#GPUStatusBarButton:!checked { | ||||
|   color: #40dd40; | ||||
| } | ||||
|  | ||||
| QPushButton#buttonRefreshDevices { | ||||
|   min-width: 19px; | ||||
|   min-height: 19px; | ||||
|   | ||||
| @@ -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; | ||||
|   | ||||
| @@ -31,9 +31,9 @@ enum class GPUAccuracy : u32 { | ||||
| }; | ||||
|  | ||||
| enum class CPUAccuracy : u32 { | ||||
|     Accurate = 0, | ||||
|     Unsafe = 1, | ||||
|     DebugMode = 2, | ||||
|     Auto = 0, | ||||
|     Accurate = 1, | ||||
|     Unsafe = 2, | ||||
| }; | ||||
|  | ||||
| /** The BasicSetting class is a simple resource manager. It defines a label and default value | ||||
| @@ -284,7 +284,10 @@ struct Values { | ||||
|     Setting<bool> use_multi_core{true, "use_multi_core"}; | ||||
|  | ||||
|     // Cpu | ||||
|     Setting<CPUAccuracy> cpu_accuracy{CPUAccuracy::Accurate, "cpu_accuracy"}; | ||||
|     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"}; | ||||
|   | ||||
| @@ -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; | ||||
|         } | ||||
| @@ -183,20 +183,28 @@ std::shared_ptr<Dynarmic::A32::Jit> ARM_Dynarmic_32::MakeJit(Common::PageTable* | ||||
|     // Unsafe optimizations | ||||
|     if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Unsafe) { | ||||
|         config.unsafe_optimizations = true; | ||||
|         if (Settings::values.cpuopt_unsafe_unfuse_fma.GetValue()) { | ||||
|         if (Settings::values.cpuopt_unsafe_unfuse_fma) { | ||||
|             config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA; | ||||
|         } | ||||
|         if (Settings::values.cpuopt_unsafe_reduce_fp_error.GetValue()) { | ||||
|         if (Settings::values.cpuopt_unsafe_reduce_fp_error) { | ||||
|             config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_ReducedErrorFP; | ||||
|         } | ||||
|         if (Settings::values.cpuopt_unsafe_ignore_standard_fpcr.GetValue()) { | ||||
|         if (Settings::values.cpuopt_unsafe_ignore_standard_fpcr) { | ||||
|             config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreStandardFPCRValue; | ||||
|         } | ||||
|         if (Settings::values.cpuopt_unsafe_inaccurate_nan.GetValue()) { | ||||
|         if (Settings::values.cpuopt_unsafe_inaccurate_nan) { | ||||
|             config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // Curated optimizations | ||||
|     if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Auto) { | ||||
|         config.unsafe_optimizations = true; | ||||
|         config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA; | ||||
|         config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreStandardFPCRValue; | ||||
|         config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN; | ||||
|     } | ||||
|  | ||||
|     return std::make_unique<Dynarmic::A32::Jit>(config); | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -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; | ||||
|         } | ||||
| @@ -223,20 +223,28 @@ std::shared_ptr<Dynarmic::A64::Jit> ARM_Dynarmic_64::MakeJit(Common::PageTable* | ||||
|     // Unsafe optimizations | ||||
|     if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Unsafe) { | ||||
|         config.unsafe_optimizations = true; | ||||
|         if (Settings::values.cpuopt_unsafe_unfuse_fma.GetValue()) { | ||||
|         if (Settings::values.cpuopt_unsafe_unfuse_fma) { | ||||
|             config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA; | ||||
|         } | ||||
|         if (Settings::values.cpuopt_unsafe_reduce_fp_error.GetValue()) { | ||||
|         if (Settings::values.cpuopt_unsafe_reduce_fp_error) { | ||||
|             config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_ReducedErrorFP; | ||||
|         } | ||||
|         if (Settings::values.cpuopt_unsafe_inaccurate_nan.GetValue()) { | ||||
|         if (Settings::values.cpuopt_unsafe_inaccurate_nan) { | ||||
|             config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN; | ||||
|         } | ||||
|         if (Settings::values.cpuopt_unsafe_fastmem_check.GetValue()) { | ||||
|         if (Settings::values.cpuopt_unsafe_fastmem_check) { | ||||
|             config.fastmem_address_space_bits = 64; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // Curated optimizations | ||||
|     if (Settings::values.cpu_accuracy.GetValue() == Settings::CPUAccuracy::Auto) { | ||||
|         config.unsafe_optimizations = true; | ||||
|         config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA; | ||||
|         config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN; | ||||
|         config.fastmem_address_space_bits = 64; | ||||
|     } | ||||
|  | ||||
|     return std::make_shared<Dynarmic::A64::Jit>(config); | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
| @@ -793,7 +793,13 @@ void Config::ReadPathValues() { | ||||
| void Config::ReadCpuValues() { | ||||
|     qt_config->beginGroup(QStringLiteral("Cpu")); | ||||
|  | ||||
|     ReadGlobalSetting(Settings::values.cpu_accuracy); | ||||
|     ReadBasicSetting(Settings::values.cpu_accuracy_first_time); | ||||
|     if (Settings::values.cpu_accuracy_first_time) { | ||||
|         Settings::values.cpu_accuracy.SetValue(Settings::values.cpu_accuracy.GetDefault()); | ||||
|         Settings::values.cpu_accuracy_first_time.SetValue(false); | ||||
|     } else { | ||||
|         ReadGlobalSetting(Settings::values.cpu_accuracy); | ||||
|     } | ||||
|  | ||||
|     ReadGlobalSetting(Settings::values.cpuopt_unsafe_unfuse_fma); | ||||
|     ReadGlobalSetting(Settings::values.cpuopt_unsafe_reduce_fp_error); | ||||
| @@ -802,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); | ||||
| @@ -1309,6 +1316,7 @@ void Config::SavePathValues() { | ||||
| void Config::SaveCpuValues() { | ||||
|     qt_config->beginGroup(QStringLiteral("Cpu")); | ||||
|  | ||||
|     WriteBasicSetting(Settings::values.cpu_accuracy_first_time); | ||||
|     WriteSetting(QStringLiteral("cpu_accuracy"), | ||||
|                  static_cast<u32>(Settings::values.cpu_accuracy.GetValue(global)), | ||||
|                  static_cast<u32>(Settings::values.cpu_accuracy.GetDefault()), | ||||
| @@ -1321,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); | ||||
|   | ||||
| @@ -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> | ||||
|   | ||||
| @@ -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, | ||||
|   | ||||
| @@ -29,7 +29,6 @@ private: | ||||
|     void changeEvent(QEvent* event) override; | ||||
|     void RetranslateUI(); | ||||
|  | ||||
|     void AccuracyUpdated(int index); | ||||
|     void UpdateGroup(int index); | ||||
|  | ||||
|     void SetConfiguration(); | ||||
|   | ||||
| @@ -6,8 +6,8 @@ | ||||
|    <rect> | ||||
|     <x>0</x> | ||||
|     <y>0</y> | ||||
|     <width>400</width> | ||||
|     <height>321</height> | ||||
|     <width>448</width> | ||||
|     <height>433</height> | ||||
|    </rect> | ||||
|   </property> | ||||
|   <property name="windowTitle"> | ||||
| @@ -17,7 +17,7 @@ | ||||
|    <item> | ||||
|     <layout class="QVBoxLayout"> | ||||
|      <item> | ||||
|       <widget class="QGroupBox"> | ||||
|       <widget class="QGroupBox" name="groupBox"> | ||||
|        <property name="title"> | ||||
|         <string>General</string> | ||||
|        </property> | ||||
| @@ -34,6 +34,11 @@ | ||||
|            </item> | ||||
|            <item> | ||||
|             <widget class="QComboBox" name="accuracy"> | ||||
|              <item> | ||||
|               <property name="text"> | ||||
|                <string>Auto</string> | ||||
|               </property> | ||||
|              </item> | ||||
|              <item> | ||||
|               <property name="text"> | ||||
|                <string>Accurate</string> | ||||
| @@ -44,11 +49,6 @@ | ||||
|                <string>Unsafe</string> | ||||
|               </property> | ||||
|              </item> | ||||
|              <item> | ||||
|               <property name="text"> | ||||
|                <string>Enable Debug Mode</string> | ||||
|               </property> | ||||
|              </item> | ||||
|             </widget> | ||||
|            </item> | ||||
|           </layout> | ||||
| @@ -57,7 +57,7 @@ | ||||
|         <item> | ||||
|          <widget class="QLabel" name="label_recommended_accuracy"> | ||||
|           <property name="text"> | ||||
|            <string>We recommend setting accuracy to "Accurate".</string> | ||||
|            <string>We recommend setting accuracy to "Auto".</string> | ||||
|           </property> | ||||
|           <property name="wordWrap"> | ||||
|            <bool>false</bool> | ||||
|   | ||||
| @@ -6,7 +6,6 @@ | ||||
|  | ||||
| #include <memory> | ||||
| #include <QWidget> | ||||
| #include "common/settings.h" | ||||
|  | ||||
| namespace Ui { | ||||
| class ConfigureCpuDebug; | ||||
|   | ||||
| @@ -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> | ||||
|             <div> | ||||
|             <b>For debugging only.</b> | ||||
|             <br> | ||||
|             If you're not sure what these do, keep all of these enabled. | ||||
|             <br> | ||||
|             These settings, when disabled, only take effect when CPU Accuracy is "Debug Mode". | ||||
|             </div> | ||||
|            </string> | ||||
|            <string><html><head/><body><p><span style=" font-weight:600;">For debugging only.</span><br/>If you're not sure what these do, keep all of these enabled. <br/>These settings, when disabled, only take effect when CPU Debugging is enabled. </p></body></html></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> | ||||
|             <div style="white-space: nowrap">This optimization speeds up memory accesses by the guest program.</div> | ||||
|             <div style="white-space: nowrap">Enabling it inlines accesses to PageTable::pointers into emitted code.</div> | ||||
|             <div style="white-space: nowrap">Disabling this forces all memory accesses to go through the Memory::Read/Memory::Write functions.</div> | ||||
|             <div style="white-space: nowrap">This optimization speeds up memory accesses by the guest program.</div> | ||||
|             <div style="white-space: nowrap">Enabling it inlines accesses to PageTable::pointers into emitted code.</div> | ||||
|             <div style="white-space: nowrap">Disabling this forces all memory accesses to go through the Memory::Read/Memory::Write functions.</div> | ||||
|            </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> | ||||
|             <div>This optimization avoids dispatcher lookups by allowing emitted basic blocks to jump directly to other basic blocks if the destination PC is static.</div> | ||||
|            </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> | ||||
|             <div>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.</div> | ||||
|            </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> | ||||
|             <div>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.</div> | ||||
|            </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> | ||||
|             <div>Enables an IR optimization that reduces unnecessary accesses to the CPU context structure.</div> | ||||
|            </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> | ||||
|             <div>Enables IR optimizations that involve constant propagation.</div> | ||||
|            </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> | ||||
|             <div>Enables miscellaneous IR optimizations.</div> | ||||
|            </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> | ||||
|             <div style="white-space: nowrap">When enabled, a misalignment is only triggered when an access crosses a page boundary.</div> | ||||
|             <div style="white-space: nowrap">When disabled, a misalignment is triggered on all misaligned accesses.</div> | ||||
|             <div style="white-space: nowrap">When enabled, a misalignment is only triggered when an access crosses a page boundary.</div> | ||||
|             <div style="white-space: nowrap">When disabled, a misalignment is triggered on all misaligned accesses.</div> | ||||
|            </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> | ||||
|             <div style="white-space: nowrap">This optimization speeds up memory accesses by the guest program.</div> | ||||
|             <div style="white-space: nowrap">Enabling it causes guest memory reads/writes to be done directly into memory and make use of Host's MMU.</div> | ||||
|             <div style="white-space: nowrap">Disabling this forces all memory accesses to use Software MMU Emulation.</div> | ||||
|             <div style="white-space: nowrap">This optimization speeds up memory accesses by the guest program.</div> | ||||
|             <div style="white-space: nowrap">Enabling it causes guest memory reads/writes to be done directly into memory and make use of Host's MMU.</div> | ||||
|             <div style="white-space: nowrap">Disabling this forces all memory accesses to use Software MMU Emulation.</div> | ||||
|            </string> | ||||
|           </property> | ||||
|           <property name="text"> | ||||
|            <string>Enable Host MMU Emulation</string> | ||||
|           </property> | ||||
|          </widget> | ||||
|         </item> | ||||
|        </layout> | ||||
|   | ||||
| @@ -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(); | ||||
|   | ||||
| @@ -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
									
								
								src/yuzu/configuration/configure_debug_tab.cpp
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										38
									
								
								src/yuzu/configuration/configure_debug_tab.cpp
									
									
									
									
									
										Executable file
									
								
							| @@ -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
									
								
								src/yuzu/configuration/configure_debug_tab.h
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										32
									
								
								src/yuzu/configuration/configure_debug_tab.h
									
									
									
									
									
										Executable file
									
								
							| @@ -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
									
								
								src/yuzu/configuration/configure_debug_tab.ui
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										52
									
								
								src/yuzu/configuration/configure_debug_tab.ui
									
									
									
									
									
										Executable file
									
								
							| @@ -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> | ||||
| @@ -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()}}, | ||||
|   | ||||
| @@ -789,41 +789,28 @@ void GMainWindow::InitializeWidgets() { | ||||
|     dock_status_button->setChecked(Settings::values.use_docked_mode.GetValue()); | ||||
|     statusBar()->insertPermanentWidget(0, dock_status_button); | ||||
|  | ||||
|     // Setup ASync button | ||||
|     async_status_button = new QPushButton(); | ||||
|     async_status_button->setObjectName(QStringLiteral("TogglableStatusBarButton")); | ||||
|     async_status_button->setFocusPolicy(Qt::NoFocus); | ||||
|     connect(async_status_button, &QPushButton::clicked, [&] { | ||||
|         if (emulation_running) { | ||||
|             return; | ||||
|     gpu_accuracy_button = new QPushButton(); | ||||
|     gpu_accuracy_button->setObjectName(QStringLiteral("GPUStatusBarButton")); | ||||
|     gpu_accuracy_button->setCheckable(true); | ||||
|     gpu_accuracy_button->setFocusPolicy(Qt::NoFocus); | ||||
|     connect(gpu_accuracy_button, &QPushButton::clicked, [this] { | ||||
|         switch (Settings::values.gpu_accuracy.GetValue()) { | ||||
|         case Settings::GPUAccuracy::High: { | ||||
|             Settings::values.gpu_accuracy.SetValue(Settings::GPUAccuracy::Normal); | ||||
|             break; | ||||
|         } | ||||
|         case Settings::GPUAccuracy::Normal: | ||||
|         case Settings::GPUAccuracy::Extreme: | ||||
|         default: { | ||||
|             Settings::values.gpu_accuracy.SetValue(Settings::GPUAccuracy::High); | ||||
|         } | ||||
|         Settings::values.use_asynchronous_gpu_emulation.SetValue( | ||||
|             !Settings::values.use_asynchronous_gpu_emulation.GetValue()); | ||||
|         async_status_button->setChecked(Settings::values.use_asynchronous_gpu_emulation.GetValue()); | ||||
|         Core::System::GetInstance().ApplySettings(); | ||||
|     }); | ||||
|     async_status_button->setText(tr("ASYNC")); | ||||
|     async_status_button->setCheckable(true); | ||||
|     async_status_button->setChecked(Settings::values.use_asynchronous_gpu_emulation.GetValue()); | ||||
|  | ||||
|     // Setup Multicore button | ||||
|     multicore_status_button = new QPushButton(); | ||||
|     multicore_status_button->setObjectName(QStringLiteral("TogglableStatusBarButton")); | ||||
|     multicore_status_button->setFocusPolicy(Qt::NoFocus); | ||||
|     connect(multicore_status_button, &QPushButton::clicked, [&] { | ||||
|         if (emulation_running) { | ||||
|             return; | ||||
|         } | ||||
|         Settings::values.use_multi_core.SetValue(!Settings::values.use_multi_core.GetValue()); | ||||
|         multicore_status_button->setChecked(Settings::values.use_multi_core.GetValue()); | ||||
|         Core::System::GetInstance().ApplySettings(); | ||||
|     }); | ||||
|     multicore_status_button->setText(tr("MULTICORE")); | ||||
|     multicore_status_button->setCheckable(true); | ||||
|     multicore_status_button->setChecked(Settings::values.use_multi_core.GetValue()); | ||||
|  | ||||
|     statusBar()->insertPermanentWidget(0, multicore_status_button); | ||||
|     statusBar()->insertPermanentWidget(0, async_status_button); | ||||
|         Core::System::GetInstance().ApplySettings(); | ||||
|         UpdateGPUAccuracyButton(); | ||||
|     }); | ||||
|     UpdateGPUAccuracyButton(); | ||||
|     statusBar()->insertPermanentWidget(0, gpu_accuracy_button); | ||||
|  | ||||
|     // Setup Renderer API button | ||||
|     renderer_status_button = new QPushButton(); | ||||
| @@ -1397,8 +1384,6 @@ void GMainWindow::BootGame(const QString& filename, std::size_t program_index, S | ||||
|         game_list_placeholder->hide(); | ||||
|     } | ||||
|     status_bar_update_timer.start(500); | ||||
|     async_status_button->setDisabled(true); | ||||
|     multicore_status_button->setDisabled(true); | ||||
|     renderer_status_button->setDisabled(true); | ||||
|  | ||||
|     if (UISettings::values.hide_mouse || Settings::values.mouse_panning) { | ||||
| @@ -1500,8 +1485,6 @@ void GMainWindow::ShutdownGame() { | ||||
|     emu_speed_label->setVisible(false); | ||||
|     game_fps_label->setVisible(false); | ||||
|     emu_frametime_label->setVisible(false); | ||||
|     async_status_button->setEnabled(true); | ||||
|     multicore_status_button->setEnabled(true); | ||||
|     renderer_status_button->setEnabled(true); | ||||
|  | ||||
|     emulation_running = false; | ||||
| @@ -2921,12 +2904,35 @@ void GMainWindow::UpdateStatusBar() { | ||||
|     emu_frametime_label->setVisible(true); | ||||
| } | ||||
|  | ||||
| void GMainWindow::UpdateGPUAccuracyButton() { | ||||
|     switch (Settings::values.gpu_accuracy.GetValue()) { | ||||
|     case Settings::GPUAccuracy::Normal: { | ||||
|         gpu_accuracy_button->setText(tr("GPU NORMAL ")); | ||||
|         gpu_accuracy_button->setChecked(false); | ||||
|         break; | ||||
|     } | ||||
|     case Settings::GPUAccuracy::High: { | ||||
|         gpu_accuracy_button->setText(tr("GPU HIGH   ")); | ||||
|         gpu_accuracy_button->setChecked(true); | ||||
|         break; | ||||
|     } | ||||
|     case Settings::GPUAccuracy::Extreme: { | ||||
|         gpu_accuracy_button->setText(tr("GPU EXTREME")); | ||||
|         gpu_accuracy_button->setChecked(true); | ||||
|         break; | ||||
|     } | ||||
|     default: { | ||||
|         gpu_accuracy_button->setText(tr("GPU ERROR")); | ||||
|         gpu_accuracy_button->setChecked(true); | ||||
|     } | ||||
|     } | ||||
| } | ||||
|  | ||||
| void GMainWindow::UpdateStatusButtons() { | ||||
|     dock_status_button->setChecked(Settings::values.use_docked_mode.GetValue()); | ||||
|     multicore_status_button->setChecked(Settings::values.use_multi_core.GetValue()); | ||||
|     async_status_button->setChecked(Settings::values.use_asynchronous_gpu_emulation.GetValue()); | ||||
|     renderer_status_button->setChecked(Settings::values.renderer_backend.GetValue() == | ||||
|                                        Settings::RendererBackend::Vulkan); | ||||
|     UpdateGPUAccuracyButton(); | ||||
| } | ||||
|  | ||||
| void GMainWindow::UpdateUISettings() { | ||||
|   | ||||
| @@ -291,6 +291,7 @@ private: | ||||
|     void UpdateWindowTitle(std::string_view title_name = {}, std::string_view title_version = {}, | ||||
|                            std::string_view gpu_vendor = {}); | ||||
|     void UpdateStatusBar(); | ||||
|     void UpdateGPUAccuracyButton(); | ||||
|     void UpdateStatusButtons(); | ||||
|     void UpdateUISettings(); | ||||
|     void HideMouseCursor(); | ||||
| @@ -316,8 +317,7 @@ private: | ||||
|     QLabel* emu_speed_label = nullptr; | ||||
|     QLabel* game_fps_label = nullptr; | ||||
|     QLabel* emu_frametime_label = nullptr; | ||||
|     QPushButton* async_status_button = nullptr; | ||||
|     QPushButton* multicore_status_button = nullptr; | ||||
|     QPushButton* gpu_accuracy_button = nullptr; | ||||
|     QPushButton* renderer_status_button = nullptr; | ||||
|     QPushButton* dock_status_button = nullptr; | ||||
|     QTimer status_bar_update_timer; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user