Implement shader compile counter (Avalonia)

This commit is contained in:
MutantAura 2024-04-21 17:00:45 +01:00
parent ca59c3f499
commit 67b873645f
9 changed files with 81 additions and 5 deletions

View file

@ -14,6 +14,8 @@ namespace Ryujinx.Graphics.GAL
IWindow Window { get; } IWindow Window { get; }
uint ProgramCount { get; }
void BackgroundContextAction(Action action, bool alwaysBackground = false); void BackgroundContextAction(Action action, bool alwaysBackground = false);
BufferHandle CreateBuffer(int size, BufferAccess access = BufferAccess.Default); BufferHandle CreateBuffer(int size, BufferAccess access = BufferAccess.Default);

View file

@ -55,6 +55,8 @@ namespace Ryujinx.Graphics.GAL.Multithreading
private int _refProducerPtr; private int _refProducerPtr;
private int _refConsumerPtr; private int _refConsumerPtr;
public uint ProgramCount { get; set; } = 0;
private Action _interruptAction; private Action _interruptAction;
private readonly object _interruptLock = new(); private readonly object _interruptLock = new();
@ -307,6 +309,8 @@ namespace Ryujinx.Graphics.GAL.Multithreading
Programs.Add(request); Programs.Add(request);
ProgramCount++;
New<CreateProgramCommand>().Set(Ref((IProgramRequest)request)); New<CreateProgramCommand>().Set(Ref((IProgramRequest)request));
QueueCommand(); QueueCommand();

View file

@ -29,6 +29,8 @@ namespace Ryujinx.Graphics.OpenGL
private readonly Sync _sync; private readonly Sync _sync;
public uint ProgramCount { get; set; } = 0;
public event EventHandler<ScreenCaptureImageInfo> ScreenCaptured; public event EventHandler<ScreenCaptureImageInfo> ScreenCaptured;
internal PersistentBuffers PersistentBuffers { get; } internal PersistentBuffers PersistentBuffers { get; }
@ -94,6 +96,8 @@ namespace Ryujinx.Graphics.OpenGL
public IProgram CreateProgram(ShaderSource[] shaders, ShaderInfo info) public IProgram CreateProgram(ShaderSource[] shaders, ShaderInfo info)
{ {
ProgramCount++;
return new Program(shaders, info.FragmentOutputMap); return new Program(shaders, info.FragmentOutputMap);
} }

View file

