diff --git a/dist/qt_themes/qdarkstyle/style.qss b/dist/qt_themes/qdarkstyle/style.qss index 9814b06ddc..9624713e81 100644 --- a/dist/qt_themes/qdarkstyle/style.qss +++ b/dist/qt_themes/qdarkstyle/style.qss @@ -1236,3 +1236,39 @@ QToolButton:disabled, QPlainTextEdit:disabled { background-color: #2b2e31; } + +QPushButton#TogglableStatusBarButton { + color: #656565; + border: 1px solid transparent; + background-color: transparent; + padding: 0px 3px 0px 3px; + text-align: center; +} + +QPushButton#TogglableStatusBarButton:checked { + color: #ffffff; +} + +QPushButton#TogglableStatusBarButton:hover { + border: 1px solid #76797C; +} + +QPushButton#RendererStatusBarButton { + color: #656565; + border: 1px solid transparent; + background-color: transparent; + padding: 0px 3px 0px 3px; + text-align: center; +} + +QPushButton#RendererStatusBarButton:hover { + border: 1px solid #76797C; +} + +QPushButton#RendererStatusBarButton:checked { + color: #e85c00; +} + +QPushButton#RendererStatusBarButton:!checked{ + color: #00ccdd; +} \ No newline at end of file diff --git a/externals/dynarmic b/externals/dynarmic index f6ae9e1c33..087a74417a 160000 --- a/externals/dynarmic +++ b/externals/dynarmic @@ -1 +1 @@ -Subproject commit f6ae9e1c3311b747b7b91fd903c62bf40b3b9c88 +Subproject commit 087a74417abfb0a8ae3bc1463d0d476a9bf94e53 diff --git a/externals/sirit b/externals/sirit index a712959f1e..9f4d057aa2 160000 --- a/externals/sirit +++ b/externals/sirit @@ -1 +1 @@ -Subproject commit a712959f1e373a33b48042b5934e288a243d5954 +Subproject commit 9f4d057aa28c4e9509bdc767afb27b4aee303b7e diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp index b5dd3e0d60..1a12ec7e83 100644 --- a/src/yuzu/main.cpp +++ b/src/yuzu/main.cpp @@ -478,6 +478,37 @@ void GMainWindow::InitializeWidgets() { label->setContentsMargins(4, 0, 4, 0); statusBar()->addPermanentWidget(label, 0); } + + async_status_button = new QPushButton(); + async_status_button->setText(tr("ASYNC")); + async_status_button->setObjectName(tr("StatusButton")); + async_status_button->setCheckable(true); + async_status_button->setChecked(Settings::values.use_asynchronous_gpu_emulation); + statusBar()->addPermanentWidget(async_status_button, 0); + + accurate_status_button = new QPushButton(); + accurate_status_button->setText(tr("ACCUR")); + accurate_status_button->setObjectName(tr("StatusButton")); + accurate_status_button->setCheckable(true); + accurate_status_button->setChecked(Settings::values.use_accurate_gpu_emulation); + statusBar()->addPermanentWidget(accurate_status_button, 0); + + fps30_status_button = new QPushButton(); + fps30_status_button->setText(tr("30FPS")); + fps30_status_button->setObjectName(tr("StatusButton")); + fps30_status_button->setCheckable(true); + fps30_status_button->setChecked(Settings::values.force_30fps_mode); + statusBar()->addPermanentWidget(fps30_status_button, 0); + + renderer_status_button = new QPushButton(); + renderer_status_button->setText(tr("OPENGL")); + renderer_status_button->setObjectName(tr("StatusButton")); + //renderer_status_button->setCheckable(true); + //renderer_status_button->setChecked(true); + renderer_status_button->setDisabled(true); + renderer_status_button->setStyleSheet(QStringLiteral("QPushButton:disabled{border-color: #0000FF;}")); + statusBar()->addPermanentWidget(renderer_status_button, 0); + statusBar()->setVisible(true); setStyleSheet(QStringLiteral("QStatusBar::item{border: none;}")); } @@ -724,6 +755,10 @@ void GMainWindow::ConnectWidgetEvents() { &GRenderWindow::OnEmulationStopping); connect(&status_bar_update_timer, &QTimer::timeout, this, &GMainWindow::UpdateStatusBar); + + connect(async_status_button, &QPushButton::clicked, this, &GMainWindow::OnToggleASyncGPU); + connect(accurate_status_button, &QPushButton::clicked, this, &GMainWindow::OnToggleAccurateGPU); + connect(fps30_status_button, &QPushButton::clicked, this, &GMainWindow::OnToggle30FPSGPU); } void GMainWindow::ConnectMenuEvents() { @@ -1000,6 +1035,10 @@ void GMainWindow::BootGame(const QString& filename) { game_list_placeholder->hide(); } status_bar_update_timer.start(2000); + async_status_button->setDisabled(true); + accurate_status_button->setDisabled(true); + fps30_status_button->setDisabled(true); + renderer_status_button->setDisabled(true); const u64 title_id = Core::System::GetInstance().CurrentProcess()->GetTitleID(); @@ -1069,6 +1108,9 @@ void GMainWindow::ShutdownGame() { emu_speed_label->setVisible(false); game_fps_label->setVisible(false); emu_frametime_label->setVisible(false); + async_status_button->setEnabled(true); + accurate_status_button->setEnabled(true); + fps30_status_button->setEnabled(true); emulation_running = false; @@ -1836,6 +1878,10 @@ void GMainWindow::OnConfigure() { } config->Save(); + + async_status_button->setChecked(Settings::values.use_asynchronous_gpu_emulation); + accurate_status_button->setChecked(Settings::values.use_accurate_gpu_emulation); + fps30_status_button->setChecked(Settings::values.force_30fps_mode); } void GMainWindow::OnLoadAmiibo() { @@ -2113,6 +2159,37 @@ void GMainWindow::OnReinitializeKeys(ReinitializeKeyBehavior behavior) { } } +void GMainWindow::OnToggleASyncGPU() { + if (emulation_running) + return; + + Settings::values.use_asynchronous_gpu_emulation = + !Settings::values.use_asynchronous_gpu_emulation; + async_status_button->setChecked(Settings::values.use_asynchronous_gpu_emulation); + + Settings::Apply(); +} + +void GMainWindow::OnToggleAccurateGPU() { + if (emulation_running) + return; + + Settings::values.use_accurate_gpu_emulation = !Settings::values.use_accurate_gpu_emulation; + accurate_status_button->setChecked(Settings::values.use_accurate_gpu_emulation); + + Settings::Apply(); +} + +void GMainWindow::OnToggle30FPSGPU() { + if (emulation_running) + return; + + Settings::values.force_30fps_mode = !Settings::values.force_30fps_mode; + fps30_status_button->setChecked(Settings::values.force_30fps_mode); + + Settings::Apply(); +} + std::optional GMainWindow::SelectRomFSDumpTarget(const FileSys::ContentProvider& installed, u64 program_id) { const auto dlc_entries = diff --git a/src/yuzu/main.h b/src/yuzu/main.h index a56f9a981f..276f99c592 100644 --- a/src/yuzu/main.h +++ b/src/yuzu/main.h @@ -27,6 +27,7 @@ class LoadingScreen; class MicroProfileDialog; class ProfilerWidget; class QLabel; +class QPushButton; class WaitTreeWidget; enum class GameListOpenTarget; class GameListPlaceholder; @@ -210,6 +211,9 @@ private slots: void OnCaptureScreenshot(); void OnCoreError(Core::System::ResultStatus, std::string); void OnReinitializeKeys(ReinitializeKeyBehavior behavior); + void OnToggleASyncGPU(); + void OnToggleAccurateGPU(); + void OnToggle30FPSGPU(); private: std::optional SelectRomFSDumpTarget(const FileSys::ContentProvider&, u64 program_id); @@ -229,6 +233,10 @@ private: QLabel* emu_speed_label = nullptr; QLabel* game_fps_label = nullptr; QLabel* emu_frametime_label = nullptr; + QPushButton* async_status_button = nullptr; + QPushButton* accurate_status_button = nullptr; + QPushButton* fps30_status_button = nullptr; + QPushButton* renderer_status_button = nullptr; QTimer status_bar_update_timer; std::unique_ptr config;