diff options
| -rw-r--r-- | src/common/settings.cpp | 1 | ||||
| -rw-r--r-- | src/common/settings.h | 1 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_pipeline_cache.cpp | 3 | ||||
| -rw-r--r-- | src/yuzu/configuration/config.cpp | 2 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_dialog.cpp | 3 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_dialog.h | 2 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_graphics.cpp | 23 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_graphics.h | 6 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_graphics_advanced.cpp | 17 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_graphics_advanced.h | 3 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_graphics_advanced.ui | 11 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_per_game.cpp | 3 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_per_game.h | 2 | 
13 files changed, 67 insertions, 10 deletions
| diff --git a/src/common/settings.cpp b/src/common/settings.cpp index db1774c71..ba617aea1 100644 --- a/src/common/settings.cpp +++ b/src/common/settings.cpp @@ -232,6 +232,7 @@ void RestoreGlobalState(bool is_powered_on) {      values.bg_red.SetGlobal(true);      values.bg_green.SetGlobal(true);      values.bg_blue.SetGlobal(true); +    values.enable_compute_pipelines.SetGlobal(true);      // System      values.language_index.SetGlobal(true); diff --git a/src/common/settings.h b/src/common/settings.h index 5f4caaab9..36ffcd693 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -472,6 +472,7 @@ struct Values {      SwitchableSetting<bool> use_fast_gpu_time{true, "use_fast_gpu_time"};      SwitchableSetting<bool> use_vulkan_driver_pipeline_cache{true,                                                               "use_vulkan_driver_pipeline_cache"}; +    SwitchableSetting<bool> enable_compute_pipelines{false, "enable_compute_pipelines"};      SwitchableSetting<u8> bg_red{0, "bg_red"};      SwitchableSetting<u8> bg_green{0, "bg_green"}; diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index 596996bec..66dfe5733 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp @@ -698,7 +698,8 @@ std::unique_ptr<ComputePipeline> PipelineCache::CreateComputePipeline(      PipelineStatistics* statistics, bool build_in_parallel) try {      // TODO: Remove this when Intel fixes their shader compiler.      //       https://github.com/IGCIT/Intel-GPU-Community-Issue-Tracker-IGCIT/issues/159 -    if (device.GetDriverID() == VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS) { +    if (device.GetDriverID() == VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS && +        !Settings::values.enable_compute_pipelines.GetValue()) {          LOG_ERROR(Render_Vulkan, "Skipping 0x{:016x}", key.Hash());          return nullptr;      } diff --git a/src/yuzu/configuration/config.cpp b/src/yuzu/configuration/config.cpp index b94d36838..70737c54e 100644 --- a/src/yuzu/configuration/config.cpp +++ b/src/yuzu/configuration/config.cpp @@ -716,6 +716,7 @@ void Config::ReadRendererValues() {      ReadGlobalSetting(Settings::values.use_asynchronous_shaders);      ReadGlobalSetting(Settings::values.use_fast_gpu_time);      ReadGlobalSetting(Settings::values.use_vulkan_driver_pipeline_cache); +    ReadGlobalSetting(Settings::values.enable_compute_pipelines);      ReadGlobalSetting(Settings::values.bg_red);      ReadGlobalSetting(Settings::values.bg_green);      ReadGlobalSetting(Settings::values.bg_blue); @@ -1366,6 +1367,7 @@ void Config::SaveRendererValues() {      WriteGlobalSetting(Settings::values.use_asynchronous_shaders);      WriteGlobalSetting(Settings::values.use_fast_gpu_time);      WriteGlobalSetting(Settings::values.use_vulkan_driver_pipeline_cache); +    WriteGlobalSetting(Settings::values.enable_compute_pipelines);      WriteGlobalSetting(Settings::values.bg_red);      WriteGlobalSetting(Settings::values.bg_green);      WriteGlobalSetting(Settings::values.bg_blue); diff --git a/src/yuzu/configuration/configure_dialog.cpp b/src/yuzu/configuration/configure_dialog.cpp index 2aaefcc05..8e76a819a 100644 --- a/src/yuzu/configuration/configure_dialog.cpp +++ b/src/yuzu/configuration/configure_dialog.cpp @@ -36,8 +36,9 @@ ConfigureDialog::ConfigureDialog(QWidget* parent, HotkeyRegistry& registry_,        debug_tab_tab{std::make_unique<ConfigureDebugTab>(system_, this)},        filesystem_tab{std::make_unique<ConfigureFilesystem>(this)},        general_tab{std::make_unique<ConfigureGeneral>(system_, this)}, -      graphics_tab{std::make_unique<ConfigureGraphics>(system_, this)},        graphics_advanced_tab{std::make_unique<ConfigureGraphicsAdvanced>(system_, this)}, +      graphics_tab{std::make_unique<ConfigureGraphics>( +          system_, [&]() { graphics_advanced_tab->ExposeComputeOption(); }, this)},        hotkeys_tab{std::make_unique<ConfigureHotkeys>(system_.HIDCore(), this)},        input_tab{std::make_unique<ConfigureInput>(system_, this)},        network_tab{std::make_unique<ConfigureNetwork>(system_, this)}, diff --git a/src/yuzu/configuration/configure_dialog.h b/src/yuzu/configuration/configure_dialog.h index 1f724834a..a086a07c4 100644 --- a/src/yuzu/configuration/configure_dialog.h +++ b/src/yuzu/configuration/configure_dialog.h @@ -72,8 +72,8 @@ private:      std::unique_ptr<ConfigureDebugTab> debug_tab_tab;      std::unique_ptr<ConfigureFilesystem> filesystem_tab;      std::unique_ptr<ConfigureGeneral> general_tab; -    std::unique_ptr<ConfigureGraphics> graphics_tab;      std::unique_ptr<ConfigureGraphicsAdvanced> graphics_advanced_tab; +    std::unique_ptr<ConfigureGraphics> graphics_tab;      std::unique_ptr<ConfigureHotkeys> hotkeys_tab;      std::unique_ptr<ConfigureInput> input_tab;      std::unique_ptr<ConfigureNetwork> network_tab; diff --git a/src/yuzu/configuration/configure_graphics.cpp b/src/yuzu/configuration/configure_graphics.cpp index 76e5b7499..f316b598c 100644 --- a/src/yuzu/configuration/configure_graphics.cpp +++ b/src/yuzu/configuration/configure_graphics.cpp @@ -2,9 +2,11 @@  // SPDX-License-Identifier: GPL-2.0-or-later  // Include this early to include Vulkan headers how we want to +#include "video_core/vulkan_common/vulkan_device.h"  #include "video_core/vulkan_common/vulkan_wrapper.h"  #include <algorithm> +#include <functional>  #include <iosfwd>  #include <iterator>  #include <string> @@ -74,8 +76,11 @@ static constexpr Settings::VSyncMode PresentModeToSetting(VkPresentModeKHR mode)      }  } -ConfigureGraphics::ConfigureGraphics(const Core::System& system_, QWidget* parent) -    : QWidget(parent), ui{std::make_unique<Ui::ConfigureGraphics>()}, system{system_} { +ConfigureGraphics::ConfigureGraphics(const Core::System& system_, +                                     const std::function<void()>& expose_compute_option_, +                                     QWidget* parent) +    : QWidget(parent), ui{std::make_unique<Ui::ConfigureGraphics>()}, +      expose_compute_option{expose_compute_option_}, system{system_} {      vulkan_device = Settings::values.vulkan_device.GetValue();      RetrieveVulkanDevices(); @@ -513,8 +518,7 @@ void ConfigureGraphics::RetrieveVulkanDevices() try {      const Common::DynamicLibrary library = OpenLibrary();      const vk::Instance instance = CreateInstance(library, dld, VK_API_VERSION_1_1, wsi.type);      const std::vector<VkPhysicalDevice> physical_devices = instance.EnumeratePhysicalDevices(); -    vk::SurfaceKHR surface = //< needed to view present modes for a device -        CreateSurface(instance, wsi); +    vk::SurfaceKHR surface = CreateSurface(instance, wsi);      vulkan_devices.clear();      vulkan_devices.reserve(physical_devices.size()); @@ -527,6 +531,17 @@ void ConfigureGraphics::RetrieveVulkanDevices() try {              physical_device.GetSurfacePresentModesKHR(*surface);          vulkan_devices.push_back(QString::fromStdString(name));          device_present_modes.push_back(present_modes); + +        VkPhysicalDeviceDriverProperties driver_properties{}; +        driver_properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES; +        driver_properties.pNext = nullptr; +        VkPhysicalDeviceProperties2 properties{}; +        properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR; +        properties.pNext = &driver_properties; +        dld.vkGetPhysicalDeviceProperties2(physical_device, &properties); +        if (driver_properties.driverID == VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS) { +            expose_compute_option(); +        }      }  } catch (const Vulkan::vk::Exception& exception) {      LOG_ERROR(Frontend, "Failed to enumerate devices with error: {}", exception.what()); diff --git a/src/yuzu/configuration/configure_graphics.h b/src/yuzu/configuration/configure_graphics.h index 901f604a5..364b1cac2 100644 --- a/src/yuzu/configuration/configure_graphics.h +++ b/src/yuzu/configuration/configure_graphics.h @@ -3,6 +3,7 @@  #pragma once +#include <functional>  #include <memory>  #include <vector>  #include <QColor> @@ -37,7 +38,9 @@ class ConfigureGraphics : public QWidget {      Q_OBJECT  public: -    explicit ConfigureGraphics(const Core::System& system_, QWidget* parent = nullptr); +    explicit ConfigureGraphics(const Core::System& system_, +                               const std::function<void()>& expose_compute_option_, +                               QWidget* parent = nullptr);      ~ConfigureGraphics() override;      void ApplyConfiguration(); @@ -81,6 +84,7 @@ private:                                        // selection in the combobox      u32 vulkan_device{};      Settings::ShaderBackend shader_backend{}; +    const std::function<void()>& expose_compute_option;      const Core::System& system;  }; diff --git a/src/yuzu/configuration/configure_graphics_advanced.cpp b/src/yuzu/configuration/configure_graphics_advanced.cpp index 627ed8b17..1f3e489d0 100644 --- a/src/yuzu/configuration/configure_graphics_advanced.cpp +++ b/src/yuzu/configuration/configure_graphics_advanced.cpp @@ -15,6 +15,8 @@ ConfigureGraphicsAdvanced::ConfigureGraphicsAdvanced(const Core::System& system_      SetupPerGameUI();      SetConfiguration(); + +    ui->enable_compute_pipelines_checkbox->setVisible(false);  }  ConfigureGraphicsAdvanced::~ConfigureGraphicsAdvanced() = default; @@ -27,6 +29,7 @@ void ConfigureGraphicsAdvanced::SetConfiguration() {      ui->async_astc->setEnabled(runtime_lock);      ui->use_asynchronous_shaders->setEnabled(runtime_lock);      ui->anisotropic_filtering_combobox->setEnabled(runtime_lock); +    ui->enable_compute_pipelines_checkbox->setEnabled(runtime_lock);      ui->async_present->setChecked(Settings::values.async_presentation.GetValue());      ui->renderer_force_max_clock->setChecked(Settings::values.renderer_force_max_clock.GetValue()); @@ -36,6 +39,8 @@ void ConfigureGraphicsAdvanced::SetConfiguration() {      ui->use_fast_gpu_time->setChecked(Settings::values.use_fast_gpu_time.GetValue());      ui->use_vulkan_driver_pipeline_cache->setChecked(          Settings::values.use_vulkan_driver_pipeline_cache.GetValue()); +    ui->enable_compute_pipelines_checkbox->setChecked( +        Settings::values.enable_compute_pipelines.GetValue());      if (Settings::IsConfiguringGlobal()) {          ui->gpu_accuracy->setCurrentIndex( @@ -74,6 +79,9 @@ void ConfigureGraphicsAdvanced::ApplyConfiguration() {      ConfigurationShared::ApplyPerGameSetting(&Settings::values.use_vulkan_driver_pipeline_cache,                                               ui->use_vulkan_driver_pipeline_cache,                                               use_vulkan_driver_pipeline_cache); +    ConfigurationShared::ApplyPerGameSetting(&Settings::values.enable_compute_pipelines, +                                             ui->enable_compute_pipelines_checkbox, +                                             enable_compute_pipelines);  }  void ConfigureGraphicsAdvanced::changeEvent(QEvent* event) { @@ -104,6 +112,8 @@ void ConfigureGraphicsAdvanced::SetupPerGameUI() {              Settings::values.use_vulkan_driver_pipeline_cache.UsingGlobal());          ui->anisotropic_filtering_combobox->setEnabled(              Settings::values.max_anisotropy.UsingGlobal()); +        ui->enable_compute_pipelines_checkbox->setEnabled( +            Settings::values.enable_compute_pipelines.UsingGlobal());          return;      } @@ -125,6 +135,9 @@ void ConfigureGraphicsAdvanced::SetupPerGameUI() {      ConfigurationShared::SetColoredTristate(ui->use_vulkan_driver_pipeline_cache,                                              Settings::values.use_vulkan_driver_pipeline_cache,                                              use_vulkan_driver_pipeline_cache); +    ConfigurationShared::SetColoredTristate(ui->enable_compute_pipelines_checkbox, +                                            Settings::values.enable_compute_pipelines, +                                            enable_compute_pipelines);      ConfigurationShared::SetColoredComboBox(          ui->gpu_accuracy, ui->label_gpu_accuracy,          static_cast<int>(Settings::values.gpu_accuracy.GetValue(true))); @@ -132,3 +145,7 @@ void ConfigureGraphicsAdvanced::SetupPerGameUI() {          ui->anisotropic_filtering_combobox, ui->af_label,          static_cast<int>(Settings::values.max_anisotropy.GetValue(true)));  } + +void ConfigureGraphicsAdvanced::ExposeComputeOption() { +    ui->enable_compute_pipelines_checkbox->setVisible(true); +} diff --git a/src/yuzu/configuration/configure_graphics_advanced.h b/src/yuzu/configuration/configure_graphics_advanced.h index ae3c10946..1c7b636b9 100644 --- a/src/yuzu/configuration/configure_graphics_advanced.h +++ b/src/yuzu/configuration/configure_graphics_advanced.h @@ -28,6 +28,8 @@ public:      void ApplyConfiguration();      void SetConfiguration(); +    void ExposeComputeOption(); +  private:      void changeEvent(QEvent* event) override;      void RetranslateUI(); @@ -44,6 +46,7 @@ private:      ConfigurationShared::CheckState use_asynchronous_shaders;      ConfigurationShared::CheckState use_fast_gpu_time;      ConfigurationShared::CheckState use_vulkan_driver_pipeline_cache; +    ConfigurationShared::CheckState enable_compute_pipelines;      const Core::System& system;  }; diff --git a/src/yuzu/configuration/configure_graphics_advanced.ui b/src/yuzu/configuration/configure_graphics_advanced.ui index 9d8cbea09..9ef7c8e8f 100644 --- a/src/yuzu/configuration/configure_graphics_advanced.ui +++ b/src/yuzu/configuration/configure_graphics_advanced.ui @@ -137,6 +137,17 @@           </widget>          </item>          <item> +         <widget class="QCheckBox" name="enable_compute_pipelines_checkbox"> +          <property name="toolTip"> +           <string>Enable compute pipelines, required by some games. This setting only exists for Intel proprietary drivers, and may crash if enabled. +Compute pipelines are always enabled on all other drivers.</string> +          </property> +          <property name="text"> +           <string>Enable Compute Pipelines (Intel Vulkan only)</string> +          </property> +         </widget> +        </item> +        <item>           <widget class="QWidget" name="af_layout" native="true">            <layout class="QHBoxLayout" name="horizontalLayout_1">             <property name="leftMargin"> diff --git a/src/yuzu/configuration/configure_per_game.cpp b/src/yuzu/configuration/configure_per_game.cpp index 7e757eafd..7ac162586 100644 --- a/src/yuzu/configuration/configure_per_game.cpp +++ b/src/yuzu/configuration/configure_per_game.cpp @@ -48,8 +48,9 @@ ConfigurePerGame::ConfigurePerGame(QWidget* parent, u64 title_id_, const std::st      audio_tab = std::make_unique<ConfigureAudio>(system_, this);      cpu_tab = std::make_unique<ConfigureCpu>(system_, this);      general_tab = std::make_unique<ConfigureGeneral>(system_, this); -    graphics_tab = std::make_unique<ConfigureGraphics>(system_, this);      graphics_advanced_tab = std::make_unique<ConfigureGraphicsAdvanced>(system_, this); +    graphics_tab = std::make_unique<ConfigureGraphics>( +        system_, [&]() { graphics_advanced_tab->ExposeComputeOption(); }, this);      input_tab = std::make_unique<ConfigureInputPerGame>(system_, game_config.get(), this);      system_tab = std::make_unique<ConfigureSystem>(system_, this); diff --git a/src/yuzu/configuration/configure_per_game.h b/src/yuzu/configuration/configure_per_game.h index 4ecc43541..85752f1fa 100644 --- a/src/yuzu/configuration/configure_per_game.h +++ b/src/yuzu/configuration/configure_per_game.h @@ -75,8 +75,8 @@ private:      std::unique_ptr<ConfigureAudio> audio_tab;      std::unique_ptr<ConfigureCpu> cpu_tab;      std::unique_ptr<ConfigureGeneral> general_tab; -    std::unique_ptr<ConfigureGraphics> graphics_tab;      std::unique_ptr<ConfigureGraphicsAdvanced> graphics_advanced_tab; +    std::unique_ptr<ConfigureGraphics> graphics_tab;      std::unique_ptr<ConfigureInputPerGame> input_tab;      std::unique_ptr<ConfigureSystem> system_tab;  }; | 
