diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/ByteSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/ByteSetting.kt index 7b7fac2112..0d84c16c65 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/ByteSetting.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/ByteSetting.kt @@ -6,7 +6,8 @@ package org.yuzu.yuzu_emu.features.settings.model import org.yuzu.yuzu_emu.utils.NativeConfig enum class ByteSetting(override val key: String) : AbstractByteSetting { - AUDIO_VOLUME("volume"); + AUDIO_VOLUME("volume"), + RENDERER_DYNA_STATE("dyna_state"); override fun getByte(needsGlobal: Boolean): Byte = NativeConfig.getByte(key, needsGlobal) diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt index 8fa90bf05f..a0ace00c0b 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt @@ -17,6 +17,7 @@ import org.yuzu.yuzu_emu.features.settings.model.IntSetting import org.yuzu.yuzu_emu.features.settings.model.LongSetting import org.yuzu.yuzu_emu.features.settings.model.ShortSetting import org.yuzu.yuzu_emu.features.settings.model.StringSetting +import org.yuzu.yuzu_emu.utils.GpuDriverHelper import org.yuzu.yuzu_emu.utils.NativeConfig /** @@ -56,6 +57,13 @@ abstract class SettingsItem( return NativeInput.getStyleIndex(0) != NpadStyleIndex.Handheld } + if (setting.key == ByteSetting.RENDERER_DYNA_STATE.key) { + // Can't change on Mali GPU's otherwise no game loading for you + if (!GpuDriverHelper.supportsCustomDriverLoading()) { + return false + } + } + // Can't edit settings that aren't saveable in per-game config even if they are switchable if (NativeConfig.isPerGameConfigLoaded() && !setting.isSaveable) { return false @@ -118,6 +126,16 @@ abstract class SettingsItem( descriptionId = R.string.frame_limit_enable_description ) ) + put( + SliderSetting( + ByteSetting.RENDERER_DYNA_STATE, + titleId = R.string.dyna_state, + descriptionId = R.string.dyna_state_description, + min = 0, + max = 3, + ) + ) + put( SliderSetting( ShortSetting.RENDERER_SPEED_LIMIT, diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt index 971324683c..cfdfce7276 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt @@ -471,6 +471,7 @@ class SettingsFragmentPresenter( descriptionId = R.string.frame_skipping_description ) ) + add(ByteSetting.RENDERER_DYNA_STATE.key) add( SwitchSetting( syncCoreSpeedSetting, diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index 3d1927af99..293f4beea5 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -292,6 +292,8 @@ NVDEC Emulation Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. Shader Backend + Extended Dynamic State + Enables the VkExtendedDynamicState* extensions.\nHigher dynamic states will generally improve performance, but may cause issues on certain games or devices\nDefault value is 0 for Disabled, The third value might not work properly on some devices CPU 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 2010066444..82900e163a 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -445,6 +445,14 @@ struct Values { SwitchableSetting barrier_feedback_loops{linkage, true, "barrier_feedback_loops", Category::RendererAdvanced}; + SwitchableSetting dyna_state{linkage, + 0, + 0, + 3, + "dyna_state", + Category::RendererExtensions, + Specialization::Scalar}; + 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..3a27ed895b 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 @@ -426,12 +427,13 @@ PipelineCache::PipelineCache(Tegra::MaxwellDeviceMemoryManager& device_memory_, device.GetMaxVertexInputBindings(), Maxwell::NumVertexArrays); } + const u8 dynamic_state = Settings::values.dyna_state.GetValue(); 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 = dynamic_state > 0, + .has_extended_dynamic_state_2 = dynamic_state > 1, + .has_extended_dynamic_state_2_extra = dynamic_state > 1, + .has_extended_dynamic_state_3_blend = dynamic_state > 2, + .has_extended_dynamic_state_3_enables = dynamic_state > 2, .has_dynamic_vertex_input = device.IsExtVertexInputDynamicStateSupported(), }; } diff --git a/src/video_core/vulkan_common/vulkan_device.cpp b/src/video_core/vulkan_common/vulkan_device.cpp index f2d554a65a..9426d31faf 100644 --- a/src/video_core/vulkan_common/vulkan_device.cpp +++ b/src/video_core/vulkan_common/vulkan_device.cpp @@ -483,16 +483,16 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR if (is_qualcomm || is_turnip) { LOG_WARNING(Render_Vulkan, "Qualcomm and Turnip drivers have broken VK_EXT_custom_border_color"); - RemoveExtensionFeature(extensions.custom_border_color, features.custom_border_color, - VK_EXT_CUSTOM_BORDER_COLOR_EXTENSION_NAME); + //RemoveExtensionFeature(extensions.custom_border_color, features.custom_border_color, + //VK_EXT_CUSTOM_BORDER_COLOR_EXTENSION_NAME); } if (is_qualcomm) { - must_emulate_scaled_formats = true; + must_emulate_scaled_formats = false; LOG_WARNING(Render_Vulkan, "Qualcomm drivers have broken VK_EXT_extended_dynamic_state"); - RemoveExtensionFeature(extensions.extended_dynamic_state, features.extended_dynamic_state, - VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME); + //RemoveExtensionFeature(extensions.extended_dynamic_state, features.extended_dynamic_state, + //VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME); LOG_WARNING(Render_Vulkan, "Qualcomm drivers have a slow VK_KHR_push_descriptor implementation"); @@ -522,11 +522,11 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR } if (is_arm) { - must_emulate_scaled_formats = true; + must_emulate_scaled_formats = false; LOG_WARNING(Render_Vulkan, "ARM drivers have broken VK_EXT_extended_dynamic_state"); - RemoveExtensionFeature(extensions.extended_dynamic_state, features.extended_dynamic_state, - VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME); + //RemoveExtensionFeature(extensions.extended_dynamic_state, features.extended_dynamic_state, + //VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME); } if (is_nvidia) { @@ -552,9 +552,9 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR if (version < VK_MAKE_API_VERSION(0, 21, 2, 0)) { LOG_WARNING(Render_Vulkan, "RADV versions older than 21.2 have broken VK_EXT_extended_dynamic_state"); - RemoveExtensionFeature(extensions.extended_dynamic_state, - features.extended_dynamic_state, - VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME); + //RemoveExtensionFeature(extensions.extended_dynamic_state, + //features.extended_dynamic_state, + //VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME); } } if (extensions.extended_dynamic_state2 && is_radv) { @@ -563,9 +563,9 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR LOG_WARNING( Render_Vulkan, "RADV versions older than 22.3.1 have broken VK_EXT_extended_dynamic_state2"); - RemoveExtensionFeature(extensions.extended_dynamic_state2, - features.extended_dynamic_state2, - VK_EXT_EXTENDED_DYNAMIC_STATE_2_EXTENSION_NAME); + // RemoveExtensionFeature(extensions.extended_dynamic_state2, + // features.extended_dynamic_state2, + // VK_EXT_EXTENDED_DYNAMIC_STATE_2_EXTENSION_NAME); } } if (extensions.extended_dynamic_state2 && is_qualcomm) { @@ -575,32 +575,32 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR // Qualcomm Adreno 7xx drivers do not properly support extended_dynamic_state2. LOG_WARNING(Render_Vulkan, "Qualcomm Adreno 7xx drivers have broken VK_EXT_extended_dynamic_state2"); - RemoveExtensionFeature(extensions.extended_dynamic_state2, - features.extended_dynamic_state2, - VK_EXT_EXTENDED_DYNAMIC_STATE_2_EXTENSION_NAME); + //RemoveExtensionFeature(extensions.extended_dynamic_state2, + //features.extended_dynamic_state2, + //VK_EXT_EXTENDED_DYNAMIC_STATE_2_EXTENSION_NAME); } } if (extensions.extended_dynamic_state3 && is_radv) { LOG_WARNING(Render_Vulkan, "RADV has broken extendedDynamicState3ColorBlendEquation"); - features.extended_dynamic_state3.extendedDynamicState3ColorBlendEnable = false; - features.extended_dynamic_state3.extendedDynamicState3ColorBlendEquation = false; - dynamic_state3_blending = false; + features.extended_dynamic_state3.extendedDynamicState3ColorBlendEnable = true; + features.extended_dynamic_state3.extendedDynamicState3ColorBlendEquation = true; + dynamic_state3_blending = true; const u32 version = (properties.properties.driverVersion << 3) >> 3; if (version < VK_MAKE_API_VERSION(0, 23, 1, 0)) { LOG_WARNING(Render_Vulkan, "RADV versions older than 23.1.0 have broken depth clamp dynamic state"); - features.extended_dynamic_state3.extendedDynamicState3DepthClampEnable = false; - dynamic_state3_enables = false; + features.extended_dynamic_state3.extendedDynamicState3DepthClampEnable = true; + dynamic_state3_enables = true; } } if (extensions.extended_dynamic_state3 && (is_amd_driver || driver_id == VK_DRIVER_ID_SAMSUNG_PROPRIETARY)) { // AMD and Samsung drivers have broken extendedDynamicState3ColorBlendEquation LOG_WARNING(Render_Vulkan, "AMD and Samsung drivers have broken extendedDynamicState3ColorBlendEquation"); - features.extended_dynamic_state3.extendedDynamicState3ColorBlendEnable = false; - features.extended_dynamic_state3.extendedDynamicState3ColorBlendEquation = false; - dynamic_state3_blending = false; + features.extended_dynamic_state3.extendedDynamicState3ColorBlendEnable = true; + features.extended_dynamic_state3.extendedDynamicState3ColorBlendEquation = true; + dynamic_state3_blending = true; } if (extensions.vertex_input_dynamic_state && is_radv) { // TODO(ameerj): Blacklist only offending driver versions @@ -610,18 +610,18 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR if (is_rdna2) { LOG_WARNING(Render_Vulkan, "RADV has broken VK_EXT_vertex_input_dynamic_state on RDNA2 hardware"); - RemoveExtensionFeature(extensions.vertex_input_dynamic_state, - features.vertex_input_dynamic_state, - VK_EXT_VERTEX_INPUT_DYNAMIC_STATE_EXTENSION_NAME); + // RemoveExtensionFeature(extensions.vertex_input_dynamic_state, + // features.vertex_input_dynamic_state, + // VK_EXT_VERTEX_INPUT_DYNAMIC_STATE_EXTENSION_NAME); } } if (extensions.vertex_input_dynamic_state && is_qualcomm) { // Qualcomm drivers do not properly support vertex_input_dynamic_state. LOG_WARNING(Render_Vulkan, "Qualcomm drivers have broken VK_EXT_vertex_input_dynamic_state"); - RemoveExtensionFeature(extensions.vertex_input_dynamic_state, - features.vertex_input_dynamic_state, - VK_EXT_VERTEX_INPUT_DYNAMIC_STATE_EXTENSION_NAME); + //RemoveExtensionFeature(extensions.vertex_input_dynamic_state, + // features.vertex_input_dynamic_state, + // VK_EXT_VERTEX_INPUT_DYNAMIC_STATE_EXTENSION_NAME); } sets_per_pool = 64; @@ -721,8 +721,8 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR "Removing extendedDynamicState3 due to missing extendedDynamicState2"); RemoveExtensionFeature(extensions.extended_dynamic_state3, features.extended_dynamic_state3, VK_EXT_EXTENDED_DYNAMIC_STATE_3_EXTENSION_NAME); - dynamic_state3_blending = false; - dynamic_state3_enables = false; + dynamic_state3_blending = true; + dynamic_state3_enables = true; } logical = vk::Device::Create(physical, queue_cis, ExtensionListForVulkan(loaded_extensions), @@ -1159,7 +1159,7 @@ void Device::RemoveUnsuitableExtensions() { RemoveExtensionFeatureIfUnsuitable(extensions.depth_clip_control, features.depth_clip_control, VK_EXT_DEPTH_CLIP_CONTROL_EXTENSION_NAME); - // VK_EXT_extended_dynamic_state + /* */ // VK_EXT_extended_dynamic_state extensions.extended_dynamic_state = features.extended_dynamic_state.extendedDynamicState; RemoveExtensionFeatureIfUnsuitable(extensions.extended_dynamic_state, features.extended_dynamic_state, @@ -1169,7 +1169,7 @@ void Device::RemoveUnsuitableExtensions() { extensions.extended_dynamic_state2 = features.extended_dynamic_state2.extendedDynamicState2; RemoveExtensionFeatureIfUnsuitable(extensions.extended_dynamic_state2, features.extended_dynamic_state2, - VK_EXT_EXTENDED_DYNAMIC_STATE_2_EXTENSION_NAME); + VK_EXT_EXTENDED_DYNAMIC_STATE_2_EXTENSION_NAME); // VK_EXT_extended_dynamic_state3 dynamic_state3_blending = 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..88bea9786e --- /dev/null +++ b/src/yuzu/configuration/configure_graphics_extensions.cpp @@ -0,0 +1,78 @@ +// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include +#include +#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); + + if (setting->Id() == Settings::values.dyna_state.Id()) { + widget->slider->setTickInterval(1); + widget->slider->setTickPosition(QSlider::TicksAbove); + } + } + + 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..3033bd090c --- /dev/null +++ b/src/yuzu/configuration/configure_graphics_extensions.ui @@ -0,0 +1,78 @@ + + + ConfigureGraphicsExtensions + + + + 0 + 0 + 404 + 376 + + + + Form + + + Extensions + + + + + + + + Vulkan Extension Settings + + + + + + While it's recommended to use state 3, some games may perform better on lower states. Additionally, some older devices and drivers will not work properly with state 3. + + + true + + + + + + + + 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..59f00f384e 100644 --- a/src/yuzu/configuration/shared_translation.cpp +++ b/src/yuzu/configuration/shared_translation.cpp @@ -230,6 +230,11 @@ std::unique_ptr InitializeTranslations(QWidget* parent) { INSERT(Settings, barrier_feedback_loops, tr("Barrier feedback loops"), tr("Improves rendering of transparency effects in specific games.")); + // Renderer (Extensions) + INSERT(Settings, dyna_state, tr("Extended Dynamic State"), + tr("Enables the VkExtendedDynamicState* extensions.\nHigher dynamic states will generally improve " + "performance, but may cause issues on certain games or devices.")); + // Renderer (Debug) // System