summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/yuzu/configuration/configure_graphics.cpp94
-rw-r--r--src/yuzu/configuration/configure_graphics.h4
2 files changed, 68 insertions, 30 deletions
diff --git a/src/yuzu/configuration/configure_graphics.cpp b/src/yuzu/configuration/configure_graphics.cpp
index fd6bebf0f..0836bcb7e 100644
--- a/src/yuzu/configuration/configure_graphics.cpp
+++ b/src/yuzu/configuration/configure_graphics.cpp
@@ -106,32 +106,30 @@ ConfigureGraphics::ConfigureGraphics(
Settings::values.bg_green.GetValue(),
Settings::values.bg_blue.GetValue()));
UpdateAPILayout();
- PopulateVSyncModeSelection(); //< must happen after UpdateAPILayout
+ PopulateVSyncModeSelection(false); //< must happen after UpdateAPILayout
// VSync setting needs to be determined after populating the VSync combobox
- if (Settings::IsConfiguringGlobal()) {
- const auto vsync_mode_setting = Settings::values.vsync_mode.GetValue();
- const auto vsync_mode = VSyncSettingToMode(vsync_mode_setting);
- int index{};
- for (const auto mode : vsync_mode_combobox_enum_map) {
- if (mode == vsync_mode) {
- break;
- }
- index++;
- }
- if (static_cast<unsigned long>(index) < vsync_mode_combobox_enum_map.size()) {
- vsync_mode_combobox->setCurrentIndex(index);
+ const auto vsync_mode_setting = Settings::values.vsync_mode.GetValue();
+ const auto vsync_mode = VSyncSettingToMode(vsync_mode_setting);
+ int index{};
+ for (const auto mode : vsync_mode_combobox_enum_map) {
+ if (mode == vsync_mode) {
+ break;
}
+ index++;
+ }
+ if (static_cast<unsigned long>(index) < vsync_mode_combobox_enum_map.size()) {
+ vsync_mode_combobox->setCurrentIndex(index);
}
connect(api_combobox, qOverload<int>(&QComboBox::activated), this, [this] {
UpdateAPILayout();
- PopulateVSyncModeSelection();
+ PopulateVSyncModeSelection(false);
});
connect(vulkan_device_combobox, qOverload<int>(&QComboBox::activated), this,
[this](int device) {
UpdateDeviceSelection(device);
- PopulateVSyncModeSelection();
+ PopulateVSyncModeSelection(false);
});
connect(shader_backend_combobox, qOverload<int>(&QComboBox::activated), this,
[this](int backend) { UpdateShaderBackendSelection(backend); });
@@ -147,8 +145,9 @@ ConfigureGraphics::ConfigureGraphics(
const auto& update_screenshot_info = [this, &builder]() {
const auto& combobox_enumerations = builder.ComboboxTranslations().at(
Settings::EnumMetadata<Settings::AspectRatio>::Index());
- const auto index = aspect_ratio_combobox->currentIndex();
- const auto ratio = static_cast<Settings::AspectRatio>(combobox_enumerations[index].first);
+ const auto ratio_index = aspect_ratio_combobox->currentIndex();
+ const auto ratio =
+ static_cast<Settings::AspectRatio>(combobox_enumerations[ratio_index].first);
const auto& combobox_enumerations_resolution = builder.ComboboxTranslations().at(
Settings::EnumMetadata<Settings::ResolutionSetup>::Index());
@@ -174,11 +173,7 @@ ConfigureGraphics::ConfigureGraphics(
}
}
-void ConfigureGraphics::PopulateVSyncModeSelection() {
- if (!Settings::IsConfiguringGlobal()) {
- return;
- }
-
+void ConfigureGraphics::PopulateVSyncModeSelection(bool use_setting) {
const Settings::RendererBackend backend{GetCurrentGraphicsBackend()};
if (backend == Settings::RendererBackend::Null) {
vsync_mode_combobox->setEnabled(false);
@@ -189,8 +184,9 @@ void ConfigureGraphics::PopulateVSyncModeSelection() {
const int current_index = //< current selected vsync mode from combobox
vsync_mode_combobox->currentIndex();
const auto current_mode = //< current selected vsync mode as a VkPresentModeKHR
- current_index == -1 ? VSyncSettingToMode(Settings::values.vsync_mode.GetValue())
- : vsync_mode_combobox_enum_map[current_index];
+ current_index == -1 || use_setting
+ ? VSyncSettingToMode(Settings::values.vsync_mode.GetValue())
+ : vsync_mode_combobox_enum_map[current_index];
int index{};
const int device{vulkan_device_combobox->currentIndex()}; //< current selected Vulkan device
@@ -214,6 +210,23 @@ void ConfigureGraphics::PopulateVSyncModeSelection() {
}
index++;
}
+
+ if (!Settings::IsConfiguringGlobal()) {
+ vsync_restore_global_button->setVisible(!Settings::values.vsync_mode.UsingGlobal());
+
+ const Settings::VSyncMode global_vsync_mode = Settings::values.vsync_mode.GetValue(true);
+ vsync_restore_global_button->setEnabled(
+ (backend == Settings::RendererBackend::OpenGL &&
+ (global_vsync_mode == Settings::VSyncMode::Immediate ||
+ global_vsync_mode == Settings::VSyncMode::Fifo)) ||
+ backend == Settings::RendererBackend::Vulkan);
+ }
+}
+
+void ConfigureGraphics::UpdateVsyncSetting() const {
+ const auto mode = vsync_mode_combobox_enum_map[vsync_mode_combobox->currentIndex()];
+ const auto vsync_mode = PresentModeToSetting(mode);
+ Settings::values.vsync_mode.SetValue(vsync_mode);
}
void ConfigureGraphics::UpdateDeviceSelection(int device) {
@@ -299,6 +312,33 @@ void ConfigureGraphics::Setup(const ConfigurationShared::Builder& builder) {
} else if (setting->Id() == Settings::values.vsync_mode.Id()) {
// Keep track of vsync_mode's combobox so we can populate it
vsync_mode_combobox = widget->combobox;
+
+ // Since vsync is populated at runtime, we have to manually set up the button for
+ // restoring the global setting.
+ if (!Settings::IsConfiguringGlobal()) {
+ QPushButton* restore_button =
+ ConfigurationShared::Widget::CreateRestoreGlobalButton(
+ Settings::values.vsync_mode.UsingGlobal(), widget);
+ restore_button->setEnabled(true);
+ widget->layout()->addWidget(restore_button);
+
+ QObject::connect(restore_button, &QAbstractButton::clicked,
+ [restore_button, this](bool) {
+ Settings::values.vsync_mode.SetGlobal(true);
+ PopulateVSyncModeSelection(true);
+
+ restore_button->setVisible(false);
+ });
+
+ std::function<void()> set_non_global = [restore_button, this]() {
+ Settings::values.vsync_mode.SetGlobal(false);
+ UpdateVsyncSetting();
+ restore_button->setVisible(true);
+ };
+ QObject::connect(widget->combobox, QOverload<int>::of(&QComboBox::activated),
+ [set_non_global]() { set_non_global(); });
+ vsync_restore_global_button = restore_button;
+ }
hold_graphics.emplace(setting->Id(), widget);
} else if (setting->Id() == Settings::values.aspect_ratio.Id()) {
// Keep track of the aspect ratio combobox to update other UI tabs that need it
@@ -400,11 +440,7 @@ void ConfigureGraphics::ApplyConfiguration() {
func(powered_on);
}
- if (Settings::IsConfiguringGlobal()) {
- const auto mode = vsync_mode_combobox_enum_map[vsync_mode_combobox->currentIndex()];
- const auto vsync_mode = PresentModeToSetting(mode);
- Settings::values.vsync_mode.SetValue(vsync_mode);
- }
+ UpdateVsyncSetting();
Settings::values.vulkan_device.SetGlobal(true);
Settings::values.shader_backend.SetGlobal(true);
diff --git a/src/yuzu/configuration/configure_graphics.h b/src/yuzu/configuration/configure_graphics.h
index 9c24a56db..5c8286836 100644
--- a/src/yuzu/configuration/configure_graphics.h
+++ b/src/yuzu/configuration/configure_graphics.h
@@ -62,7 +62,8 @@ private:
void Setup(const ConfigurationShared::Builder& builder);
- void PopulateVSyncModeSelection();
+ void PopulateVSyncModeSelection(bool use_setting);
+ void UpdateVsyncSetting() const;
void UpdateBackgroundColorButton(QColor color);
void UpdateAPILayout();
void UpdateDeviceSelection(int device);
@@ -104,6 +105,7 @@ private:
QComboBox* api_combobox;
QComboBox* shader_backend_combobox;
QComboBox* vsync_mode_combobox;
+ QPushButton* vsync_restore_global_button;
QWidget* vulkan_device_widget;
QWidget* api_widget;
QWidget* shader_backend_widget;