aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Graphics.Gpu/Shader/ComputeShaderCacheHashTable.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Ryujinx.Graphics.Gpu/Shader/ComputeShaderCacheHashTable.cs')
-rw-r--r--src/Ryujinx.Graphics.Gpu/Shader/ComputeShaderCacheHashTable.cs70
1 files changed, 70 insertions, 0 deletions
diff --git a/src/Ryujinx.Graphics.Gpu/Shader/ComputeShaderCacheHashTable.cs b/src/Ryujinx.Graphics.Gpu/Shader/ComputeShaderCacheHashTable.cs
new file mode 100644
index 00000000..a6718211
--- /dev/null
+++ b/src/Ryujinx.Graphics.Gpu/Shader/ComputeShaderCacheHashTable.cs
@@ -0,0 +1,70 @@
+using Ryujinx.Graphics.Gpu.Shader.HashTable;
+using System.Collections.Generic;
+
+namespace Ryujinx.Graphics.Gpu.Shader
+{
+ /// <summary>
+ /// Compute shader cache hash table.
+ /// </summary>
+ class ComputeShaderCacheHashTable
+ {
+ private readonly PartitionedHashTable<ShaderSpecializationList> _cache;
+ private readonly List<CachedShaderProgram> _shaderPrograms;
+
+ /// <summary>
+ /// Creates a new compute shader cache hash table.
+ /// </summary>
+ public ComputeShaderCacheHashTable()
+ {
+ _cache = new PartitionedHashTable<ShaderSpecializationList>();
+ _shaderPrograms = new List<CachedShaderProgram>();
+ }
+
+ /// <summary>
+ /// Adds a program to the cache.
+ /// </summary>
+ /// <param name="program">Program to be added</param>
+ public void Add(CachedShaderProgram program)
+ {
+ var specList = _cache.GetOrAdd(program.Shaders[0].Code, new ShaderSpecializationList());
+ specList.Add(program);
+ _shaderPrograms.Add(program);
+ }
+
+ /// <summary>
+ /// Tries to find a cached program.
+ /// </summary>
+ /// <param name="channel">GPU channel</param>
+ /// <param name="poolState">Texture pool state</param>
+ /// <param name="computeState">Compute state</param>
+ /// <param name="gpuVa">GPU virtual address of the compute shader</param>
+ /// <param name="program">Cached host program for the given state, if found</param>
+ /// <param name="cachedGuestCode">Cached guest code, if any found</param>
+ /// <returns>True if a cached host program was found, false otherwise</returns>
+ public bool TryFind(
+ GpuChannel channel,
+ GpuChannelPoolState poolState,
+ GpuChannelComputeState computeState,
+ ulong gpuVa,
+ out CachedShaderProgram program,
+ out byte[] cachedGuestCode)
+ {
+ program = null;
+ ShaderCodeAccessor codeAccessor = new ShaderCodeAccessor(channel.MemoryManager, gpuVa);
+ bool hasSpecList = _cache.TryFindItem(codeAccessor, out var specList, out cachedGuestCode);
+ return hasSpecList && specList.TryFindForCompute(channel, poolState, computeState, out program);
+ }
+
+ /// <summary>
+ /// Gets all programs that have been added to the table.
+ /// </summary>
+ /// <returns>Programs added to the table</returns>
+ public IEnumerable<CachedShaderProgram> GetPrograms()
+ {
+ foreach (var program in _shaderPrograms)
+ {
+ yield return program;
+ }
+ }
+ }
+} \ No newline at end of file