diff --git a/src/common/settings.cpp b/src/common/settings.cpp index 245c432939..ee7074b128 100644 --- a/src/common/settings.cpp +++ b/src/common/settings.cpp @@ -206,6 +206,7 @@ const char* TranslateCategory(Category category) { case Category::Renderer: case Category::RendererAdvanced: case Category::RendererDebug: + case Category::RendererExtensions: return "Renderer"; case Category::System: case Category::SystemAudio: diff --git a/src/common/settings.h b/src/common/settings.h index c2cdeb4994..ca1de28d0a 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -445,6 +445,17 @@ struct Values { SwitchableSetting barrier_feedback_loops{linkage, true, "barrier_feedback_loops", Category::RendererAdvanced}; + SwitchableSetting use_dyna_state_1{linkage, true, "use_dyna_state_1", + Category::RendererExtensions}; + SwitchableSetting use_dyna_state_2{linkage, true, "use_dyna_state_2", + Category::RendererExtensions}; + SwitchableSetting use_dyna_state_2_extras{linkage, true, "use_dyna_state_2_extras", + Category::RendererExtensions}; + SwitchableSetting use_dyna_state_3{linkage, false, "use_dyna_state_3", + Category::RendererExtensions}; + SwitchableSetting use_dyna_state_3_blend{linkage, false, "use_dyna_state_3_blend", + Category::RendererExtensions}; + Setting renderer_debug{linkage, false, "debug", Category::RendererDebug}; Setting renderer_shader_feedback{linkage, false, "shader_feedback", Category::RendererDebug}; diff --git a/src/common/settings_common.h b/src/common/settings_common.h index 2df3f08099..af16ec692b 100644 --- a/src/common/settings_common.h +++ b/src/common/settings_common.h @@ -21,6 +21,7 @@ enum class Category : u32 { Overlay, Renderer, RendererAdvanced, + RendererExtensions, RendererDebug, System, SystemAudio, diff --git a/src/frontend_common/config.cpp b/src/frontend_common/config.cpp index 95f8c8c369..326267e774 100644 --- a/src/frontend_common/config.cpp +++ b/src/frontend_common/config.cpp @@ -362,6 +362,7 @@ void Config::ReadRendererValues() { ReadCategory(Settings::Category::Renderer); ReadCategory(Settings::Category::RendererAdvanced); + ReadCategory(Settings::Category::RendererExtensions); ReadCategory(Settings::Category::RendererDebug); EndGroup(); @@ -670,6 +671,7 @@ void Config::SaveRendererValues() { WriteCategory(Settings::Category::Renderer); WriteCategory(Settings::Category::RendererAdvanced); + WriteCategory(Settings::Category::RendererExtensions); WriteCategory(Settings::Category::RendererDebug); EndGroup(); diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index a8883bc89f..a0312df65a 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -427,11 +428,11 @@ PipelineCache::PipelineCache(Tegra::MaxwellDeviceMemoryManager& device_memory_, } dynamic_features = DynamicFeatures{ - .has_extended_dynamic_state = device.IsExtExtendedDynamicStateSupported(), - .has_extended_dynamic_state_2 = device.IsExtExtendedDynamicState2Supported(), - .has_extended_dynamic_state_2_extra = device.IsExtExtendedDynamicState2ExtrasSupported(), - .has_extended_dynamic_state_3_blend = device.IsExtExtendedDynamicState3BlendingSupported(), - .has_extended_dynamic_state_3_enables = device.IsExtExtendedDynamicState3EnablesSupported(), + .has_extended_dynamic_state = Settings::values.use_dyna_state_1.GetValue(), + .has_extended_dynamic_state_2 = Settings::values.use_dyna_state_2.GetValue(), + .has_extended_dynamic_state_2_extra = Settings::values.use_dyna_state_2_extras.GetValue(), + .has_extended_dynamic_state_3_blend = Settings::values.use_dyna_state_3_blend.GetValue(), + .has_extended_dynamic_state_3_enables = Settings::values.use_dyna_state_3.GetValue(), .has_dynamic_vertex_input = device.IsExtVertexInputDynamicStateSupported(), }; } diff --git a/src/yuzu/CMakeLists.txt b/src/yuzu/CMakeLists.txt index 7b94b8054b..e8d2a9ad2a 100644 --- a/src/yuzu/CMakeLists.txt +++ b/src/yuzu/CMakeLists.txt @@ -231,6 +231,7 @@ add_executable(yuzu compatdb.h yuzu.qrc yuzu.rc + configuration/configure_graphics_extensions.h configuration/configure_graphics_extensions.cpp configuration/configure_graphics_extensions.ui ) set_target_properties(yuzu PROPERTIES OUTPUT_NAME "eden") diff --git a/src/yuzu/configuration/configure_dialog.cpp b/src/yuzu/configuration/configure_dialog.cpp index 37f23388e6..987b1462db 100644 --- a/src/yuzu/configuration/configure_dialog.cpp +++ b/src/yuzu/configuration/configure_dialog.cpp @@ -17,6 +17,7 @@ #include "yuzu/configuration/configure_general.h" #include "yuzu/configuration/configure_graphics.h" #include "yuzu/configuration/configure_graphics_advanced.h" +#include "yuzu/configuration/configure_graphics_extensions.h" #include "yuzu/configuration/configure_hotkeys.h" #include "yuzu/configuration/configure_input.h" #include "yuzu/configuration/configure_input_player.h" @@ -42,7 +43,9 @@ ConfigureDialog::ConfigureDialog(QWidget* parent, HotkeyRegistry& registry_, filesystem_tab{std::make_unique(this)}, general_tab{std::make_unique(system_, nullptr, *builder, this)}, graphics_advanced_tab{ - std::make_unique(system_, nullptr, *builder, this)}, + std::make_unique(system_, nullptr, *builder, this)}, + graphics_extensions_tab{ + std::make_unique(system_, nullptr, *builder, this)}, ui_tab{std::make_unique(system_, this)}, graphics_tab{std::make_unique( system_, vk_device_records, [&]() { graphics_advanced_tab->ExposeComputeOption(); }, @@ -68,6 +71,7 @@ ConfigureDialog::ConfigureDialog(QWidget* parent, HotkeyRegistry& registry_, ui->tabWidget->addTab(general_tab.get(), tr("General")); ui->tabWidget->addTab(graphics_tab.get(), tr("Graphics")); ui->tabWidget->addTab(graphics_advanced_tab.get(), tr("GraphicsAdvanced")); + ui->tabWidget->addTab(graphics_extensions_tab.get(), tr("GraphicsExtensions")); ui->tabWidget->addTab(hotkeys_tab.get(), tr("Hotkeys")); ui->tabWidget->addTab(input_tab.get(), tr("Controls")); ui->tabWidget->addTab(profile_tab.get(), tr("Profiles")); @@ -104,7 +108,7 @@ ConfigureDialog::ConfigureDialog(QWidget* parent, HotkeyRegistry& registry_, adjustSize(); ui->selectorList->setCurrentRow(0); - // Selects the leftmost button on the bottom bar (Cancel as of writing) + // Selects the leftmost button on the bottom bar (Cancel as of writing) ui->buttonBox->setFocus(); } @@ -123,6 +127,7 @@ void ConfigureDialog::ApplyConfiguration() { cpu_tab->ApplyConfiguration(); graphics_tab->ApplyConfiguration(); graphics_advanced_tab->ApplyConfiguration(); + graphics_extensions_tab->ApplyConfiguration(); audio_tab->ApplyConfiguration(); debug_tab_tab->ApplyConfiguration(); web_tab->ApplyConfiguration(); @@ -162,16 +167,16 @@ Q_DECLARE_METATYPE(QList); void ConfigureDialog::PopulateSelectionList() { const std::array>, 6> items{ - {{tr("General"), - {general_tab.get(), hotkeys_tab.get(), ui_tab.get(), web_tab.get(), debug_tab_tab.get()}}, - {tr("System"), - {system_tab.get(), profile_tab.get(), network_tab.get(), filesystem_tab.get(), - applets_tab.get()}}, - {tr("CPU"), {cpu_tab.get()}}, - {tr("Graphics"), {graphics_tab.get(), graphics_advanced_tab.get()}}, - {tr("Audio"), {audio_tab.get()}}, - {tr("Controls"), input_tab->GetSubTabs()}}, - }; + {{tr("General"), + {general_tab.get(), hotkeys_tab.get(), ui_tab.get(), web_tab.get(), debug_tab_tab.get()}}, + {tr("System"), + {system_tab.get(), profile_tab.get(), network_tab.get(), filesystem_tab.get(), + applets_tab.get()}}, + {tr("CPU"), {cpu_tab.get()}}, + {tr("Graphics"), {graphics_tab.get(), graphics_advanced_tab.get(), graphics_extensions_tab.get()}}, + {tr("Audio"), {audio_tab.get()}}, + {tr("Controls"), input_tab->GetSubTabs()}}, + }; [[maybe_unused]] const QSignalBlocker blocker(ui->selectorList); diff --git a/src/yuzu/configuration/configure_dialog.h b/src/yuzu/configuration/configure_dialog.h index d0a24a07b3..0b6b285678 100644 --- a/src/yuzu/configuration/configure_dialog.h +++ b/src/yuzu/configuration/configure_dialog.h @@ -23,6 +23,7 @@ class ConfigureFilesystem; class ConfigureGeneral; class ConfigureGraphics; class ConfigureGraphicsAdvanced; +class ConfigureGraphicsExtensions; class ConfigureHotkeys; class ConfigureInput; class ConfigureProfileManager; @@ -83,6 +84,7 @@ private: std::unique_ptr filesystem_tab; std::unique_ptr general_tab; std::unique_ptr graphics_advanced_tab; + std::unique_ptr graphics_extensions_tab; std::unique_ptr ui_tab; std::unique_ptr graphics_tab; std::unique_ptr hotkeys_tab; diff --git a/src/yuzu/configuration/configure_graphics_extensions.cpp b/src/yuzu/configuration/configure_graphics_extensions.cpp new file mode 100644 index 0000000000..28e11b78b7 --- /dev/null +++ b/src/yuzu/configuration/configure_graphics_extensions.cpp @@ -0,0 +1,71 @@ +// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include +#include +#include +#include "common/settings.h" +#include "core/core.h" +#include "ui_configure_graphics_extensions.h" +#include "yuzu/configuration/configuration_shared.h" +#include "yuzu/configuration/configure_graphics_extensions.h" +#include "yuzu/configuration/shared_translation.h" +#include "yuzu/configuration/shared_widget.h" + +ConfigureGraphicsExtensions::ConfigureGraphicsExtensions( + const Core::System& system_, std::shared_ptr> group_, + const ConfigurationShared::Builder& builder, QWidget* parent) + : Tab(group_, parent), ui{std::make_unique()}, system{system_} { + + ui->setupUi(this); + + Setup(builder); + + SetConfiguration(); +} + +ConfigureGraphicsExtensions::~ConfigureGraphicsExtensions() = default; + +void ConfigureGraphicsExtensions::SetConfiguration() {} + +void ConfigureGraphicsExtensions::Setup(const ConfigurationShared::Builder& builder) { + auto& layout = *ui->populate_target->layout(); + std::map hold{}; // A map will sort the data for us + + for (auto setting : + Settings::values.linkage.by_category[Settings::Category::RendererExtensions]) { + ConfigurationShared::Widget* widget = builder.BuildWidget(setting, apply_funcs); + + if (widget == nullptr) { + continue; + } + if (!widget->Valid()) { + widget->deleteLater(); + continue; + } + + hold.emplace(setting->Id(), widget); + } + for (const auto& [id, widget] : hold) { + layout.addWidget(widget); + } +} + +void ConfigureGraphicsExtensions::ApplyConfiguration() { + const bool is_powered_on = system.IsPoweredOn(); + for (const auto& func : apply_funcs) { + func(is_powered_on); + } +} + +void ConfigureGraphicsExtensions::changeEvent(QEvent* event) { + if (event->type() == QEvent::LanguageChange) { + RetranslateUI(); + } + + QWidget::changeEvent(event); +} + +void ConfigureGraphicsExtensions::RetranslateUI() { + ui->retranslateUi(this); +} diff --git a/src/yuzu/configuration/configure_graphics_extensions.h b/src/yuzu/configuration/configure_graphics_extensions.h new file mode 100644 index 0000000000..aea51f5fbe --- /dev/null +++ b/src/yuzu/configuration/configure_graphics_extensions.h @@ -0,0 +1,45 @@ +// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include +#include +#include +#include "yuzu/configuration/configuration_shared.h" + +namespace Core { +class System; +} + +namespace Ui { +class ConfigureGraphicsExtensions; +} + +namespace ConfigurationShared { +class Builder; +} + +class ConfigureGraphicsExtensions : public ConfigurationShared::Tab { + Q_OBJECT + +public: + explicit ConfigureGraphicsExtensions( + const Core::System& system_, std::shared_ptr> group, + const ConfigurationShared::Builder& builder, QWidget* parent = nullptr); + ~ConfigureGraphicsExtensions() override; + + void ApplyConfiguration() override; + void SetConfiguration() override; + +private: + void Setup(const ConfigurationShared::Builder& builder); + void changeEvent(QEvent* event) override; + void RetranslateUI(); + + std::unique_ptr ui; + + const Core::System& system; + + std::vector> apply_funcs; +}; diff --git a/src/yuzu/configuration/configure_graphics_extensions.ui b/src/yuzu/configuration/configure_graphics_extensions.ui new file mode 100644 index 0000000000..871c794a7c --- /dev/null +++ b/src/yuzu/configuration/configure_graphics_extensions.ui @@ -0,0 +1,68 @@ + + + ConfigureGraphicsExtensions + + + + 0 + 0 + 404 + 376 + + + + Form + + + Extensions + + + + + + + + Vulkan Extension Settings + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + + + + + + + Qt::Orientation::Vertical + + + + 20 + 40 + + + + + + + + + diff --git a/src/yuzu/configuration/configure_per_game.cpp b/src/yuzu/configuration/configure_per_game.cpp index df3251b9bf..031a8d4c2d 100644 --- a/src/yuzu/configuration/configure_per_game.cpp +++ b/src/yuzu/configuration/configure_per_game.cpp @@ -32,6 +32,7 @@ #include "yuzu/configuration/configure_cpu.h" #include "yuzu/configuration/configure_graphics.h" #include "yuzu/configuration/configure_graphics_advanced.h" +#include "yuzu/configuration/configure_graphics_extensions.h" #include "yuzu/configuration/configure_input_per_game.h" #include "yuzu/configuration/configure_linux_tab.h" #include "yuzu/configuration/configure_per_game.h" @@ -57,6 +58,8 @@ ConfigurePerGame::ConfigurePerGame(QWidget* parent, u64 title_id_, const std::st cpu_tab = std::make_unique(system_, tab_group, *builder, this); graphics_advanced_tab = std::make_unique(system_, tab_group, *builder, this); + graphics_extensions_tab = + std::make_unique(system_, tab_group, *builder, this); graphics_tab = std::make_unique( system_, vk_device_records, [&]() { graphics_advanced_tab->ExposeComputeOption(); }, [](Settings::AspectRatio, Settings::ResolutionSetup) {}, tab_group, *builder, this); @@ -71,6 +74,7 @@ ConfigurePerGame::ConfigurePerGame(QWidget* parent, u64 title_id_, const std::st ui->tabWidget->addTab(cpu_tab.get(), tr("CPU")); ui->tabWidget->addTab(graphics_tab.get(), tr("Graphics")); ui->tabWidget->addTab(graphics_advanced_tab.get(), tr("Adv. Graphics")); + ui->tabWidget->addTab(graphics_extensions_tab.get(), tr("GPU Extensions")); ui->tabWidget->addTab(audio_tab.get(), tr("Audio")); ui->tabWidget->addTab(input_tab.get(), tr("Input Profiles")); diff --git a/src/yuzu/configuration/configure_per_game.h b/src/yuzu/configuration/configure_per_game.h index 196cb32e6f..e0f4e5cd67 100644 --- a/src/yuzu/configuration/configure_per_game.h +++ b/src/yuzu/configuration/configure_per_game.h @@ -31,6 +31,7 @@ class ConfigureAudio; class ConfigureCpu; class ConfigureGraphics; class ConfigureGraphicsAdvanced; +class ConfigureGraphicsExtensions; class ConfigureInputPerGame; class ConfigureLinuxTab; class ConfigureSystem; @@ -84,6 +85,7 @@ private: std::unique_ptr audio_tab; std::unique_ptr cpu_tab; std::unique_ptr graphics_advanced_tab; + std::unique_ptr graphics_extensions_tab; std::unique_ptr graphics_tab; std::unique_ptr input_tab; std::unique_ptr linux_tab; diff --git a/src/yuzu/configuration/shared_translation.cpp b/src/yuzu/configuration/shared_translation.cpp index 440467010b..63ebba2dc1 100644 --- a/src/yuzu/configuration/shared_translation.cpp +++ b/src/yuzu/configuration/shared_translation.cpp @@ -230,6 +230,26 @@ std::unique_ptr InitializeTranslations(QWidget* parent) { INSERT(Settings, barrier_feedback_loops, tr("Barrier feedback loops"), tr("Improves rendering of transparency effects in specific games.")); + INSERT(Settings, use_dyna_state_1, tr("Enable Extended Dynamic State 1"), + tr("Enables the VkExtendedDynamicState1 extension.\nThis setting may improve performance, " + "but may also cause games to break on some systems.")); + + INSERT(Settings, use_dyna_state_2, tr("Enable Extended Dynamic State 2"), + tr("Enables the VkExtendedDynamicState2 extension.\nThis setting may improve performance, " + "but may also cause games to break on some systems.")); + + INSERT(Settings, use_dyna_state_2_extras, tr("Enable Extended Dynamic State 2 Extras"), + tr("Enables the VkExtendedDynamicState2Extras extension.\nThis setting may improve performance, " + "but may also cause games to break on some systems.")); + + INSERT(Settings, use_dyna_state_3, tr("Enable Extended Dynamic State 3"), + tr("Enables the VkExtendedDynamicState3 extension.\nThis setting may improve performance, " + "but may also cause games to break on some systems.")); + + INSERT(Settings, use_dyna_state_3_blend, tr("Enable Extended Dynamic State 3 Blending"), + tr("Enables the VkExtendedDynamicState3Blending extension.\nThis setting may improve performance, " + "but may also cause games to break on some systems.")); + // Renderer (Debug) // System