diff --git a/src/android/app/src/main/jni/default_ini.h b/src/android/app/src/main/jni/default_ini.h index 2fcbe9292..875f595a0 100644 --- a/src/android/app/src/main/jni/default_ini.h +++ b/src/android/app/src/main/jni/default_ini.h @@ -168,9 +168,12 @@ factor_3d = # The name of the post processing shader to apply. # Loaded from shaders if render_3d is off or side by side. -# Loaded from shaders/anaglyph if render_3d is anaglyph pp_shader_name = +# The name of the shader to apply when render_3d is anaglyph. +# Loaded from shaders/anaglyph +anaglyph_shader_name = + # Whether to enable linear filtering or not # This is required for some shaders to work correctly # 0: Nearest, 1 (default): Linear diff --git a/src/citra/config.cpp b/src/citra/config.cpp index f8447713a..acf85e4e1 100644 --- a/src/citra/config.cpp +++ b/src/citra/config.cpp @@ -139,15 +139,10 @@ void Config::ReadValues() { sdl2_config->GetInteger("Renderer", "render_3d", 0)); Settings::values.factor_3d = static_cast(sdl2_config->GetInteger("Renderer", "factor_3d", 0)); - std::string default_shader = "none (builtin)"; - if (Settings::values.render_3d.GetValue() == Settings::StereoRenderOption::Anaglyph) - default_shader = "dubois (builtin)"; - else if (Settings::values.render_3d.GetValue() == Settings::StereoRenderOption::Interlaced || - Settings::values.render_3d.GetValue() == - Settings::StereoRenderOption::ReverseInterlaced) - default_shader = "horizontal (builtin)"; Settings::values.pp_shader_name = - sdl2_config->GetString("Renderer", "pp_shader_name", default_shader); + sdl2_config->GetString("Renderer", "pp_shader_name", "none (builtin)"); + Settings::values.anaglyph_shader_name = + sdl2_config->GetString("Renderer", "anaglyph_shader_name", "dubois (builtin)"); Settings::values.filter_mode = sdl2_config->GetBoolean("Renderer", "filter_mode", true); Settings::values.bg_red = static_cast(sdl2_config->GetReal("Renderer", "bg_red", 0.0)); diff --git a/src/citra/default_ini.h b/src/citra/default_ini.h index 19f57afb8..c545aa77d 100644 --- a/src/citra/default_ini.h +++ b/src/citra/default_ini.h @@ -172,9 +172,12 @@ mono_render_option = # The name of the post processing shader to apply. # Loaded from shaders if render_3d is off or side by side. -# Loaded from shaders/anaglyph if render_3d is anaglyph pp_shader_name = +# The name of the shader to apply when render_3d is anaglyph. +# Loaded from shaders/anaglyph +anaglyph_shader_name = + # Whether to enable linear filtering or not # This is required for some shaders to work correctly # 0: Nearest, 1 (default): Linear diff --git a/src/citra_qt/configuration/config.cpp b/src/citra_qt/configuration/config.cpp index 818680f5d..6483a2981 100644 --- a/src/citra_qt/configuration/config.cpp +++ b/src/citra_qt/configuration/config.cpp @@ -149,14 +149,14 @@ void Config::ReadGlobalSetting(Settings::SwitchableSetting& settin const bool use_global = qt_config->value(name + QStringLiteral("/use_global"), true).toBool(); setting.SetGlobal(use_global); if (global || !use_global) { - QVariant value{}; + QVariant default_value{}; if constexpr (std::is_enum_v) { using TypeU = std::underlying_type_t; - value = QVariant::fromValue(static_cast(setting.GetDefault())); - setting.SetValue(static_cast(ReadSetting(name, value).value())); + default_value = QVariant::fromValue(static_cast(setting.GetDefault())); + setting.SetValue(static_cast(ReadSetting(name, default_value).value())); } else { - value = QVariant::fromValue(setting.GetDefault()); - setting.SetValue(ReadSetting(name, value).value()); + default_value = QVariant::fromValue(setting.GetDefault()); + setting.SetValue(ReadSetting(name, default_value).value()); } } } @@ -182,6 +182,15 @@ void Config::WriteBasicSetting(const Settings::Setting& setting) { qt_config->setValue(name, QString::fromStdString(value)); } +// Explicit u16 definition: Qt would store it as QMetaType otherwise, which is not human-readable +template <> +void Config::WriteBasicSetting(const Settings::Setting& setting) { + const QString name = QString::fromStdString(setting.GetLabel()); + const u16& value = setting.GetValue(); + qt_config->setValue(name + QStringLiteral("/default"), value == setting.GetDefault()); + qt_config->setValue(name, static_cast(value)); +} + template void Config::WriteBasicSetting(const Settings::Setting& setting) { const QString name = QString::fromStdString(setting.GetLabel()); @@ -224,6 +233,20 @@ void Config::WriteGlobalSetting(const Settings::SwitchableSetting& } } +// Explicit u16 definition: Qt would store it as QMetaType otherwise, which is not human-readable +template <> +void Config::WriteGlobalSetting(const Settings::SwitchableSetting& setting) { + const QString name = QString::fromStdString(setting.GetLabel()); + const u16& value = setting.GetValue(global); + if (!global) { + qt_config->setValue(name + QStringLiteral("/use_global"), setting.UsingGlobal()); + } + if (global || !setting.UsingGlobal()) { + qt_config->setValue(name + QStringLiteral("/default"), value == setting.GetDefault()); + qt_config->setValue(name, static_cast(value)); + } +} + void Config::ReadValues() { if (global) { ReadControlValues(); @@ -474,13 +497,8 @@ void Config::ReadLayoutValues() { ReadGlobalSetting(Settings::values.render_3d); ReadGlobalSetting(Settings::values.factor_3d); - Settings::values.pp_shader_name = - ReadSetting(QStringLiteral("pp_shader_name"), (Settings::values.render_3d.GetValue() == - Settings::StereoRenderOption::Anaglyph) - ? QStringLiteral("dubois (builtin)") - : QStringLiteral("none (builtin)")) - .toString() - .toStdString(); + ReadGlobalSetting(Settings::values.pp_shader_name); + ReadGlobalSetting(Settings::values.anaglyph_shader_name); ReadGlobalSetting(Settings::values.filter_mode); ReadGlobalSetting(Settings::values.layout_option); ReadGlobalSetting(Settings::values.swap_screen); @@ -989,11 +1007,8 @@ void Config::SaveLayoutValues() { WriteGlobalSetting(Settings::values.render_3d); WriteGlobalSetting(Settings::values.factor_3d); - WriteSetting(QStringLiteral("pp_shader_name"), - QString::fromStdString(Settings::values.pp_shader_name.GetValue()), - (Settings::values.render_3d.GetValue() == Settings::StereoRenderOption::Anaglyph) - ? QStringLiteral("dubois (builtin)") - : QStringLiteral("none (builtin)")); + WriteGlobalSetting(Settings::values.pp_shader_name); + WriteGlobalSetting(Settings::values.anaglyph_shader_name); WriteGlobalSetting(Settings::values.filter_mode); WriteGlobalSetting(Settings::values.layout_option); WriteGlobalSetting(Settings::values.swap_screen); @@ -1276,15 +1291,6 @@ QVariant Config::ReadSetting(const QString& name, const QVariant& default_value) return result; } -template -void Config::ReadSettingGlobal(Type& setting, const QString& name, - const QVariant& default_value) const { - const bool use_global = qt_config->value(name + QStringLiteral("/use_global"), true).toBool(); - if (global || !use_global) { - setting = ReadSetting(name, default_value).value(); - } -} - void Config::WriteSetting(const QString& name, const QVariant& value) { qt_config->setValue(name, value); } @@ -1295,17 +1301,6 @@ void Config::WriteSetting(const QString& name, const QVariant& value, qt_config->setValue(name, value); } -void Config::WriteSetting(const QString& name, const QVariant& value, const QVariant& default_value, - bool use_global) { - if (!global) { - qt_config->setValue(name + QStringLiteral("/use_global"), use_global); - } - if (global || !use_global) { - qt_config->setValue(name + QStringLiteral("/default"), value == default_value); - qt_config->setValue(name, value); - } -} - void Config::Reload() { ReadValues(); // To apply default value changes diff --git a/src/citra_qt/configuration/config.h b/src/citra_qt/configuration/config.h index d28983a7a..67eaa40a3 100644 --- a/src/citra_qt/configuration/config.h +++ b/src/citra_qt/configuration/config.h @@ -84,31 +84,15 @@ private: QVariant ReadSetting(const QString& name) const; QVariant ReadSetting(const QString& name, const QVariant& default_value) const; - /** - * Only reads a setting from the qt_config if the current config is a global config, or if the - * current config is a custom config and the setting is overriding the global setting. Otherwise - * it does nothing. - * - * @param setting The variable to be modified - * @param name The setting's identifier - * @param default_value The value to use when the setting is not already present in the config - */ - template - void ReadSettingGlobal(Type& setting, const QString& name, const QVariant& default_value) const; - /** * Writes a setting to the qt_config. * * @param name The setting's idetentifier * @param value Value of the setting * @param default_value Default of the setting if not present in qt_config - * @param use_global Specifies if the custom or global config should be in use, for custom - * configs */ void WriteSetting(const QString& name, const QVariant& value); void WriteSetting(const QString& name, const QVariant& value, const QVariant& default_value); - void WriteSetting(const QString& name, const QVariant& value, const QVariant& default_value, - bool use_global); /** * Reads a value from the qt_config and applies it to the setting, using its label and default diff --git a/src/citra_qt/configuration/configure_enhancements.cpp b/src/citra_qt/configuration/configure_enhancements.cpp index 1c2d6b993..ee27a89ce 100644 --- a/src/citra_qt/configuration/configure_enhancements.cpp +++ b/src/citra_qt/configuration/configure_enhancements.cpp @@ -84,21 +84,31 @@ void ConfigureEnhancements::SetConfiguration() { void ConfigureEnhancements::updateShaders(Settings::StereoRenderOption stereo_option) { ui->shader_combobox->clear(); + ui->shader_combobox->setEnabled(true); - if (stereo_option == Settings::StereoRenderOption::Anaglyph) - ui->shader_combobox->addItem(QStringLiteral("dubois (builtin)")); - else if (stereo_option == Settings::StereoRenderOption::Interlaced || - stereo_option == Settings::StereoRenderOption::ReverseInterlaced) + if (stereo_option == Settings::StereoRenderOption::Interlaced || + stereo_option == Settings::StereoRenderOption::ReverseInterlaced) { ui->shader_combobox->addItem(QStringLiteral("horizontal (builtin)")); - else + ui->shader_combobox->setCurrentIndex(0); + ui->shader_combobox->setEnabled(false); + return; + } + + std::string current_shader; + if (stereo_option == Settings::StereoRenderOption::Anaglyph) { + ui->shader_combobox->addItem(QStringLiteral("dubois (builtin)")); + current_shader = Settings::values.anaglyph_shader_name.GetValue(); + } else { ui->shader_combobox->addItem(QStringLiteral("none (builtin)")); + current_shader = Settings::values.pp_shader_name.GetValue(); + } ui->shader_combobox->setCurrentIndex(0); for (const auto& shader : OpenGL::GetPostProcessingShaderList( stereo_option == Settings::StereoRenderOption::Anaglyph)) { ui->shader_combobox->addItem(QString::fromStdString(shader)); - if (Settings::values.pp_shader_name.GetValue() == shader) + if (current_shader == shader) ui->shader_combobox->setCurrentIndex(ui->shader_combobox->count() - 1); } } @@ -115,8 +125,13 @@ void ConfigureEnhancements::ApplyConfiguration() { Settings::values.factor_3d = ui->factor_3d->value(); Settings::values.mono_render_option = static_cast(ui->mono_rendering_eye->currentIndex()); - Settings::values.pp_shader_name = - ui->shader_combobox->itemText(ui->shader_combobox->currentIndex()).toStdString(); + if (Settings::values.render_3d.GetValue() == Settings::StereoRenderOption::Anaglyph) { + Settings::values.anaglyph_shader_name = + ui->shader_combobox->itemText(ui->shader_combobox->currentIndex()).toStdString(); + } else if (Settings::values.render_3d.GetValue() == Settings::StereoRenderOption::Off) { + Settings::values.pp_shader_name = + ui->shader_combobox->itemText(ui->shader_combobox->currentIndex()).toStdString(); + } Settings::values.filter_mode = ui->toggle_linear_filter->isChecked(); Settings::values.texture_filter_name = ui->texture_filter_combobox->currentText().toStdString(); Settings::values.layout_option = diff --git a/src/common/settings.cpp b/src/common/settings.cpp index e2934b3f3..4f485f582 100644 --- a/src/common/settings.cpp +++ b/src/common/settings.cpp @@ -115,6 +115,9 @@ void LogSettings() { log_setting("Stereoscopy_Render3d", values.render_3d.GetValue()); log_setting("Stereoscopy_Factor3d", values.factor_3d.GetValue()); log_setting("Stereoscopy_MonoRenderOption", values.mono_render_option.GetValue()); + if (values.render_3d.GetValue() == StereoRenderOption::Anaglyph) { + log_setting("Renderer_AnaglyphShader", values.anaglyph_shader_name.GetValue()); + } log_setting("Layout_LayoutOption", values.layout_option.GetValue()); log_setting("Layout_SwapScreen", values.swap_screen.GetValue()); log_setting("Layout_UprightScreen", values.upright_screen.GetValue()); @@ -203,6 +206,7 @@ void RestoreGlobalState(bool is_powered_on) { values.factor_3d.SetGlobal(true); values.filter_mode.SetGlobal(true); values.pp_shader_name.SetGlobal(true); + values.anaglyph_shader_name.SetGlobal(true); } void LoadProfile(int index) { diff --git a/src/common/settings.h b/src/common/settings.h index 98579cff7..ae493b79f 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -483,6 +483,7 @@ struct Values { SwitchableSetting filter_mode{true, "filter_mode"}; SwitchableSetting pp_shader_name{"none (builtin)", "pp_shader_name"}; + SwitchableSetting anaglyph_shader_name{"dubois (builtin)", "anaglyph_shader_name"}; Setting dump_textures{false, "dump_textures"}; Setting custom_textures{false, "custom_textures"}; diff --git a/src/video_core/renderer_opengl/renderer_opengl.cpp b/src/video_core/renderer_opengl/renderer_opengl.cpp index 0b7c8dd12..730194be8 100644 --- a/src/video_core/renderer_opengl/renderer_opengl.cpp +++ b/src/video_core/renderer_opengl/renderer_opengl.cpp @@ -687,11 +687,11 @@ void RendererOpenGL::ReloadShader() { } if (Settings::values.render_3d.GetValue() == Settings::StereoRenderOption::Anaglyph) { - if (Settings::values.pp_shader_name.GetValue() == "dubois (builtin)") { + if (Settings::values.anaglyph_shader_name.GetValue() == "dubois (builtin)") { shader_data += fragment_shader_anaglyph; } else { std::string shader_text = OpenGL::GetPostProcessingShaderCode( - true, Settings::values.pp_shader_name.GetValue()); + true, Settings::values.anaglyph_shader_name.GetValue()); if (shader_text.empty()) { // Should probably provide some information that the shader couldn't load shader_data += fragment_shader_anaglyph; @@ -702,18 +702,7 @@ void RendererOpenGL::ReloadShader() { } else if (Settings::values.render_3d.GetValue() == Settings::StereoRenderOption::Interlaced || Settings::values.render_3d.GetValue() == Settings::StereoRenderOption::ReverseInterlaced) { - if (Settings::values.pp_shader_name.GetValue() == "horizontal (builtin)") { - shader_data += fragment_shader_interlaced; - } else { - std::string shader_text = OpenGL::GetPostProcessingShaderCode( - false, Settings::values.pp_shader_name.GetValue()); - if (shader_text.empty()) { - // Should probably provide some information that the shader couldn't load - shader_data += fragment_shader_interlaced; - } else { - shader_data += shader_text; - } - } + shader_data += fragment_shader_interlaced; } else { if (Settings::values.pp_shader_name.GetValue() == "none (builtin)") { shader_data += fragment_shader;