|
|
@@ -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);
|