summaryrefslogtreecommitdiff
path: root/Source/Core/DolphinQt/Config/Graphics/SoftwareRendererWidget.cpp
diff options
context:
space:
mode:
authorspycrab <spycrab@users.noreply.github.com>2018-07-07 00:58:37 +0200
committerGitHub <noreply@github.com>2018-07-07 00:58:37 +0200
commit3d1a7737d86f4ecdf0131f5b84198f288800da3b (patch)
tree747e394036c189c46add1b3e1451e50f48230e11 /Source/Core/DolphinQt/Config/Graphics/SoftwareRendererWidget.cpp
parent059880bb1640d5a3b0e1fbbf66e1a356df4b9f41 (diff)
parent13ba24c5a6795532c8893eccf2a21ae95682e1b7 (diff)
Merge pull request #7205 from spycrab/qt_rename
Move DolphinQt2 to DolphinQt
Diffstat (limited to 'Source/Core/DolphinQt/Config/Graphics/SoftwareRendererWidget.cpp')
-rw-r--r--Source/Core/DolphinQt/Config/Graphics/SoftwareRendererWidget.cpp182
1 files changed, 182 insertions, 0 deletions
diff --git a/Source/Core/DolphinQt/Config/Graphics/SoftwareRendererWidget.cpp b/Source/Core/DolphinQt/Config/Graphics/SoftwareRendererWidget.cpp
new file mode 100644
index 0000000000..4941d1b556
--- /dev/null
+++ b/Source/Core/DolphinQt/Config/Graphics/SoftwareRendererWidget.cpp
@@ -0,0 +1,182 @@
+// Copyright 2017 Dolphin Emulator Project
+// Licensed under GPLv2+
+// Refer to the license.txt file included.
+
+#include "DolphinQt/Config/Graphics/SoftwareRendererWidget.h"
+
+#include <QComboBox>
+#include <QGridLayout>
+#include <QGroupBox>
+#include <QLabel>
+#include <QSpinBox>
+#include <QVBoxLayout>
+
+#include "Core/Config/GraphicsSettings.h"
+#include "Core/ConfigManager.h"
+
+#include "DolphinQt/Config/Graphics/GraphicsBool.h"
+#include "DolphinQt/Config/Graphics/GraphicsWindow.h"
+#include "DolphinQt/Settings.h"
+
+#include "UICommon/VideoUtils.h"
+
+#include "VideoCommon/VideoBackendBase.h"
+#include "VideoCommon/VideoConfig.h"
+
+SoftwareRendererWidget::SoftwareRendererWidget(GraphicsWindow* parent) : GraphicsWidget(parent)
+{
+ CreateWidgets();
+
+ connect(parent, &GraphicsWindow::BackendChanged, [this] { LoadSettings(); });
+
+ LoadSettings();
+ ConnectWidgets();
+ AddDescriptions();
+}
+
+void SoftwareRendererWidget::CreateWidgets()
+{
+ auto* main_layout = new QVBoxLayout;
+
+ auto* rendering_box = new QGroupBox(tr("Rendering"));
+ auto* rendering_layout = new QGridLayout();
+ m_backend_combo = new QComboBox();
+
+ rendering_box->setLayout(rendering_layout);
+ rendering_layout->addWidget(new QLabel(tr("Backend:")), 1, 1);
+ rendering_layout->addWidget(m_backend_combo, 1, 2);
+
+ for (const auto& backend : g_available_video_backends)
+ m_backend_combo->addItem(tr(backend->GetDisplayName().c_str()));
+
+ auto* overlay_box = new QGroupBox(tr("Overlay Information"));
+ auto* overlay_layout = new QGridLayout();
+ overlay_box->setLayout(overlay_layout);
+ m_show_statistics = new GraphicsBool(tr("Show Statistics"), Config::GFX_OVERLAY_STATS);
+
+ overlay_layout->addWidget(m_show_statistics);
+
+ auto* utility_box = new QGroupBox(tr("Utility"));
+ auto* utility_layout = new QGridLayout();
+ m_dump_textures = new GraphicsBool(tr("Dump Textures"), Config::GFX_DUMP_TEXTURES);
+ m_dump_objects = new GraphicsBool(tr("Dump Objects"), Config::GFX_SW_DUMP_OBJECTS);
+ utility_box->setLayout(utility_layout);
+
+ utility_layout->addWidget(m_dump_textures, 1, 1);
+ utility_layout->addWidget(m_dump_objects, 1, 2);
+
+ auto* debug_box = new QGroupBox(tr("Debug Only"));
+ auto* debug_layout = new QGridLayout();
+ m_dump_tev_stages = new GraphicsBool(tr("Dump TEV Stages"), Config::GFX_SW_DUMP_TEV_STAGES);
+ m_dump_tev_fetches =
+ new GraphicsBool(tr("Dump Texture Fetches"), Config::GFX_SW_DUMP_TEV_TEX_FETCHES);
+
+ debug_layout->addWidget(m_dump_tev_stages, 1, 1);
+ debug_layout->addWidget(m_dump_tev_fetches, 1, 2);
+
+ debug_box->setLayout(debug_layout);
+
+#ifdef _DEBUG
+ utility_layout->addWidget(debug_box, 2, 1, 1, 2);
+#endif
+
+ auto* object_range_box = new QGroupBox(tr("Drawn Object Range"));
+ auto* object_range_layout = new QGridLayout();
+ m_object_range_min = new QSpinBox();
+ m_object_range_max = new QSpinBox();
+
+ for (auto* spin : {m_object_range_min, m_object_range_max})
+ {
+ spin->setMinimum(0);
+ spin->setMaximum(100000);
+ }
+
+ object_range_box->setLayout(object_range_layout);
+
+ object_range_layout->addWidget(m_object_range_min, 1, 1);
+ object_range_layout->addWidget(m_object_range_max, 1, 2);
+
+ main_layout->addWidget(rendering_box);
+ main_layout->addWidget(overlay_box);
+ main_layout->addWidget(utility_box);
+ main_layout->addWidget(object_range_box);
+ main_layout->addStretch();
+
+ setLayout(main_layout);
+}
+
+void SoftwareRendererWidget::ConnectWidgets()
+{
+ connect(m_backend_combo, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
+ [this](int) { SaveSettings(); });
+ connect(m_object_range_min, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),
+ [this](int) { SaveSettings(); });
+ connect(m_object_range_max, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),
+ [this](int) { SaveSettings(); });
+}
+
+void SoftwareRendererWidget::LoadSettings()
+{
+ for (const auto& backend : g_available_video_backends)
+ {
+ if (backend->GetName() == SConfig::GetInstance().m_strVideoBackend)
+ m_backend_combo->setCurrentIndex(
+ m_backend_combo->findText(tr(backend->GetDisplayName().c_str())));
+ }
+
+ m_object_range_min->setValue(Config::Get(Config::GFX_SW_DRAW_START));
+ m_object_range_max->setValue(Config::Get(Config::GFX_SW_DRAW_END));
+}
+
+void SoftwareRendererWidget::SaveSettings()
+{
+ for (const auto& backend : g_available_video_backends)
+ {
+ if (tr(backend->GetDisplayName().c_str()) == m_backend_combo->currentText())
+ {
+ const auto backend_name = backend->GetName();
+ if (backend_name != SConfig::GetInstance().m_strVideoBackend)
+ emit BackendChanged(QString::fromStdString(backend_name));
+ break;
+ }
+ }
+
+ Config::SetBaseOrCurrent(Config::GFX_SW_DRAW_START, m_object_range_min->value());
+ Config::SetBaseOrCurrent(Config::GFX_SW_DRAW_END, m_object_range_max->value());
+}
+
+void SoftwareRendererWidget::AddDescriptions()
+{
+ static const char TR_BACKEND_DESCRIPTION[] =
+ QT_TR_NOOP("Selects what graphics API to use internally.\nThe software renderer is extremely "
+ "slow and only useful for debugging, so you'll want to use either Direct3D or "
+ "OpenGL. Different games and different GPUs will behave differently on each "
+ "backend, so for the best emulation experience it's recommended to try both and "
+ "choose the one that's less problematic.\n\nIf unsure, select OpenGL.");
+
+ static const char TR_SHOW_STATISTICS_DESCRIPTION[] =
+ QT_TR_NOOP("Show various rendering statistics.\n\nIf unsure, leave this unchecked.");
+
+ static const char TR_DUMP_TEXTURES_DESCRIPTION[] =
+ QT_TR_NOOP("Dump decoded game textures to User/Dump/Textures/<game_id>/.\n\nIf unsure, leave "
+ "this unchecked.");
+
+ static const char TR_DUMP_OBJECTS_DESCRIPTION[] =
+ QT_TR_NOOP("Dump objects to User/Dump/Objects/.\n\nIf unsure, leave "
+ "this unchecked.");
+
+ static const char TR_DUMP_TEV_STAGES_DESCRIPTION[] =
+ QT_TR_NOOP("Dump TEV Stages to User/Dump/Objects/.\n\nIf unsure, leave "
+ "this unchecked.");
+
+ static const char TR_DUMP_TEV_FETCHES_DESCRIPTION[] =
+ QT_TR_NOOP("Dump Texture Fetches to User/Dump/Objects/.\n\nIf unsure, leave "
+ "this unchecked.");
+
+ AddDescription(m_backend_combo, TR_BACKEND_DESCRIPTION);
+ AddDescription(m_show_statistics, TR_SHOW_STATISTICS_DESCRIPTION);
+ AddDescription(m_dump_textures, TR_DUMP_TEXTURES_DESCRIPTION);
+ AddDescription(m_dump_objects, TR_DUMP_OBJECTS_DESCRIPTION);
+ AddDescription(m_dump_tev_stages, TR_DUMP_TEV_STAGES_DESCRIPTION);
+ AddDescription(m_dump_tev_fetches, TR_DUMP_TEV_FETCHES_DESCRIPTION);
+}