@ -27,6 +27,8 @@ namespace Ryujinx.Graphics.Vulkan
private bool _initialized; private bool _initialized;
public uint ProgramCount { get; set; } = 0;
internal FormatCapabilities FormatCapabilities { get; private set; } internal FormatCapabilities FormatCapabilities { get; private set; }
internal HardwareCapabilities Capabilities; internal HardwareCapabilities Capabilities;
@ -544,6 +546,8 @@ namespace Ryujinx.Graphics.Vulkan
public IProgram CreateProgram(ShaderSource[] sources, ShaderInfo info) public IProgram CreateProgram(ShaderSource[] sources, ShaderInfo info)
{ {
ProgramCount++;
bool isCompute = sources.Length == 1 && sources[0].Stage == ShaderStage.Compute; bool isCompute = sources.Length == 1 && sources[0].Stage == ShaderStage.Compute;
if (info.State.HasValue || isCompute) if (info.State.HasValue || isCompute)

View file

@ -13,7 +13,15 @@ namespace Ryujinx.UI
public string GpuName; public string GpuName;
public string GpuBackend; public string GpuBackend;
public StatusUpdatedEventArgs(bool vSyncEnabled, float volume, string gpuBackend, string dockedMode, string aspectRatio, string gameStatus, string fifoStatus, string gpuName) public StatusUpdatedEventArgs(
bool vSyncEnabled,
float volume,
string gpuBackend,
string dockedMode,
string aspectRatio,
string gameStatus,
string fifoStatus,
string gpuName)
{ {
VSyncEnabled = vSyncEnabled; VSyncEnabled = vSyncEnabled;
Volume = volume; Volume = volume;

View file

@ -103,6 +103,10 @@ namespace Ryujinx.Ava
private CursorStates _cursorState = !ConfigurationState.Instance.Hid.EnableMouse.Value ? private CursorStates _cursorState = !ConfigurationState.Instance.Hid.EnableMouse.Value ?
CursorStates.CursorIsVisible : CursorStates.CursorIsHidden; CursorStates.CursorIsVisible : CursorStates.CursorIsHidden;
private DateTime _lastShaderReset;
private uint _displayCount;
private uint _previousCount = 0;
private bool _isStopped; private bool _isStopped;
private bool _isActive; private bool _isActive;
private bool _renderingStarted; private bool _renderingStarted;
@ -1059,6 +1063,8 @@ namespace Ryujinx.Ava
// Run a status update only when a frame is to be drawn. This prevents from updating the ui and wasting a render when no frame is queued. // Run a status update only when a frame is to be drawn. This prevents from updating the ui and wasting a render when no frame is queued.
string dockedMode = ConfigurationState.Instance.System.EnableDockedMode ? LocaleManager.Instance[LocaleKeys.Docked] : LocaleManager.Instance[LocaleKeys.Handheld]; string dockedMode = ConfigurationState.Instance.System.EnableDockedMode ? LocaleManager.Instance[LocaleKeys.Docked] : LocaleManager.Instance[LocaleKeys.Handheld];
UpdateShaderCount();
if (GraphicsConfig.ResScale != 1) if (GraphicsConfig.ResScale != 1)
{ {
dockedMode += $" ({GraphicsConfig.ResScale}x)"; dockedMode += $" ({GraphicsConfig.ResScale}x)";
@ -1070,7 +1076,8 @@ namespace Ryujinx.Ava
dockedMode, dockedMode,
ConfigurationState.Instance.Graphics.AspectRatio.Value.ToText(), ConfigurationState.Instance.Graphics.AspectRatio.Value.ToText(),
LocaleManager.Instance[LocaleKeys.Game] + $": {Device.Statistics.GetGameFrameRate():00.00} FPS ({Device.Statistics.GetGameFrameTime():00.00} ms)", LocaleManager.Instance[LocaleKeys.Game] + $": {Device.Statistics.GetGameFrameRate():00.00} FPS ({Device.Statistics.GetGameFrameTime():00.00} ms)",
$"FIFO: {Device.Statistics.GetFifoPercent():00.00} %")); $"FIFO: {Device.Statistics.GetFifoPercent():00.00} %",
_displayCount));
} }
public async Task ShowExitPrompt() public async Task ShowExitPrompt()
@ -1096,6 +1103,25 @@ namespace Ryujinx.Ava
} }
} }
private void UpdateShaderCount()
{
// If there is a mismatch between total program compile and previous count
// this means new shaders have been compiled and should be displayed.
if (_renderer.ProgramCount != _previousCount)
{
_displayCount += _renderer.ProgramCount - _previousCount;
_lastShaderReset = DateTime.Now;
_previousCount = _renderer.ProgramCount;
}
// Check if 5s has passed since any new shaders were compiled.
// If yes, reset the counter.
else if (_lastShaderReset.AddSeconds(5) <= DateTime.Now)
{
_displayCount = 0;
}
}
private bool UpdateFrame() private bool UpdateFrame()
{ {
if (!_isActive) if (!_isActive)

View file

@ -10,8 +10,9 @@ namespace Ryujinx.Ava.UI.Models
public string DockedMode { get; } public string DockedMode { get; }
public string FifoStatus { get; } public string FifoStatus { get; }
public string GameStatus { get; } public string GameStatus { get; }
public uint ShaderCount { get; }
public StatusUpdatedEventArgs(bool vSyncEnabled, string volumeStatus, string dockedMode, string aspectRatio, string gameStatus, string fifoStatus) public StatusUpdatedEventArgs(bool vSyncEnabled, string volumeStatus, string dockedMode, string aspectRatio, string gameStatus, string fifoStatus, uint shaderCount)
{ {
VSyncEnabled = vSyncEnabled; VSyncEnabled = vSyncEnabled;
VolumeStatus = volumeStatus; VolumeStatus = volumeStatus;
@ -19,6 +20,7 @@ namespace Ryujinx.Ava.UI.Models
AspectRatio = aspectRatio; AspectRatio = aspectRatio;
GameStatus = gameStatus; GameStatus = gameStatus;
FifoStatus = fifoStatus; FifoStatus = fifoStatus;
ShaderCount = shaderCount;
} }
} }
} }

View file

@ -62,6 +62,7 @@ namespace Ryujinx.Ava.UI.ViewModels
private string _gameStatusText; private string _gameStatusText;
private string _volumeStatusText; private string _volumeStatusText;
private string _gpuStatusText; private string _gpuStatusText;
private string _shaderCountText;
private bool _isAmiiboRequested; private bool _isAmiiboRequested;
private bool _isGameRunning; private bool _isGameRunning;
private bool _isFullScreen; private bool _isFullScreen;
@ -502,6 +503,17 @@ namespace Ryujinx.Ava.UI.ViewModels
} }
} }
public string ShaderCountText
{
get => _shaderCountText;
set
{
_shaderCountText = value;
OnPropertyChanged();
}
}
public string BackendText public string BackendText
{ {
get => _backendText; get => _backendText;
@ -1243,6 +1255,7 @@ namespace Ryujinx.Ava.UI.ViewModels
GameStatusText = args.GameStatus; GameStatusText = args.GameStatus;
VolumeStatusText = args.VolumeStatus; VolumeStatusText = args.VolumeStatus;
FifoStatusText = args.FifoStatus; FifoStatusText = args.FifoStatus;
ShaderCountText = args.ShaderCount > 0 ? LocaleManager.Instance[LocaleKeys.CompilingShaders] + $": {args.ShaderCount}" : "";
ShowStatusSeparator = true; ShowStatusSeparator = true;
}); });

View file

@ -270,7 +270,20 @@
VerticalAlignment="Center" VerticalAlignment="Center"
IsVisible="{Binding !ShowLoadProgress}" IsVisible="{Binding !ShowLoadProgress}"
Text="{Binding GpuNameText}" Text="{Binding GpuNameText}"
TextAlignment="Start" /> TextAlignment="Left" />
<Border
Width="2"
Height="12"
Margin="0"
BorderBrush="Gray"
BorderThickness="1"
IsVisible="{Binding !ShowLoadProgress}" />
<TextBlock
Name="ShaderCount"
Margin="5,0,5,0"
HorizontalAlignment="Left"
VerticalAlignment="Center"
Text="{Binding ShaderCountText}" />
</StackPanel> </StackPanel>
<StackPanel <StackPanel
Grid.Column="3" Grid.Column="3"