From a46c92ab1d50a5639cb89165536e476bafb3bfbd Mon Sep 17 00:00:00 2001 From: ParantezTech <12572227+par274@users.noreply.github.com> Date: Thu, 8 Oct 2026 02:53:32 +0300 Subject: [PATCH] [GUI] Add the shader learning option and the precompile shaders action --- src/SharpEmu.GUI/GuiSettings.cs | 4 ++ src/SharpEmu.GUI/MainWindow.GameOptions.cs | 35 ++++++++++++ src/SharpEmu.GUI/MainWindow.axaml | 63 ++++++++++++++++++++++ src/SharpEmu.GUI/MainWindow.axaml.cs | 19 +++++-- src/SharpEmu.GUI/PerGameSettings.cs | 24 ++++++++- 5 files changed, 140 insertions(+), 5 deletions(-) diff --git a/src/SharpEmu.GUI/GuiSettings.cs b/src/SharpEmu.GUI/GuiSettings.cs index 1e48bba..5c4ba9c 100644 --- a/src/SharpEmu.GUI/GuiSettings.cs +++ b/src/SharpEmu.GUI/GuiSettings.cs @@ -78,6 +78,10 @@ public sealed class GuiSettings public bool VSync { get; set; } = true; + public bool ShaderCache { get; set; } = true; + + public bool ShaderLearn { get; set; } + public string HdrMode { get; set; } = "Auto"; public bool OverlayEnabled { get; set; } = true; diff --git a/src/SharpEmu.GUI/MainWindow.GameOptions.cs b/src/SharpEmu.GUI/MainWindow.GameOptions.cs index 2f42710..367c8f3 100644 --- a/src/SharpEmu.GUI/MainWindow.GameOptions.cs +++ b/src/SharpEmu.GUI/MainWindow.GameOptions.cs @@ -4,6 +4,7 @@ using Avalonia; using Avalonia.Controls; using Avalonia.VisualTree; +using SharpEmu.Libs.Gpu.ShaderCache; using SharpEmu.Libs.VideoOut; namespace SharpEmu.GUI; @@ -99,6 +100,8 @@ public partial class MainWindow await CopyToClipboardAsync((GameList.SelectedItem as GameEntry)?.Path); GameOptionsCopyTitleIdButton.Click += async (_, _) => await CopyToClipboardAsync((GameList.SelectedItem as GameEntry)?.TitleId); + GameOptionsClearShaderCacheButton.Click += (_, _) => ClearOpenGameShaderCache(); + GameOptionsPrecompileShadersButton.Click += (_, _) => PrecompileOpenGameShaders(); GameOptionsRemoveButton.Click += (_, _) => { CloseGameSettings(); @@ -115,6 +118,8 @@ public partial class MainWindow GameRefreshRateBox.SelectionChanged += (_, _) => PersistOpenGameSettings(); GameScalingModeBox.SelectionChanged += (_, _) => PersistOpenGameSettings(); GameVSyncToggle.IsCheckedChanged += (_, _) => PersistOpenGameSettings(); + GameShaderCacheToggle.IsCheckedChanged += (_, _) => PersistOpenGameSettings(); + GameShaderLearnToggle.IsCheckedChanged += (_, _) => PersistOpenGameSettings(); GameHdrModeBox.SelectionChanged += (_, _) => PersistOpenGameSettings(); GameOverlayEnabledToggle.IsCheckedChanged += (_, _) => PersistOpenGameSettings(); GameOverlayModeBox.SelectionChanged += (_, _) => PersistOpenGameSettings(); @@ -127,6 +132,30 @@ public partial class MainWindow SetGameOptionsSection(0, animateIndicator: false); } + private void PrecompileOpenGameShaders() + { + if (GameList.SelectedItem is not GameEntry game || _isRunning) + { + return; + } + + CloseGameSettings(); + Launch(game.Path, game.Name, game.TitleId, precompileOnly: true); + } + + private void ClearOpenGameShaderCache() + { + if (string.IsNullOrWhiteSpace(_gameSettingsTitleId)) + { + return; + } + + GameOptionsClearShaderCacheText.Text = Localization.Instance[ + ShaderCacheSettings.TryClear(_gameSettingsTitleId) + ? "Library.Context.ShaderCacheCleared" + : "Library.Context.ShaderCacheBusy"]; + } + private void OpenSelectedGameSettings() { if (GameList.SelectedItem is not GameEntry game) @@ -144,9 +173,11 @@ public partial class MainWindow _gameSettingsTitleId = game.TitleId; GameOptionsOverlay.DataContext = game; + GameOptionsClearShaderCacheText.Text = Localization.Instance["Library.Context.ClearShaderCache"]; LoadGameSettings(game.TitleId); SetGameOptionsSection(0, animateIndicator: false); GameOptionsLaunchButton.IsEnabled = !_isRunning; + GameOptionsPrecompileShadersButton.IsEnabled = !_isRunning; GameOptionsCopyTitleIdButton.IsEnabled = !string.IsNullOrWhiteSpace(game.TitleId); @@ -217,6 +248,8 @@ public partial class MainWindow effective.ScalingMode, "Fit"); GameVSyncToggle.IsChecked = effective.VSync; + GameShaderCacheToggle.IsChecked = effective.ShaderCache; + GameShaderLearnToggle.IsChecked = effective.ShaderLearn; GameOverlayEnabledToggle.IsChecked = effective.OverlayEnabled; GameOverlayModeBox.SelectedItem = FindChoice(_overlayModeChoices, effective.OverlayMode, "TitleBar"); GameOverlayCornerBox.SelectedItem = FindChoice(_overlayCornerChoices, effective.OverlayCorner, "TopRight"); @@ -283,6 +316,8 @@ public partial class MainWindow RefreshRate = SelectedGameRefreshRate(), ScalingMode = SelectedComboText(GameScalingModeBox, "Fit"), VSync = GameVSyncToggle.IsChecked == true, + ShaderCache = GameShaderCacheToggle.IsChecked == true, + ShaderLearn = GameShaderLearnToggle.IsChecked == true, HdrMode = SelectedComboText(GameHdrModeBox, "Auto"), OverlayEnabled = GameOverlayEnabledToggle.IsChecked == true, OverlayMode = SelectedComboText(GameOverlayModeBox, "TitleBar"), diff --git a/src/SharpEmu.GUI/MainWindow.axaml b/src/SharpEmu.GUI/MainWindow.axaml index 2c601fb..2e9ddcc 100644 --- a/src/SharpEmu.GUI/MainWindow.axaml +++ b/src/SharpEmu.GUI/MainWindow.axaml @@ -755,6 +755,30 @@ SPDX-License-Identifier: GPL-2.0-or-later VerticalAlignment="Center" /> + +