Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Qt] graphixes #3441

Merged
merged 2 commits into from Sep 17, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions rpcs3/rpcs3qt/emu_settings.h
Expand Up @@ -19,6 +19,7 @@ struct Render_Creator
bool supportsVulkan = false;
QStringList D3D12Adapters;
QStringList vulkanAdapters;
QString render_Null = QObject::tr("Null");
QString render_Vulkan = QObject::tr("Vulkan");
QString render_D3D12 = QObject::tr("D3D12[DO NOT USE]");
QString render_OpenGL = QObject::tr("OpenGL");
Expand Down
152 changes: 50 additions & 102 deletions rpcs3/rpcs3qt/settings_dialog.cpp
Expand Up @@ -377,139 +377,89 @@ settings_dialog::settings_dialog(std::shared_ptr<gui_settings> xSettings, const
ui->scrictModeRendering->setToolTip(json_gpu_main["scrictModeRendering"].toString());

// Graphics Adapter
QStringList D3D12Adapters = r_Creator.D3D12Adapters;
QStringList vulkanAdapters = r_Creator.vulkanAdapters;
bool supportsD3D12 = r_Creator.supportsD3D12;
bool supportsVulkan = r_Creator.supportsVulkan;
QString r_D3D12 = r_Creator.render_D3D12;
QString r_Vulkan = r_Creator.render_Vulkan;
QString r_OpenGL = r_Creator.render_OpenGL;
QString old_D3D12;
QString old_Vulkan;

if (supportsD3D12)
{
old_D3D12 = qstr(xemu_settings->GetSetting(emu_settings::D3D12Adapter));
}
else
m_D3D12 = Render_Info(r_Creator.render_D3D12, r_Creator.D3D12Adapters, r_Creator.supportsD3D12, emu_settings::D3D12Adapter);
m_Vulkan = Render_Info(r_Creator.render_Vulkan, r_Creator.vulkanAdapters, r_Creator.supportsVulkan, emu_settings::VulkanAdapter);
m_OpenGL = Render_Info(r_Creator.render_OpenGL);
m_NullRender = Render_Info(r_Creator.render_Null);

std::vector<Render_Info*> Render_List = { &m_D3D12, &m_Vulkan, &m_OpenGL, &m_NullRender };

// Remove renderers from the renderer Combobox if not supported
for (auto renderer : Render_List)
{
// Remove D3D12 option from render combobox
for (int i = 0; i < ui->renderBox->count(); i++)
if (renderer->supported)
{
if (ui->renderBox->itemText(i) == r_D3D12)
if (renderer->has_adapters)
{
ui->renderBox->removeItem(i);
break;
renderer->old_adapter = qstr(xemu_settings->GetSetting(renderer->type));
}
continue;
}
}

if (supportsVulkan)
{
old_Vulkan = qstr(xemu_settings->GetSetting(emu_settings::VulkanAdapter));
}
else
{
// Remove Vulkan option from render combobox
for (int i = 0; i < ui->renderBox->count(); i++)
{
if (ui->renderBox->itemText(i) == r_Vulkan)
if (ui->renderBox->itemText(i) == renderer->name)
{
ui->renderBox->removeItem(i);
break;
}
}
}

QString oldRender = ui->renderBox->itemText(ui->renderBox->currentIndex());
m_oldRender = ui->renderBox->currentText();

auto switchGraphicsAdapter = [=](int index)
auto setRenderer = [=](QString text)
{
QString render = ui->renderBox->itemText(index);
m_isD3D12 = render == r_D3D12;
m_isVulkan = render == r_Vulkan;
ui->graphicsAdapterBox->setEnabled(m_isD3D12 || m_isVulkan);
if (text.isEmpty()) return;

// D3D Adapter
if (m_isD3D12)
auto switchTo = [=](Render_Info renderer)
{
// Reset other adapters to old config
if (supportsVulkan)
{
xemu_settings->SetSetting(emu_settings::VulkanAdapter, sstr(old_Vulkan));
}
// Fill combobox
ui->graphicsAdapterBox->clear();
for (const auto& adapter : D3D12Adapters)
for (const auto& render : Render_List)
{
ui->graphicsAdapterBox->addItem(adapter);
}
// Reset Adapter to old config
int idx = ui->graphicsAdapterBox->findText(old_D3D12);
if (idx == -1)
{
idx = 0;
if (old_D3D12.isEmpty())
if (renderer.name != render->name && render->has_adapters && render->supported)
{
LOG_WARNING(RSX, "%s adapter config empty: setting to default!", sstr(r_D3D12));
}
else
{
LOG_WARNING(RSX, "Last used %s adapter not found: setting to default!", sstr(r_D3D12));
xemu_settings->SetSetting(render->type, sstr(render->old_adapter));
}
}
ui->graphicsAdapterBox->setCurrentIndex(idx);
xemu_settings->SetSetting(emu_settings::D3D12Adapter, sstr(ui->graphicsAdapterBox->currentText()));
}

// Vulkan Adapter
else if (m_isVulkan)
{
// Reset other adapters to old config
if (supportsD3D12)
// Fill combobox with placeholder if no adapters needed
if (!renderer.has_adapters)
{
xemu_settings->SetSetting(emu_settings::D3D12Adapter, sstr(old_D3D12));
ui->graphicsAdapterBox->clear();
ui->graphicsAdapterBox->addItem(tr("Not needed for %1 renderer").arg(text));
return;
}
// Fill combobox
ui->graphicsAdapterBox->clear();
for (const auto& adapter : vulkanAdapters)
for (const auto& adapter : renderer.adapters)
{
ui->graphicsAdapterBox->addItem(adapter);
}
// Reset Adapter to old config
int idx = ui->graphicsAdapterBox->findText(old_Vulkan);
int idx = ui->graphicsAdapterBox->findText(renderer.old_adapter);
if (idx == -1)
{
idx = 0;
if (old_Vulkan.isEmpty())
if (renderer.old_adapter.isEmpty())
{
LOG_WARNING(RSX, "%s adapter config empty: setting to default!", sstr(r_Vulkan));
LOG_WARNING(RSX, "%s adapter config empty: setting to default!", sstr(renderer.name));
}
else
{
LOG_WARNING(RSX, "Last used %s adapter not found: setting to default!", sstr(r_Vulkan));
LOG_WARNING(RSX, "Last used %s adapter not found: setting to default!", sstr(renderer.name));
}
}
ui->graphicsAdapterBox->setCurrentIndex(idx);
xemu_settings->SetSetting(emu_settings::VulkanAdapter, sstr(ui->graphicsAdapterBox->currentText()));
}
xemu_settings->SetSetting(renderer.type, sstr(ui->graphicsAdapterBox->currentText()));
};

// Other Adapter
else
for (auto render : Render_List)
{
// Reset Adapters to old config
if (supportsD3D12)
{
xemu_settings->SetSetting(emu_settings::D3D12Adapter, sstr(old_D3D12));
}
if (supportsVulkan)
if (render->name == text)
{
xemu_settings->SetSetting(emu_settings::VulkanAdapter, sstr(old_Vulkan));
switchTo(*render);
ui->graphicsAdapterBox->setEnabled(render->has_adapters);
}

// Fill combobox with placeholder
ui->graphicsAdapterBox->clear();
ui->graphicsAdapterBox->addItem(tr("Not needed for %1 renderer").arg(render));
}
};

