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" />
+
+