Qt: Populate graphics adapters asynchronously
Some checks are pending
Automated Builds / 💻 Windows (push) Waiting to run
Automated Builds / 🐧 Linux AppImage (push) Waiting to run
Automated Builds / 🐧 Linux Cross-Compiled AppImage (push) Waiting to run
Automated Builds / 🍎 MacOS (push) Waiting to run
Automated Builds / 📤 Create Release (push) Blocked by required conditions

More time saved when opening the settings window.
This commit is contained in:
Stenzek 2025-12-23 01:46:22 +10:00
parent fbdd2689b1
commit 5a7acfe730
No known key found for this signature in database
3 changed files with 36 additions and 11 deletions

View File

@ -2,6 +2,7 @@
// SPDX-License-Identifier: CC-BY-NC-ND-4.0
#include "graphicssettingswidget.h"
#include "qthost.h"
#include "qtutils.h"
#include "settingswindow.h"
#include "settingwidgetbinder.h"
@ -62,6 +63,8 @@ GraphicsSettingsWidget::GraphicsSettingsWidget(SettingsWindow* dialog, QWidget*
SettingWidgetBinder::BindWidgetToEnumSetting(sif, m_ui.renderer, "GPU", "Renderer", &Settings::ParseRendererName,
&Settings::GetRendererName, &Settings::GetRendererDisplayName,
Settings::DEFAULT_GPU_RENDERER, GPURenderer::Count);
if (!m_dialog->hasGameTrait(GameDatabase::Trait::DisableUpscaling))
populateAndConnectUpscalingModes();
SettingWidgetBinder::BindWidgetToEnumSetting(sif, m_ui.textureFiltering, "GPU", "TextureFilter",
&Settings::ParseTextureFilterName, &Settings::GetTextureFilterName,
&Settings::GetTextureFilterDisplayName,
@ -831,7 +834,19 @@ void GraphicsSettingsWidget::populateGPUAdaptersAndResolutions(RenderAPI render_
if (m_adapters_render_api != render_api)
{
m_adapters_render_api = render_api;
m_adapters = GPUDevice::GetAdapterListForAPI(render_api);
QtAsyncTask::create(this, [this, render_api]() {
GPUDevice::AdapterInfoList adapters = GPUDevice::GetAdapterListForAPI(render_api);
return [this, adapters = std::move(adapters), render_api]() mutable {
if (m_adapters_render_api != render_api)
return;
m_adapters = std::move(adapters);
populateGPUAdaptersAndResolutions(render_api);
};
});
return;
}
const GPUDevice::AdapterInfo* current_adapter = nullptr;
@ -913,16 +928,9 @@ void GraphicsSettingsWidget::populateGPUAdaptersAndResolutions(RenderAPI render_
if (!m_dialog->hasGameTrait(GameDatabase::Trait::DisableUpscaling))
{
SettingWidgetBinder::DisconnectWidget(m_ui.resolutionScale);
m_ui.resolutionScale->clear();
const int max_scale =
static_cast<int>(current_adapter ? std::clamp<u32>(current_adapter->max_texture_size / 1024u, 1u, 32u) : 16);
populateUpscalingModes(m_ui.resolutionScale, max_scale);
SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.resolutionScale, "GPU", "ResolutionScale", 1);
connect(m_ui.resolutionScale, QOverload<int>::of(&QComboBox::currentIndexChanged), this,
&GraphicsSettingsWidget::updateResolutionDependentOptions);
populateAndConnectUpscalingModes(max_scale);
}
{
@ -972,6 +980,19 @@ void GraphicsSettingsWidget::populateGPUAdaptersAndResolutions(RenderAPI render_
}
}
void GraphicsSettingsWidget::populateAndConnectUpscalingModes(int max_scale)
{
SettingWidgetBinder::DisconnectWidget(m_ui.resolutionScale);
m_ui.resolutionScale->clear();
populateUpscalingModes(m_ui.resolutionScale, max_scale);
SettingWidgetBinder::BindWidgetToIntSetting(m_dialog->getSettingsInterface(), m_ui.resolutionScale, "GPU",
"ResolutionScale", 1);
connect(m_ui.resolutionScale, QOverload<int>::of(&QComboBox::currentIndexChanged), this,
&GraphicsSettingsWidget::updateResolutionDependentOptions);
}
void GraphicsSettingsWidget::populateUpscalingModes(QComboBox* const cb, int max_scale)
{
static constexpr const std::pair<int, const char*> templates[] = {

View File

@ -22,10 +22,12 @@ class GraphicsSettingsWidget : public QWidget
Q_OBJECT
public:
static constexpr int DEFAULT_MAX_RESOLUTION_SCALE = 16;
GraphicsSettingsWidget(SettingsWindow* dialog, QWidget* parent);
~GraphicsSettingsWidget();
static void populateUpscalingModes(QComboBox* const cb, int max_scale);
static void populateUpscalingModes(QComboBox* const cb, int max_scale = DEFAULT_MAX_RESOLUTION_SCALE);
static QVariant packAspectRatio(DisplayAspectRatio ar);
static DisplayAspectRatio unpackAspectRatio(const QVariant& var);
@ -74,6 +76,8 @@ private:
void populateGPUAdaptersAndResolutions(RenderAPI render_api);
void populateAndConnectUpscalingModes(int max_scale = DEFAULT_MAX_RESOLUTION_SCALE);
Ui::GraphicsSettingsWidget m_ui;
SettingsWindow* m_dialog;

View File

@ -502,7 +502,7 @@ void SetupWizardDialog::setupGraphicsPage(bool initial)
{
SettingWidgetBinder::DisconnectWidget(m_ui.resolutionScale);
m_ui.resolutionScale->clear();
GraphicsSettingsWidget::populateUpscalingModes(m_ui.resolutionScale, 16);
GraphicsSettingsWidget::populateUpscalingModes(m_ui.resolutionScale);
SettingWidgetBinder::BindWidgetToIntSetting(nullptr, m_ui.resolutionScale, "GPU", "ResolutionScale", 1);
SettingWidgetBinder::DisconnectWidget(m_ui.textureFiltering);