summaryrefslogtreecommitdiff
path: root/Source/Core/DolphinQt/Config/Graphics/EnhancementsWidget.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Core/DolphinQt/Config/Graphics/EnhancementsWidget.cpp')
-rw-r--r--Source/Core/DolphinQt/Config/Graphics/EnhancementsWidget.cpp195
1 files changed, 157 insertions, 38 deletions
diff --git a/Source/Core/DolphinQt/Config/Graphics/EnhancementsWidget.cpp b/Source/Core/DolphinQt/Config/Graphics/EnhancementsWidget.cpp
index db5655cb77..dd1d67b04b 100644
--- a/Source/Core/DolphinQt/Config/Graphics/EnhancementsWidget.cpp
+++ b/Source/Core/DolphinQt/Config/Graphics/EnhancementsWidget.cpp
@@ -16,6 +16,7 @@
#include "DolphinQt/Config/Graphics/GraphicsBool.h"
#include "DolphinQt/Config/Graphics/GraphicsChoice.h"
+#include "DolphinQt/Config/Graphics/GraphicsRadio.h"
#include "DolphinQt/Config/Graphics/GraphicsSlider.h"
#include "DolphinQt/Config/Graphics/GraphicsWindow.h"
#include "DolphinQt/Config/Graphics/PostProcessingConfigWindow.h"
@@ -39,6 +40,18 @@ EnhancementsWidget::EnhancementsWidget(GraphicsWindow* parent) : m_block_save(fa
[this](const QString& backend) { LoadSettings(); });
}
+constexpr int TEXTURE_FILTERING_DEFAULT = 0;
+constexpr int TEXTURE_FILTERING_ANISO_2X = 1;
+constexpr int TEXTURE_FILTERING_ANISO_4X = 2;
+constexpr int TEXTURE_FILTERING_ANISO_8X = 3;
+constexpr int TEXTURE_FILTERING_ANISO_16X = 4;
+constexpr int TEXTURE_FILTERING_FORCE_NEAREST = 5;
+constexpr int TEXTURE_FILTERING_FORCE_LINEAR = 6;
+constexpr int TEXTURE_FILTERING_FORCE_LINEAR_ANISO_2X = 7;
+constexpr int TEXTURE_FILTERING_FORCE_LINEAR_ANISO_4X = 8;
+constexpr int TEXTURE_FILTERING_FORCE_LINEAR_ANISO_8X = 9;
+constexpr int TEXTURE_FILTERING_FORCE_LINEAR_ANISO_16X = 10;
+
void EnhancementsWidget::CreateWidgets()
{
auto* main_layout = new QVBoxLayout;
@@ -73,16 +86,30 @@ void EnhancementsWidget::CreateWidgets()
m_ir_combo->setMaxVisibleItems(visible_resolution_option_count);
m_aa_combo = new ToolTipComboBox();
- m_af_combo = new GraphicsChoice({tr("1x"), tr("2x"), tr("4x"), tr("8x"), tr("16x")},
- Config::GFX_ENHANCE_MAX_ANISOTROPY);
+
+ m_texture_filtering_combo = new ToolTipComboBox();
+ m_texture_filtering_combo->addItem(tr("Default"), TEXTURE_FILTERING_DEFAULT);
+ m_texture_filtering_combo->addItem(tr("2x Anisotropic"), TEXTURE_FILTERING_ANISO_2X);
+ m_texture_filtering_combo->addItem(tr("4x Anisotropic"), TEXTURE_FILTERING_ANISO_4X);
+ m_texture_filtering_combo->addItem(tr("8x Anisotropic"), TEXTURE_FILTERING_ANISO_8X);
+ m_texture_filtering_combo->addItem(tr("16x Anisotropic"), TEXTURE_FILTERING_ANISO_16X);
+ m_texture_filtering_combo->addItem(tr("Force Nearest"), TEXTURE_FILTERING_FORCE_NEAREST);
+ m_texture_filtering_combo->addItem(tr("Force Linear"), TEXTURE_FILTERING_FORCE_LINEAR);
+ m_texture_filtering_combo->addItem(tr("Force Linear and 2x Anisotropic"),
+ TEXTURE_FILTERING_FORCE_LINEAR_ANISO_2X);
+ m_texture_filtering_combo->addItem(tr("Force Linear and 4x Anisotropic"),
+ TEXTURE_FILTERING_FORCE_LINEAR_ANISO_4X);
+ m_texture_filtering_combo->addItem(tr("Force Linear and 8x Anisotropic"),
+ TEXTURE_FILTERING_FORCE_LINEAR_ANISO_8X);
+ m_texture_filtering_combo->addItem(tr("Force Linear and 16x Anisotropic"),
+ TEXTURE_FILTERING_FORCE_LINEAR_ANISO_16X);
m_pp_effect = new ToolTipComboBox();
m_configure_pp_effect = new NonDefaultQPushButton(tr("Configure"));
m_scaled_efb_copy = new GraphicsBool(tr("Scaled EFB Copy"), Config::GFX_HACK_COPY_EFB_SCALED);
m_per_pixel_lighting =
new GraphicsBool(tr("Per-Pixel Lighting"), Config::GFX_ENABLE_PIXEL_LIGHTING);
- m_force_texture_filtering =
- new GraphicsBool(tr("Force Texture Filtering"), Config::GFX_ENHANCE_FORCE_FILTERING);
+
m_widescreen_hack = new GraphicsBool(tr("Widescreen Hack"), Config::GFX_WIDESCREEN_HACK);
m_disable_fog = new GraphicsBool(tr("Disable Fog"), Config::GFX_DISABLE_FOG);
m_force_24bit_color =
@@ -92,25 +119,38 @@ void EnhancementsWidget::CreateWidgets()
m_arbitrary_mipmap_detection = new GraphicsBool(tr("Arbitrary Mipmap Detection"),
Config::GFX_ENHANCE_ARBITRARY_MIPMAP_DETECTION);
- enhancements_layout->addWidget(new QLabel(tr("Internal Resolution:")), 0, 0);
- enhancements_layout->addWidget(m_ir_combo, 0, 1, 1, -1);
- enhancements_layout->addWidget(new QLabel(tr("Anti-Aliasing:")), 1, 0);
- enhancements_layout->addWidget(m_aa_combo, 1, 1, 1, -1);
- enhancements_layout->addWidget(new QLabel(tr("Anisotropic Filtering:")), 2, 0);
- enhancements_layout->addWidget(m_af_combo, 2, 1, 1, -1);
-
- enhancements_layout->addWidget(new QLabel(tr("Post-Processing Effect:")), 4, 0);
- enhancements_layout->addWidget(m_pp_effect, 4, 1);
- enhancements_layout->addWidget(m_configure_pp_effect, 4, 2);
-
- enhancements_layout->addWidget(m_scaled_efb_copy, 5, 0);
- enhancements_layout->addWidget(m_per_pixel_lighting, 5, 1);
- enhancements_layout->addWidget(m_force_texture_filtering, 6, 0);
- enhancements_layout->addWidget(m_widescreen_hack, 6, 1);
- enhancements_layout->addWidget(m_disable_fog, 7, 0);
- enhancements_layout->addWidget(m_force_24bit_color, 7, 1);
- enhancements_layout->addWidget(m_disable_copy_filter, 8, 0);
- enhancements_layout->addWidget(m_arbitrary_mipmap_detection, 8, 1);
+ int row = 0;
+ enhancements_layout->addWidget(new QLabel(tr("Internal Resolution:")), row, 0);
+ enhancements_layout->addWidget(m_ir_combo, row, 1, 1, -1);
+ ++row;
+
+ enhancements_layout->addWidget(new QLabel(tr("Anti-Aliasing:")), row, 0);
+ enhancements_layout->addWidget(m_aa_combo, row, 1, 1, -1);
+ ++row;
+
+ enhancements_layout->addWidget(new QLabel(tr("Texture Filtering:")), row, 0);
+ enhancements_layout->addWidget(m_texture_filtering_combo, row, 1, 1, -1);
+ ++row;
+
+ enhancements_layout->addWidget(new QLabel(tr("Post-Processing Effect:")), row, 0);
+ enhancements_layout->addWidget(m_pp_effect, row, 1);
+ enhancements_layout->addWidget(m_configure_pp_effect, row, 2);
+ ++row;
+
+ enhancements_layout->addWidget(m_scaled_efb_copy, row, 0);
+ enhancements_layout->addWidget(m_per_pixel_lighting, row, 1, 1, -1);
+ ++row;
+
+ enhancements_layout->addWidget(m_widescreen_hack, row, 0);
+ enhancements_layout->addWidget(m_force_24bit_color, row, 1, 1, -1);
+ ++row;
+
+ enhancements_layout->addWidget(m_disable_fog, row, 0);
+ enhancements_layout->addWidget(m_arbitrary_mipmap_detection, row, 1, 1, -1);
+ ++row;
+
+ enhancements_layout->addWidget(m_disable_copy_filter, row, 0);
+ ++row;
// Stereoscopy
auto* stereoscopy_box = new QGroupBox(tr("Stereoscopy"));
@@ -144,6 +184,8 @@ void EnhancementsWidget::ConnectWidgets()
{
connect(m_aa_combo, qOverload<int>(&QComboBox::currentIndexChanged),
[this](int) { SaveSettings(); });
+ connect(m_texture_filtering_combo, qOverload<int>(&QComboBox::currentIndexChanged),
+ [this](int) { SaveSettings(); });
connect(m_pp_effect, qOverload<int>(&QComboBox::currentIndexChanged),
[this](int) { SaveSettings(); });
connect(m_3d_mode, qOverload<int>(&QComboBox::currentIndexChanged), [this] {
@@ -218,8 +260,11 @@ void EnhancementsWidget::LoadSettings()
m_block_save = true;
// Anti-Aliasing
- int aa_selection = Config::Get(Config::GFX_MSAA);
- bool ssaa = Config::Get(Config::GFX_SSAA);
+ const int aa_selection = Config::Get(Config::GFX_MSAA);
+ const bool ssaa = Config::Get(Config::GFX_SSAA);
+ const int aniso = Config::Get(Config::GFX_ENHANCE_MAX_ANISOTROPY);
+ const TextureFilteringMode tex_filter_mode =
+ Config::Get(Config::GFX_ENHANCE_FORCE_TEXTURE_FILTERING);
m_aa_combo->clear();
for (const auto& option : VideoUtils::GetAvailableAntialiasingModes(m_msaa_modes))
@@ -229,6 +274,25 @@ void EnhancementsWidget::LoadSettings()
QString::fromStdString(std::to_string(aa_selection) + "x " + (ssaa ? "SSAA" : "MSAA")));
m_aa_combo->setEnabled(m_aa_combo->count() > 1);
+ switch (tex_filter_mode)
+ {
+ case TextureFilteringMode::Default:
+ if (aniso >= 0 && aniso <= 4)
+ m_texture_filtering_combo->setCurrentIndex(aniso);
+ else
+ m_texture_filtering_combo->setCurrentIndex(TEXTURE_FILTERING_DEFAULT);
+ break;
+ case TextureFilteringMode::Nearest:
+ m_texture_filtering_combo->setCurrentIndex(TEXTURE_FILTERING_FORCE_NEAREST);
+ break;
+ case TextureFilteringMode::Linear:
+ if (aniso >= 0 && aniso <= 4)
+ m_texture_filtering_combo->setCurrentIndex(TEXTURE_FILTERING_FORCE_LINEAR + aniso);
+ else
+ m_texture_filtering_combo->setCurrentIndex(TEXTURE_FILTERING_FORCE_LINEAR);
+ break;
+ }
+
// Post Processing Shader
LoadPPShaders();
@@ -264,6 +328,66 @@ void EnhancementsWidget::SaveSettings()
Config::SetBaseOrCurrent(Config::GFX_SSAA, is_ssaa);
+ const int texture_filtering_selection = m_texture_filtering_combo->currentData().toInt();
+ switch (texture_filtering_selection)
+ {
+ case TEXTURE_FILTERING_DEFAULT:
+ Config::SetBaseOrCurrent(Config::GFX_ENHANCE_MAX_ANISOTROPY, 0);
+ Config::SetBaseOrCurrent(Config::GFX_ENHANCE_FORCE_TEXTURE_FILTERING,
+ TextureFilteringMode::Default);
+ break;
+ case TEXTURE_FILTERING_ANISO_2X:
+ Config::SetBaseOrCurrent(Config::GFX_ENHANCE_MAX_ANISOTROPY, 1);
+ Config::SetBaseOrCurrent(Config::GFX_ENHANCE_FORCE_TEXTURE_FILTERING,
+ TextureFilteringMode::Default);
+ break;
+ case TEXTURE_FILTERING_ANISO_4X:
+ Config::SetBaseOrCurrent(Config::GFX_ENHANCE_MAX_ANISOTROPY, 2);
+ Config::SetBaseOrCurrent(Config::GFX_ENHANCE_FORCE_TEXTURE_FILTERING,
+ TextureFilteringMode::Default);
+ break;
+ case TEXTURE_FILTERING_ANISO_8X:
+ Config::SetBaseOrCurrent(Config::GFX_ENHANCE_MAX_ANISOTROPY, 3);
+ Config::SetBaseOrCurrent(Config::GFX_ENHANCE_FORCE_TEXTURE_FILTERING,
+ TextureFilteringMode::Default);
+ break;
+ case TEXTURE_FILTERING_ANISO_16X:
+ Config::SetBaseOrCurrent(Config::GFX_ENHANCE_MAX_ANISOTROPY, 4);
+ Config::SetBaseOrCurrent(Config::GFX_ENHANCE_FORCE_TEXTURE_FILTERING,
+ TextureFilteringMode::Default);
+ break;
+ case TEXTURE_FILTERING_FORCE_NEAREST:
+ Config::SetBaseOrCurrent(Config::GFX_ENHANCE_MAX_ANISOTROPY, 0);
+ Config::SetBaseOrCurrent(Config::GFX_ENHANCE_FORCE_TEXTURE_FILTERING,
+ TextureFilteringMode::Nearest);
+ break;
+ case TEXTURE_FILTERING_FORCE_LINEAR:
+ Config::SetBaseOrCurrent(Config::GFX_ENHANCE_MAX_ANISOTROPY, 0);
+ Config::SetBaseOrCurrent(Config::GFX_ENHANCE_FORCE_TEXTURE_FILTERING,
+ TextureFilteringMode::Linear);
+ break;
+ case TEXTURE_FILTERING_FORCE_LINEAR_ANISO_2X:
+ Config::SetBaseOrCurrent(Config::GFX_ENHANCE_MAX_ANISOTROPY, 1);
+ Config::SetBaseOrCurrent(Config::GFX_ENHANCE_FORCE_TEXTURE_FILTERING,
+ TextureFilteringMode::Linear);
+ break;
+ case TEXTURE_FILTERING_FORCE_LINEAR_ANISO_4X:
+ Config::SetBaseOrCurrent(Config::GFX_ENHANCE_MAX_ANISOTROPY, 2);
+ Config::SetBaseOrCurrent(Config::GFX_ENHANCE_FORCE_TEXTURE_FILTERING,
+ TextureFilteringMode::Linear);
+ break;
+ case TEXTURE_FILTERING_FORCE_LINEAR_ANISO_8X:
+ Config::SetBaseOrCurrent(Config::GFX_ENHANCE_MAX_ANISOTROPY, 3);
+ Config::SetBaseOrCurrent(Config::GFX_ENHANCE_FORCE_TEXTURE_FILTERING,
+ TextureFilteringMode::Linear);
+ break;
+ case TEXTURE_FILTERING_FORCE_LINEAR_ANISO_16X:
+ Config::SetBaseOrCurrent(Config::GFX_ENHANCE_MAX_ANISOTROPY, 4);
+ Config::SetBaseOrCurrent(Config::GFX_ENHANCE_FORCE_TEXTURE_FILTERING,
+ TextureFilteringMode::Linear);
+ break;
+ }
+
const bool anaglyph = g_Config.stereo_mode == StereoMode::Anaglyph;
const bool passive = g_Config.stereo_mode == StereoMode::Passive;
Config::SetBaseOrCurrent(Config::GFX_ENHANCE_POST_SHADER,
@@ -300,10 +424,12 @@ void EnhancementsWidget::AddDescriptions()
"geometry anti-aliasing and also applies anti-aliasing to lighting, shader "
"effects, and textures.<br><br><dolphin_emphasis>If unsure, select "
"None.</dolphin_emphasis>");
- static const char TR_ANISOTROPIC_FILTERING_DESCRIPTION[] = QT_TR_NOOP(
- "Enables anisotropic filtering, which enhances the visual quality of textures that "
- "are at oblique viewing angles.<br><br>Might cause issues in a small "
- "number of games.<br><br><dolphin_emphasis>If unsure, select 1x.</dolphin_emphasis>");
+ static const char TR_FORCE_TEXTURE_FILTERING_DESCRIPTION[] = QT_TR_NOOP(
+ "Adjust the texture filtering. Anisotropic filtering enhances the visual quality of textures "
+ "that are at oblique viewing angles. Force Nearest and Force Linear override the texture "
+ "scaling filter selected by the game.<br><br>Any option except 'Default' will alter the look "
+ "of the game's textures and might cause issues in a small number of "
+ "games.<br><br><dolphin_emphasis>If unsure, select 'Default'.</dolphin_emphasis>");
static const char TR_POSTPROCESSING_DESCRIPTION[] =
QT_TR_NOOP("Applies a post-processing effect after rendering a frame.<br><br "
"/><dolphin_emphasis>If unsure, select (off).</dolphin_emphasis>");
@@ -352,11 +478,6 @@ void EnhancementsWidget::AddDescriptions()
"quality by reducing color banding.<br><br>Has no impact on performance and causes "
"few graphical issues.<br><br><dolphin_emphasis>If unsure, leave this "
"checked.</dolphin_emphasis>");
- static const char TR_FORCE_TEXTURE_FILTERING_DESCRIPTION[] =
- QT_TR_NOOP("Filters all textures, including any that the game explicitly set as "
- "unfiltered.<br><br>May improve quality of certain textures in some games, but "
- "will cause issues in others.<br><br><dolphin_emphasis>If unsure, leave this "
- "unchecked.</dolphin_emphasis>");
static const char TR_DISABLE_COPY_FILTER_DESCRIPTION[] = QT_TR_NOOP(
"Disables the blending of adjacent rows when copying the EFB. This is known in "
"some games as \"deflickering\" or \"smoothing\".<br><br>Disabling the filter has no "
@@ -378,8 +499,8 @@ void EnhancementsWidget::AddDescriptions()
m_aa_combo->SetTitle(tr("Anti-Aliasing"));
m_aa_combo->SetDescription(tr(TR_ANTIALIAS_DESCRIPTION));
- m_af_combo->SetTitle(tr("Anisotropic Filtering"));
- m_af_combo->SetDescription(tr(TR_ANISOTROPIC_FILTERING_DESCRIPTION));
+ m_texture_filtering_combo->SetTitle(tr("Texture Filtering"));
+ m_texture_filtering_combo->SetDescription(tr(TR_FORCE_TEXTURE_FILTERING_DESCRIPTION));
m_pp_effect->SetTitle(tr("Post-Processing Effect"));
m_pp_effect->SetDescription(tr(TR_POSTPROCESSING_DESCRIPTION));
@@ -394,8 +515,6 @@ void EnhancementsWidget::AddDescriptions()
m_force_24bit_color->SetDescription(tr(TR_FORCE_24BIT_DESCRIPTION));
- m_force_texture_filtering->SetDescription(tr(TR_FORCE_TEXTURE_FILTERING_DESCRIPTION));
-
m_disable_copy_filter->SetDescription(tr(TR_DISABLE_COPY_FILTER_DESCRIPTION));
m_arbitrary_mipmap_detection->SetDescription(tr(TR_ARBITRARY_MIPMAP_DETECTION_DESCRIPTION));