diff options
Diffstat (limited to 'src/yuzu')
| -rw-r--r-- | src/yuzu/bootmanager.cpp | 13 | ||||
| -rw-r--r-- | src/yuzu/configuration/config.cpp | 11 | ||||
| -rw-r--r-- | src/yuzu/configuration/config.h | 3 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_debug.cpp | 8 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_debug.ui | 26 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_graphics.cpp | 76 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_graphics.h | 4 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_graphics.ui | 118 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_graphics_advanced.cpp | 7 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_graphics_advanced.h | 1 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_graphics_advanced.ui | 20 | ||||
| -rw-r--r-- | src/yuzu/game_list.cpp | 14 | ||||
| -rw-r--r-- | src/yuzu/game_list.h | 4 | ||||
| -rw-r--r-- | src/yuzu/main.cpp | 99 | ||||
| -rw-r--r-- | src/yuzu/main.h | 3 | 
15 files changed, 280 insertions, 127 deletions
| diff --git a/src/yuzu/bootmanager.cpp b/src/yuzu/bootmanager.cpp index d72ca5acc..25b658b2a 100644 --- a/src/yuzu/bootmanager.cpp +++ b/src/yuzu/bootmanager.cpp @@ -64,12 +64,13 @@ void EmuThread::run() {      emit LoadProgress(VideoCore::LoadCallbackStage::Prepare, 0, 0); -    system.Renderer().ReadRasterizer()->LoadDiskResources( -        system.CurrentProcess()->GetTitleID(), stop_token, -        [this](VideoCore::LoadCallbackStage stage, std::size_t value, std::size_t total) { -            emit LoadProgress(stage, value, total); -        }); - +    if (Settings::values.use_disk_shader_cache.GetValue()) { +        system.Renderer().ReadRasterizer()->LoadDiskResources( +            system.CurrentProcess()->GetTitleID(), stop_token, +            [this](VideoCore::LoadCallbackStage stage, std::size_t value, std::size_t total) { +                emit LoadProgress(stage, value, total); +            }); +    }      emit LoadProgress(VideoCore::LoadCallbackStage::Complete, 0, 0);      gpu.ReleaseContext(); diff --git a/src/yuzu/configuration/config.cpp b/src/yuzu/configuration/config.cpp index a5e032959..52b3ed02e 100644 --- a/src/yuzu/configuration/config.cpp +++ b/src/yuzu/configuration/config.cpp @@ -814,7 +814,7 @@ void Config::ReadRendererValues() {      ReadGlobalSetting(Settings::values.use_nvdec_emulation);      ReadGlobalSetting(Settings::values.accelerate_astc);      ReadGlobalSetting(Settings::values.use_vsync); -    ReadGlobalSetting(Settings::values.use_assembly_shaders); +    ReadGlobalSetting(Settings::values.shader_backend);      ReadGlobalSetting(Settings::values.use_asynchronous_shaders);      ReadGlobalSetting(Settings::values.use_fast_gpu_time);      ReadGlobalSetting(Settings::values.use_caches_gc); @@ -824,6 +824,8 @@ void Config::ReadRendererValues() {      if (global) {          ReadBasicSetting(Settings::values.renderer_debug); +        ReadBasicSetting(Settings::values.enable_nsight_aftermath); +        ReadBasicSetting(Settings::values.disable_shader_loop_safety_checks);      }      qt_config->endGroup(); @@ -1343,7 +1345,10 @@ void Config::SaveRendererValues() {      WriteGlobalSetting(Settings::values.use_nvdec_emulation);      WriteGlobalSetting(Settings::values.accelerate_astc);      WriteGlobalSetting(Settings::values.use_vsync); -    WriteGlobalSetting(Settings::values.use_assembly_shaders); +    WriteSetting(QString::fromStdString(Settings::values.shader_backend.GetLabel()), +                 static_cast<u32>(Settings::values.shader_backend.GetValue(global)), +                 static_cast<u32>(Settings::values.shader_backend.GetDefault()), +                 Settings::values.shader_backend.UsingGlobal());      WriteGlobalSetting(Settings::values.use_asynchronous_shaders);      WriteGlobalSetting(Settings::values.use_fast_gpu_time);      WriteGlobalSetting(Settings::values.use_caches_gc); @@ -1353,6 +1358,8 @@ void Config::SaveRendererValues() {      if (global) {          WriteBasicSetting(Settings::values.renderer_debug); +        WriteBasicSetting(Settings::values.enable_nsight_aftermath); +        WriteBasicSetting(Settings::values.disable_shader_loop_safety_checks);      }      qt_config->endGroup(); diff --git a/src/yuzu/configuration/config.h b/src/yuzu/configuration/config.h index 96f9b6de1..4bbb9f1cd 100644 --- a/src/yuzu/configuration/config.h +++ b/src/yuzu/configuration/config.h @@ -180,5 +180,6 @@ private:  // These metatype declarations cannot be in common/settings.h because core is devoid of QT  Q_DECLARE_METATYPE(Settings::CPUAccuracy); -Q_DECLARE_METATYPE(Settings::RendererBackend);  Q_DECLARE_METATYPE(Settings::GPUAccuracy); +Q_DECLARE_METATYPE(Settings::RendererBackend); +Q_DECLARE_METATYPE(Settings::ShaderBackend); diff --git a/src/yuzu/configuration/configure_debug.cpp b/src/yuzu/configuration/configure_debug.cpp index 8fceb3878..f7e29dbd7 100644 --- a/src/yuzu/configuration/configure_debug.cpp +++ b/src/yuzu/configuration/configure_debug.cpp @@ -45,8 +45,13 @@ void ConfigureDebug::SetConfiguration() {      ui->enable_graphics_debugging->setChecked(Settings::values.renderer_debug.GetValue());      ui->enable_cpu_debugging->setEnabled(runtime_lock);      ui->enable_cpu_debugging->setChecked(Settings::values.cpu_debug_mode.GetValue()); +    ui->enable_nsight_aftermath->setEnabled(runtime_lock); +    ui->enable_nsight_aftermath->setChecked(Settings::values.enable_nsight_aftermath.GetValue());      ui->disable_macro_jit->setEnabled(runtime_lock);      ui->disable_macro_jit->setChecked(Settings::values.disable_macro_jit.GetValue()); +    ui->disable_loop_safety_checks->setEnabled(runtime_lock); +    ui->disable_loop_safety_checks->setChecked( +        Settings::values.disable_shader_loop_safety_checks.GetValue());      ui->extended_logging->setChecked(Settings::values.extended_logging.GetValue());  } @@ -61,6 +66,9 @@ void ConfigureDebug::ApplyConfiguration() {      Settings::values.use_auto_stub = ui->use_auto_stub->isChecked();      Settings::values.renderer_debug = ui->enable_graphics_debugging->isChecked();      Settings::values.cpu_debug_mode = ui->enable_cpu_debugging->isChecked(); +    Settings::values.enable_nsight_aftermath = ui->enable_nsight_aftermath->isChecked(); +    Settings::values.disable_shader_loop_safety_checks = +        ui->disable_loop_safety_checks->isChecked();      Settings::values.disable_macro_jit = ui->disable_macro_jit->isChecked();      Settings::values.extended_logging = ui->extended_logging->isChecked();      Debugger::ToggleConsole(); diff --git a/src/yuzu/configuration/configure_debug.ui b/src/yuzu/configuration/configure_debug.ui index 1260ad6f0..c8baf2921 100644 --- a/src/yuzu/configuration/configure_debug.ui +++ b/src/yuzu/configuration/configure_debug.ui @@ -126,6 +126,16 @@         </widget>        </item>        <item> +       <widget class="QCheckBox" name="enable_nsight_aftermath"> +        <property name="toolTip"> +         <string>When checked, it enables Nsight Aftermath crash dumps</string> +        </property> +        <property name="text"> +         <string>Enable Nsight Aftermath</string> +        </property> +       </widget> +      </item> +      <item>         <widget class="QCheckBox" name="disable_macro_jit">          <property name="enabled">           <bool>true</bool> @@ -138,6 +148,16 @@          </property>         </widget>        </item> +      <item> +       <widget class="QCheckBox" name="disable_loop_safety_checks"> +        <property name="toolTip"> +         <string>When checked, it executes shaders without loop logic changes</string> +        </property> +        <property name="text"> +         <string>Disable Loop safety checks</string> +        </property> +       </widget> +      </item>       </layout>      </widget>     </item> @@ -252,11 +272,17 @@   <tabstops>    <tabstop>log_filter_edit</tabstop>    <tabstop>toggle_console</tabstop> +  <tabstop>extended_logging</tabstop>    <tabstop>open_log_button</tabstop>    <tabstop>homebrew_args_edit</tabstop>    <tabstop>enable_graphics_debugging</tabstop> +  <tabstop>enable_nsight_aftermath</tabstop> +  <tabstop>disable_macro_jit</tabstop> +  <tabstop>disable_loop_safety_checks</tabstop>    <tabstop>reporting_services</tabstop>    <tabstop>quest_flag</tabstop> +  <tabstop>use_debug_asserts</tabstop> +  <tabstop>use_auto_stub</tabstop>   </tabstops>   <resources/>   <connections/> diff --git a/src/yuzu/configuration/configure_graphics.cpp b/src/yuzu/configuration/configure_graphics.cpp index 4d5b4c0e6..fef211707 100644 --- a/src/yuzu/configuration/configure_graphics.cpp +++ b/src/yuzu/configuration/configure_graphics.cpp @@ -26,19 +26,29 @@ ConfigureGraphics::ConfigureGraphics(QWidget* parent)      ui->setupUi(this); +    for (const auto& device : vulkan_devices) { +        ui->device->addItem(device); +    } + +    ui->backend->addItem(QStringLiteral("GLSL")); +    ui->backend->addItem(tr("GLASM (NVIDIA Only)")); +    ui->backend->addItem(QStringLiteral("SPIR-V (Experimental, Mesa Only)")); +      SetupPerGameUI();      SetConfiguration();      connect(ui->api, qOverload<int>(&QComboBox::currentIndexChanged), this, [this] { -        UpdateDeviceComboBox(); +        UpdateAPILayout();          if (!Settings::IsConfiguringGlobal()) {              ConfigurationShared::SetHighlight( -                ui->api_layout, ui->api->currentIndex() != ConfigurationShared::USE_GLOBAL_INDEX); +                ui->api_widget, ui->api->currentIndex() != ConfigurationShared::USE_GLOBAL_INDEX);          }      });      connect(ui->device, qOverload<int>(&QComboBox::activated), this,              [this](int device) { UpdateDeviceSelection(device); }); +    connect(ui->backend, qOverload<int>(&QComboBox::activated), this, +            [this](int backend) { UpdateShaderBackendSelection(backend); });      connect(ui->bg_button, &QPushButton::clicked, this, [this] {          const QColor new_bg_color = QColorDialog::getColor(bg_color); @@ -61,12 +71,21 @@ void ConfigureGraphics::UpdateDeviceSelection(int device) {      }  } +void ConfigureGraphics::UpdateShaderBackendSelection(int backend) { +    if (backend == -1) { +        return; +    } +    if (GetCurrentGraphicsBackend() == Settings::RendererBackend::OpenGL) { +        shader_backend = static_cast<Settings::ShaderBackend>(backend); +    } +} +  ConfigureGraphics::~ConfigureGraphics() = default;  void ConfigureGraphics::SetConfiguration() {      const bool runtime_lock = !Core::System::GetInstance().IsPoweredOn(); -    ui->api->setEnabled(runtime_lock); +    ui->api_widget->setEnabled(runtime_lock);      ui->use_asynchronous_gpu_emulation->setEnabled(runtime_lock);      ui->use_disk_shader_cache->setEnabled(runtime_lock);      ui->use_nvdec_emulation->setEnabled(runtime_lock); @@ -83,7 +102,7 @@ void ConfigureGraphics::SetConfiguration() {          ui->aspect_ratio_combobox->setCurrentIndex(Settings::values.aspect_ratio.GetValue());      } else {          ConfigurationShared::SetPerGameSetting(ui->api, &Settings::values.renderer_backend); -        ConfigurationShared::SetHighlight(ui->api_layout, +        ConfigurationShared::SetHighlight(ui->api_widget,                                            !Settings::values.renderer_backend.UsingGlobal());          ConfigurationShared::SetPerGameSetting(ui->fullscreen_mode_combobox, @@ -100,11 +119,10 @@ void ConfigureGraphics::SetConfiguration() {          ui->bg_button->setEnabled(!Settings::values.bg_red.UsingGlobal());          ConfigurationShared::SetHighlight(ui->bg_layout, !Settings::values.bg_red.UsingGlobal());      } -      UpdateBackgroundColorButton(QColor::fromRgb(Settings::values.bg_red.GetValue(),                                                  Settings::values.bg_green.GetValue(),                                                  Settings::values.bg_blue.GetValue())); -    UpdateDeviceComboBox(); +    UpdateAPILayout();  }  void ConfigureGraphics::ApplyConfiguration() { @@ -128,6 +146,9 @@ void ConfigureGraphics::ApplyConfiguration() {          if (Settings::values.renderer_backend.UsingGlobal()) {              Settings::values.renderer_backend.SetValue(GetCurrentGraphicsBackend());          } +        if (Settings::values.shader_backend.UsingGlobal()) { +            Settings::values.shader_backend.SetValue(shader_backend); +        }          if (Settings::values.vulkan_device.UsingGlobal()) {              Settings::values.vulkan_device.SetValue(vulkan_device);          } @@ -139,15 +160,22 @@ void ConfigureGraphics::ApplyConfiguration() {      } else {          if (ui->api->currentIndex() == ConfigurationShared::USE_GLOBAL_INDEX) {              Settings::values.renderer_backend.SetGlobal(true); +            Settings::values.shader_backend.SetGlobal(true);              Settings::values.vulkan_device.SetGlobal(true);          } else {              Settings::values.renderer_backend.SetGlobal(false);              Settings::values.renderer_backend.SetValue(GetCurrentGraphicsBackend()); -            if (GetCurrentGraphicsBackend() == Settings::RendererBackend::Vulkan) { +            switch (GetCurrentGraphicsBackend()) { +            case Settings::RendererBackend::OpenGL: +                Settings::values.shader_backend.SetGlobal(false); +                Settings::values.vulkan_device.SetGlobal(true); +                Settings::values.shader_backend.SetValue(shader_backend); +                break; +            case Settings::RendererBackend::Vulkan: +                Settings::values.shader_backend.SetGlobal(true);                  Settings::values.vulkan_device.SetGlobal(false);                  Settings::values.vulkan_device.SetValue(vulkan_device); -            } else { -                Settings::values.vulkan_device.SetGlobal(true); +                break;              }          } @@ -188,32 +216,32 @@ void ConfigureGraphics::UpdateBackgroundColorButton(QColor color) {      ui->bg_button->setIcon(color_icon);  } -void ConfigureGraphics::UpdateDeviceComboBox() { -    ui->device->clear(); - -    bool enabled = false; - +void ConfigureGraphics::UpdateAPILayout() {      if (!Settings::IsConfiguringGlobal() &&          ui->api->currentIndex() == ConfigurationShared::USE_GLOBAL_INDEX) { +        vulkan_device = Settings::values.vulkan_device.GetValue(true); +        shader_backend = Settings::values.shader_backend.GetValue(true); +        ui->device_widget->setEnabled(false); +        ui->backend_widget->setEnabled(false); +    } else {          vulkan_device = Settings::values.vulkan_device.GetValue(); +        shader_backend = Settings::values.shader_backend.GetValue(); +        ui->device_widget->setEnabled(true); +        ui->backend_widget->setEnabled(true);      } +      switch (GetCurrentGraphicsBackend()) {      case Settings::RendererBackend::OpenGL: -        ui->device->addItem(tr("OpenGL Graphics Device")); -        enabled = false; +        ui->backend->setCurrentIndex(static_cast<u32>(shader_backend)); +        ui->device_widget->setVisible(false); +        ui->backend_widget->setVisible(true);          break;      case Settings::RendererBackend::Vulkan: -        for (const auto& device : vulkan_devices) { -            ui->device->addItem(device); -        }          ui->device->setCurrentIndex(vulkan_device); -        enabled = !vulkan_devices.empty(); +        ui->device_widget->setVisible(true); +        ui->backend_widget->setVisible(false);          break;      } -    // If in per-game config and use global is selected, don't enable. -    enabled &= !(!Settings::IsConfiguringGlobal() && -                 ui->api->currentIndex() == ConfigurationShared::USE_GLOBAL_INDEX); -    ui->device->setEnabled(enabled && !Core::System::GetInstance().IsPoweredOn());  }  void ConfigureGraphics::RetrieveVulkanDevices() try { diff --git a/src/yuzu/configuration/configure_graphics.h b/src/yuzu/configuration/configure_graphics.h index 6418115cf..c866b911b 100644 --- a/src/yuzu/configuration/configure_graphics.h +++ b/src/yuzu/configuration/configure_graphics.h @@ -34,8 +34,9 @@ private:      void SetConfiguration();      void UpdateBackgroundColorButton(QColor color); -    void UpdateDeviceComboBox(); +    void UpdateAPILayout();      void UpdateDeviceSelection(int device); +    void UpdateShaderBackendSelection(int backend);      void RetrieveVulkanDevices(); @@ -53,4 +54,5 @@ private:      std::vector<QString> vulkan_devices;      u32 vulkan_device{}; +    Settings::ShaderBackend shader_backend{};  }; diff --git a/src/yuzu/configuration/configure_graphics.ui b/src/yuzu/configuration/configure_graphics.ui index 5b999d84d..099ddbb7c 100644 --- a/src/yuzu/configuration/configure_graphics.ui +++ b/src/yuzu/configuration/configure_graphics.ui @@ -23,7 +23,7 @@         </property>         <layout class="QVBoxLayout" name="verticalLayout_3">          <item> -         <widget class="QWidget" name="api_layout" native="true"> +         <widget class="QWidget" name="api_widget" native="true">            <layout class="QGridLayout" name="gridLayout">             <property name="leftMargin">              <number>0</number> @@ -40,37 +40,107 @@             <property name="horizontalSpacing">              <number>6</number>             </property> -           <item row="0" column="0"> -            <widget class="QLabel" name="api_label"> -             <property name="text"> -              <string>API:</string> -             </property> +           <item row="4" column="0"> +            <widget class="QWidget" name="backend_widget" native="true"> +             <layout class="QHBoxLayout" name="backend_layout"> +              <property name="leftMargin"> +               <number>0</number> +              </property> +              <property name="topMargin"> +               <number>0</number> +              </property> +              <property name="rightMargin"> +               <number>0</number> +              </property> +              <property name="bottomMargin"> +               <number>0</number> +              </property> +              <item> +               <widget class="QLabel" name="backend_label"> +                <property name="text"> +                 <string>Shader Backend:</string> +                </property> +               </widget> +              </item> +              <item> +               <widget class="QComboBox" name="backend"/> +              </item> +             </layout>              </widget>             </item> -           <item row="0" column="1"> -            <widget class="QComboBox" name="api"> -             <item> -              <property name="text"> -               <string notr="true">OpenGL</string> +           <item row="2" column="0"> +            <widget class="QWidget" name="device_widget" native="true"> +             <layout class="QHBoxLayout" name="device_layout"> +              <property name="leftMargin"> +               <number>0</number>                </property> -             </item> -             <item> -              <property name="text"> -               <string notr="true">Vulkan</string> +              <property name="topMargin"> +               <number>0</number>                </property> -             </item> +              <property name="rightMargin"> +               <number>0</number> +              </property> +              <property name="bottomMargin"> +               <number>0</number> +              </property> +              <item> +               <widget class="QLabel" name="device_label"> +                <property name="text"> +                 <string>Device:</string> +                </property> +               </widget> +              </item> +              <item> +               <widget class="QComboBox" name="device"/> +              </item> +             </layout>              </widget>             </item> -           <item row="1" column="0"> -            <widget class="QLabel" name="device_label"> -             <property name="text"> -              <string>Device:</string> -             </property> +           <item row="0" column="0"> +            <widget class="QWidget" name="api_layout_2" native="true"> +             <layout class="QHBoxLayout" name="api_layout"> +              <property name="leftMargin"> +               <number>0</number> +              </property> +              <property name="topMargin"> +               <number>0</number> +              </property> +              <property name="rightMargin"> +               <number>0</number> +              </property> +              <property name="bottomMargin"> +               <number>0</number> +              </property> +              <item> +               <widget class="QLabel" name="api_label"> +                <property name="text"> +                 <string>API:</string> +                </property> +               </widget> +              </item> +              <item> +               <widget class="QComboBox" name="api"> +                <property name="sizePolicy"> +                 <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> +                  <horstretch>0</horstretch> +                  <verstretch>0</verstretch> +                 </sizepolicy> +                </property> +                <item> +                 <property name="text"> +                  <string notr="true">OpenGL</string> +                 </property> +                </item> +                <item> +                 <property name="text"> +                  <string notr="true">Vulkan</string> +                 </property> +                </item> +               </widget> +              </item> +             </layout>              </widget>             </item> -           <item row="1" column="1"> -            <widget class="QComboBox" name="device"/> -           </item>            </layout>           </widget>          </item> diff --git a/src/yuzu/configuration/configure_graphics_advanced.cpp b/src/yuzu/configuration/configure_graphics_advanced.cpp index a9e611125..38276feb1 100644 --- a/src/yuzu/configuration/configure_graphics_advanced.cpp +++ b/src/yuzu/configuration/configure_graphics_advanced.cpp @@ -23,12 +23,10 @@ ConfigureGraphicsAdvanced::~ConfigureGraphicsAdvanced() = default;  void ConfigureGraphicsAdvanced::SetConfiguration() {      const bool runtime_lock = !Core::System::GetInstance().IsPoweredOn();      ui->use_vsync->setEnabled(runtime_lock); -    ui->use_assembly_shaders->setEnabled(runtime_lock);      ui->use_asynchronous_shaders->setEnabled(runtime_lock);      ui->anisotropic_filtering_combobox->setEnabled(runtime_lock);      ui->use_vsync->setChecked(Settings::values.use_vsync.GetValue()); -    ui->use_assembly_shaders->setChecked(Settings::values.use_assembly_shaders.GetValue());      ui->use_asynchronous_shaders->setChecked(Settings::values.use_asynchronous_shaders.GetValue());      ui->use_caches_gc->setChecked(Settings::values.use_caches_gc.GetValue());      ui->use_fast_gpu_time->setChecked(Settings::values.use_fast_gpu_time.GetValue()); @@ -58,8 +56,6 @@ void ConfigureGraphicsAdvanced::ApplyConfiguration() {      ConfigurationShared::ApplyPerGameSetting(&Settings::values.max_anisotropy,                                               ui->anisotropic_filtering_combobox);      ConfigurationShared::ApplyPerGameSetting(&Settings::values.use_vsync, ui->use_vsync, use_vsync); -    ConfigurationShared::ApplyPerGameSetting(&Settings::values.use_assembly_shaders, -                                             ui->use_assembly_shaders, use_assembly_shaders);      ConfigurationShared::ApplyPerGameSetting(&Settings::values.use_asynchronous_shaders,                                               ui->use_asynchronous_shaders,                                               use_asynchronous_shaders); @@ -100,7 +96,6 @@ void ConfigureGraphicsAdvanced::SetupPerGameUI() {      if (Settings::IsConfiguringGlobal()) {          ui->gpu_accuracy->setEnabled(Settings::values.gpu_accuracy.UsingGlobal());          ui->use_vsync->setEnabled(Settings::values.use_vsync.UsingGlobal()); -        ui->use_assembly_shaders->setEnabled(Settings::values.use_assembly_shaders.UsingGlobal());          ui->use_asynchronous_shaders->setEnabled(              Settings::values.use_asynchronous_shaders.UsingGlobal());          ui->use_fast_gpu_time->setEnabled(Settings::values.use_fast_gpu_time.UsingGlobal()); @@ -112,8 +107,6 @@ void ConfigureGraphicsAdvanced::SetupPerGameUI() {      }      ConfigurationShared::SetColoredTristate(ui->use_vsync, Settings::values.use_vsync, use_vsync); -    ConfigurationShared::SetColoredTristate( -        ui->use_assembly_shaders, Settings::values.use_assembly_shaders, use_assembly_shaders);      ConfigurationShared::SetColoredTristate(ui->use_asynchronous_shaders,                                              Settings::values.use_asynchronous_shaders,                                              use_asynchronous_shaders); diff --git a/src/yuzu/configuration/configure_graphics_advanced.h b/src/yuzu/configuration/configure_graphics_advanced.h index 9148aacf2..7356e6916 100644 --- a/src/yuzu/configuration/configure_graphics_advanced.h +++ b/src/yuzu/configuration/configure_graphics_advanced.h @@ -35,7 +35,6 @@ private:      std::unique_ptr<Ui::ConfigureGraphicsAdvanced> ui;      ConfigurationShared::CheckState use_vsync; -    ConfigurationShared::CheckState use_assembly_shaders;      ConfigurationShared::CheckState use_asynchronous_shaders;      ConfigurationShared::CheckState use_fast_gpu_time;      ConfigurationShared::CheckState use_caches_gc; diff --git a/src/yuzu/configuration/configure_graphics_advanced.ui b/src/yuzu/configuration/configure_graphics_advanced.ui index ad0840355..379dc5d2e 100644 --- a/src/yuzu/configuration/configure_graphics_advanced.ui +++ b/src/yuzu/configuration/configure_graphics_advanced.ui @@ -77,22 +77,12 @@           </widget>          </item>          <item> -         <widget class="QCheckBox" name="use_assembly_shaders"> -          <property name="toolTip"> -           <string>Enabling this reduces shader stutter. Enables OpenGL assembly shaders on supported Nvidia devices (NV_gpu_program5 is required). This feature is experimental.</string> -          </property> -          <property name="text"> -           <string>Use assembly shaders (experimental, Nvidia OpenGL only)</string> -          </property> -         </widget> -        </item> -        <item>           <widget class="QCheckBox" name="use_asynchronous_shaders">            <property name="toolTip">             <string>Enables asynchronous shader compilation, which may reduce shader stutter. This feature is experimental.</string>            </property>            <property name="text"> -           <string>Use asynchronous shader building (experimental)</string> +           <string>Use asynchronous shader building</string>            </property>           </widget>          </item> @@ -144,22 +134,22 @@               </item>               <item>                <property name="text"> -               <string>2x</string> +               <string>2x (WILL BREAK THINGS)</string>                </property>               </item>               <item>                <property name="text"> -               <string>4x</string> +               <string>4x (WILL BREAK THINGS)</string>                </property>               </item>               <item>                <property name="text"> -               <string>8x</string> +               <string>8x (WILL BREAK THINGS)</string>                </property>               </item>               <item>                <property name="text"> -               <string>16x</string> +               <string>16x (WILL BREAK THINGS)</string>                </property>               </item>              </widget> diff --git a/src/yuzu/game_list.cpp b/src/yuzu/game_list.cpp index 76c063c97..f746bd85d 100644 --- a/src/yuzu/game_list.cpp +++ b/src/yuzu/game_list.cpp @@ -520,9 +520,11 @@ void GameList::AddGamePopup(QMenu& context_menu, u64 program_id, const std::stri      QMenu* remove_menu = context_menu.addMenu(tr("Remove"));      QAction* remove_update = remove_menu->addAction(tr("Remove Installed Update"));      QAction* remove_dlc = remove_menu->addAction(tr("Remove All Installed DLC")); -    QAction* remove_shader_cache = remove_menu->addAction(tr("Remove Shader Cache"));      QAction* remove_custom_config = remove_menu->addAction(tr("Remove Custom Configuration")); +    QAction* remove_gl_shader_cache = remove_menu->addAction(tr("Remove OpenGL Shader Cache")); +    QAction* remove_vk_shader_cache = remove_menu->addAction(tr("Remove Vulkan Shader Cache"));      remove_menu->addSeparator(); +    QAction* remove_shader_cache = remove_menu->addAction(tr("Remove All Shader Caches"));      QAction* remove_all_content = remove_menu->addAction(tr("Remove All Installed Contents"));      QMenu* dump_romfs_menu = context_menu.addMenu(tr("Dump RomFS"));      QAction* dump_romfs = dump_romfs_menu->addAction(tr("Dump RomFS")); @@ -540,6 +542,8 @@ void GameList::AddGamePopup(QMenu& context_menu, u64 program_id, const std::stri      open_transferable_shader_cache->setVisible(program_id != 0);      remove_update->setVisible(program_id != 0);      remove_dlc->setVisible(program_id != 0); +    remove_gl_shader_cache->setVisible(program_id != 0); +    remove_vk_shader_cache->setVisible(program_id != 0);      remove_shader_cache->setVisible(program_id != 0);      remove_all_content->setVisible(program_id != 0);      auto it = FindMatchingCompatibilityEntry(compatibility_list, program_id); @@ -569,8 +573,14 @@ void GameList::AddGamePopup(QMenu& context_menu, u64 program_id, const std::stri      connect(remove_dlc, &QAction::triggered, [this, program_id]() {          emit RemoveInstalledEntryRequested(program_id, InstalledEntryType::AddOnContent);      }); +    connect(remove_gl_shader_cache, &QAction::triggered, [this, program_id, path]() { +        emit RemoveFileRequested(program_id, GameListRemoveTarget::GlShaderCache, path); +    }); +    connect(remove_vk_shader_cache, &QAction::triggered, [this, program_id, path]() { +        emit RemoveFileRequested(program_id, GameListRemoveTarget::VkShaderCache, path); +    });      connect(remove_shader_cache, &QAction::triggered, [this, program_id, path]() { -        emit RemoveFileRequested(program_id, GameListRemoveTarget::ShaderCache, path); +        emit RemoveFileRequested(program_id, GameListRemoveTarget::AllShaderCache, path);      });      connect(remove_custom_config, &QAction::triggered, [this, program_id, path]() {          emit RemoveFileRequested(program_id, GameListRemoveTarget::CustomConfiguration, path); diff --git a/src/yuzu/game_list.h b/src/yuzu/game_list.h index c9a9f4654..10339dcca 100644 --- a/src/yuzu/game_list.h +++ b/src/yuzu/game_list.h @@ -41,7 +41,9 @@ enum class GameListOpenTarget {  };  enum class GameListRemoveTarget { -    ShaderCache, +    GlShaderCache, +    VkShaderCache, +    AllShaderCache,      CustomConfiguration,  }; diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp index 5ddce2261..e97bfd976 100644 --- a/src/yuzu/main.cpp +++ b/src/yuzu/main.cpp @@ -1654,35 +1654,15 @@ void GMainWindow::OnGameListOpenFolder(u64 program_id, GameListOpenTarget target  void GMainWindow::OnTransferableShaderCacheOpenFile(u64 program_id) {      const auto shader_cache_dir = Common::FS::GetYuzuPath(Common::FS::YuzuPath::ShaderDir); -    const auto transferable_shader_cache_folder_path = shader_cache_dir / "opengl" / "transferable"; -    const auto transferable_shader_cache_file_path = -        transferable_shader_cache_folder_path / fmt::format("{:016X}.bin", program_id); - -    if (!Common::FS::Exists(transferable_shader_cache_file_path)) { +    const auto shader_cache_folder_path{shader_cache_dir / fmt::format("{:016x}", program_id)}; +    if (!Common::FS::CreateDirs(shader_cache_folder_path)) {          QMessageBox::warning(this, tr("Error Opening Transferable Shader Cache"), -                             tr("A shader cache for this title does not exist.")); +                             tr("Filed to create the shader cache directory for this title."));          return;      } - -    const auto qt_shader_cache_folder_path = -        QString::fromStdString(Common::FS::PathToUTF8String(transferable_shader_cache_folder_path)); -    const auto qt_shader_cache_file_path = -        QString::fromStdString(Common::FS::PathToUTF8String(transferable_shader_cache_file_path)); - -    // Windows supports opening a folder with selecting a specified file in explorer. On every other -    // OS we just open the transferable shader cache folder without preselecting the transferable -    // shader cache file for the selected game. -#if defined(Q_OS_WIN) -    const QString explorer = QStringLiteral("explorer"); -    QStringList param; -    if (!QFileInfo(qt_shader_cache_file_path).isDir()) { -        param << QStringLiteral("/select,"); -    } -    param << QDir::toNativeSeparators(qt_shader_cache_file_path); -    QProcess::startDetached(explorer, param); -#else -    QDesktopServices::openUrl(QUrl::fromLocalFile(qt_shader_cache_folder_path)); -#endif +    const auto shader_path_string{Common::FS::PathToUTF8String(shader_cache_folder_path)}; +    const auto qt_shader_cache_path = QString::fromStdString(shader_path_string); +    QDesktopServices::openUrl(QUrl::fromLocalFile(qt_shader_cache_path));  }  static std::size_t CalculateRomFSEntrySize(const FileSys::VirtualDir& dir, bool full) { @@ -1825,8 +1805,12 @@ void GMainWindow::OnGameListRemoveFile(u64 program_id, GameListRemoveTarget targ                                         const std::string& game_path) {      const QString question = [this, target] {          switch (target) { -        case GameListRemoveTarget::ShaderCache: -            return tr("Delete Transferable Shader Cache?"); +        case GameListRemoveTarget::GlShaderCache: +            return tr("Delete OpenGL Transferable Shader Cache?"); +        case GameListRemoveTarget::VkShaderCache: +            return tr("Delete Vulkan Transferable Shader Cache?"); +        case GameListRemoveTarget::AllShaderCache: +            return tr("Delete All Transferable Shader Caches?");          case GameListRemoveTarget::CustomConfiguration:              return tr("Remove Custom Game Configuration?");          default: @@ -1840,8 +1824,12 @@ void GMainWindow::OnGameListRemoveFile(u64 program_id, GameListRemoveTarget targ      }      switch (target) { -    case GameListRemoveTarget::ShaderCache: -        RemoveTransferableShaderCache(program_id); +    case GameListRemoveTarget::GlShaderCache: +    case GameListRemoveTarget::VkShaderCache: +        RemoveTransferableShaderCache(program_id, target); +        break; +    case GameListRemoveTarget::AllShaderCache: +        RemoveAllTransferableShaderCaches(program_id);          break;      case GameListRemoveTarget::CustomConfiguration:          RemoveCustomConfiguration(program_id, game_path); @@ -1849,18 +1837,27 @@ void GMainWindow::OnGameListRemoveFile(u64 program_id, GameListRemoveTarget targ      }  } -void GMainWindow::RemoveTransferableShaderCache(u64 program_id) { +void GMainWindow::RemoveTransferableShaderCache(u64 program_id, GameListRemoveTarget target) { +    const auto target_file_name = [target] { +        switch (target) { +        case GameListRemoveTarget::GlShaderCache: +            return "opengl.bin"; +        case GameListRemoveTarget::VkShaderCache: +            return "vulkan.bin"; +        default: +            return ""; +        } +    }();      const auto shader_cache_dir = Common::FS::GetYuzuPath(Common::FS::YuzuPath::ShaderDir); -    const auto transferable_shader_cache_file_path = -        shader_cache_dir / "opengl" / "transferable" / fmt::format("{:016X}.bin", program_id); +    const auto shader_cache_folder_path = shader_cache_dir / fmt::format("{:016x}", program_id); +    const auto target_file = shader_cache_folder_path / target_file_name; -    if (!Common::FS::Exists(transferable_shader_cache_file_path)) { +    if (!Common::FS::Exists(target_file)) {          QMessageBox::warning(this, tr("Error Removing Transferable Shader Cache"),                               tr("A shader cache for this title does not exist."));          return;      } - -    if (Common::FS::RemoveFile(transferable_shader_cache_file_path)) { +    if (Common::FS::RemoveFile(target_file)) {          QMessageBox::information(this, tr("Successfully Removed"),                                   tr("Successfully removed the transferable shader cache."));      } else { @@ -1869,6 +1866,24 @@ void GMainWindow::RemoveTransferableShaderCache(u64 program_id) {      }  } +void GMainWindow::RemoveAllTransferableShaderCaches(u64 program_id) { +    const auto shader_cache_dir = Common::FS::GetYuzuPath(Common::FS::YuzuPath::ShaderDir); +    const auto program_shader_cache_dir = shader_cache_dir / fmt::format("{:016x}", program_id); + +    if (!Common::FS::Exists(program_shader_cache_dir)) { +        QMessageBox::warning(this, tr("Error Removing Transferable Shader Caches"), +                             tr("A shader cache for this title does not exist.")); +        return; +    } +    if (Common::FS::RemoveDirRecursively(program_shader_cache_dir)) { +        QMessageBox::information(this, tr("Successfully Removed"), +                                 tr("Successfully removed the transferable shader caches.")); +    } else { +        QMessageBox::warning(this, tr("Error Removing Transferable Shader Caches"), +                             tr("Failed to remove the transferable shader cache directory.")); +    } +} +  void GMainWindow::RemoveCustomConfiguration(u64 program_id, const std::string& game_path) {      const auto file_path = std::filesystem::path(Common::FS::ToU8String(game_path));      const auto config_file_name = @@ -2900,13 +2915,13 @@ void GMainWindow::UpdateStatusBar() {          return;      } -    auto results = Core::System::GetInstance().GetAndResetPerfStats(); -    auto& shader_notify = Core::System::GetInstance().GPU().ShaderNotify(); -    const auto shaders_building = shader_notify.GetShadersBuilding(); +    auto& system = Core::System::GetInstance(); +    auto results = system.GetAndResetPerfStats(); +    auto& shader_notify = system.GPU().ShaderNotify(); +    const int shaders_building = shader_notify.ShadersBuilding(); -    if (shaders_building != 0) { -        shader_building_label->setText( -            tr("Building: %n shader(s)", "", static_cast<int>(shaders_building))); +    if (shaders_building > 0) { +        shader_building_label->setText(tr("Building: %n shader(s)", "", shaders_building));          shader_building_label->setVisible(true);      } else {          shader_building_label->setVisible(false); diff --git a/src/yuzu/main.h b/src/yuzu/main.h index a50e5b9fe..3eb6aed56 100644 --- a/src/yuzu/main.h +++ b/src/yuzu/main.h @@ -282,7 +282,8 @@ private:      void RemoveBaseContent(u64 program_id, const QString& entry_type);      void RemoveUpdateContent(u64 program_id, const QString& entry_type);      void RemoveAddOnContent(u64 program_id, const QString& entry_type); -    void RemoveTransferableShaderCache(u64 program_id); +    void RemoveTransferableShaderCache(u64 program_id, GameListRemoveTarget target); +    void RemoveAllTransferableShaderCaches(u64 program_id);      void RemoveCustomConfiguration(u64 program_id, const std::string& game_path);      std::optional<u64> SelectRomFSDumpTarget(const FileSys::ContentProvider&, u64 program_id);      InstallResult InstallNSPXCI(const QString& filename); | 