Expand All @@ -518,35 +468,33 @@ settings_dialog::settings_dialog(std::shared_ptr<gui_settings> xSettings, const
if (text.isEmpty()) return;

// don't set adapter if signal was created by switching render
QString newRender = ui->renderBox->itemText(ui->renderBox->currentIndex());
if (m_oldRender == newRender)
QString newRender = ui->renderBox->currentText();
if (m_oldRender != newRender)
{
if (m_isD3D12 && D3D12Adapters.contains(text))
{
xemu_settings->SetSetting(emu_settings::D3D12Adapter, sstr(text));
}
else if (m_isVulkan && vulkanAdapters.contains(text))
{
xemu_settings->SetSetting(emu_settings::VulkanAdapter, sstr(text));
}
m_oldRender = newRender;
return;
}
else
for (const auto& render : Render_List)
{
m_oldRender = newRender;
if (render->name == newRender && render->has_adapters && render->adapters.contains(text))
{
xemu_settings->SetSetting(render->type, sstr(text));
break;
}
}
};

// Init
setRenderer(ui->renderBox->currentText());
setAdapter(ui->graphicsAdapterBox->currentText());
switchGraphicsAdapter(ui->renderBox->currentIndex());

// Events
connect(ui->graphicsAdapterBox, &QComboBox::currentTextChanged, setAdapter);
connect(ui->renderBox, static_cast<void (QComboBox::*)(int index)>(&QComboBox::currentIndexChanged), switchGraphicsAdapter);
connect(ui->renderBox, &QComboBox::currentTextChanged, setRenderer);

auto fixGLLegacy = [=](const QString& text)
{
ui->glLegacyBuffers->setEnabled(text == r_OpenGL);
ui->glLegacyBuffers->setEnabled(text == m_OpenGL.name);
};

// Handle connects to disable specific checkboxes that depend on GUI state.
Expand Down
22 changes: 20 additions & 2 deletions rpcs3/rpcs3qt/settings_dialog.h
Expand Up @@ -15,6 +15,21 @@ namespace Ui
class settings_dialog;
}

struct Render_Info
{
QString name;
QString old_adapter;
QStringList adapters;
emu_settings::SettingsType type;
bool supported = true;
bool has_adapters = true;

Render_Info(){};
Render_Info(const QString& name) : name(name), has_adapters(false){};
Render_Info(const QString& name, const QStringList& adapters, bool supported, const emu_settings::SettingsType& type)
: name(name), adapters(adapters), supported(supported), type(type) {};
};

class settings_dialog : public QDialog
{
Q_OBJECT
Expand All @@ -40,8 +55,11 @@ private Q_SLOTS:
QString m_currentConfig;
//gpu tab
QString m_oldRender = "";
bool m_isD3D12 = false;
bool m_isVulkan = false;

Render_Info m_D3D12;
Render_Info m_Vulkan;
Render_Info m_OpenGL;
Render_Info m_NullRender;

int m_tab_Index;
Ui::settings_dialog *ui;
Expand Down