From cee712105850ac3385cd0091a923438167433f9f Mon Sep 17 00:00:00 2001 From: TSR Berry <20988865+TSRBerry@users.noreply.github.com> Date: Sat, 8 Apr 2023 01:22:00 +0200 Subject: Move solution and projects to src --- .../Shader/ShaderCacheHashTable.cs | 282 --------------------- 1 file changed, 282 deletions(-) delete mode 100644 Ryujinx.Graphics.Gpu/Shader/ShaderCacheHashTable.cs (limited to 'Ryujinx.Graphics.Gpu/Shader/ShaderCacheHashTable.cs') diff --git a/Ryujinx.Graphics.Gpu/Shader/ShaderCacheHashTable.cs b/Ryujinx.Graphics.Gpu/Shader/ShaderCacheHashTable.cs deleted file mode 100644 index e35c06b1..00000000 --- a/Ryujinx.Graphics.Gpu/Shader/ShaderCacheHashTable.cs +++ /dev/null @@ -1,282 +0,0 @@ -using Ryujinx.Graphics.Gpu.Memory; -using Ryujinx.Graphics.Gpu.Shader.HashTable; -using Ryujinx.Graphics.Shader; -using System; -using System.Collections.Generic; - -namespace Ryujinx.Graphics.Gpu.Shader -{ - /// - /// Holds already cached code for a guest shader. - /// - struct CachedGraphicsGuestCode - { - public byte[] VertexACode; - public byte[] VertexBCode; - public byte[] TessControlCode; - public byte[] TessEvaluationCode; - public byte[] GeometryCode; - public byte[] FragmentCode; - - /// - /// Gets the guest code of a shader stage by its index. - /// - /// Index of the shader stage - /// Guest code, or null if not present - public byte[] GetByIndex(int stageIndex) - { - return stageIndex switch - { - 1 => TessControlCode, - 2 => TessEvaluationCode, - 3 => GeometryCode, - 4 => FragmentCode, - _ => VertexBCode - }; - } - } - - /// - /// Graphics shader cache hash table. - /// - class ShaderCacheHashTable - { - /// - /// Shader ID cache. - /// - private struct IdCache - { - private PartitionedHashTable _cache; - private int _id; - - /// - /// Initializes the state. - /// - public void Initialize() - { - _cache = new PartitionedHashTable(); - _id = 0; - } - - /// - /// Adds guest code to the cache. - /// - /// - /// If the code was already cached, it will just return the existing ID. - /// - /// Code to add - /// Unique ID for the guest code - public int Add(byte[] code) - { - int id = ++_id; - int cachedId = _cache.GetOrAdd(code, id); - if (cachedId != id) - { - --_id; - } - - return cachedId; - } - - /// - /// Tries to find cached guest code. - /// - /// Code accessor used to read guest code to find a match on the hash table - /// ID of the guest code, if found - /// Cached guest code, if found - /// True if found, false otherwise - public bool TryFind(IDataAccessor dataAccessor, out int id, out byte[] data) - { - return _cache.TryFindItem(dataAccessor, out id, out data); - } - } - - /// - /// Guest code IDs of the guest shaders that when combined forms a single host program. - /// - private struct IdTable : IEquatable - { - public int VertexAId; - public int VertexBId; - public int TessControlId; - public int TessEvaluationId; - public int GeometryId; - public int FragmentId; - - public override bool Equals(object obj) - { - return obj is IdTable other && Equals(other); - } - - public bool Equals(IdTable other) - { - return other.VertexAId == VertexAId && - other.VertexBId == VertexBId && - other.TessControlId == TessControlId && - other.TessEvaluationId == TessEvaluationId && - other.GeometryId == GeometryId && - other.FragmentId == FragmentId; - } - - public override int GetHashCode() - { - return HashCode.Combine(VertexAId, VertexBId, TessControlId, TessEvaluationId, GeometryId, FragmentId); - } - } - - private IdCache _vertexACache; - private IdCache _vertexBCache; - private IdCache _tessControlCache; - private IdCache _tessEvaluationCache; - private IdCache _geometryCache; - private IdCache _fragmentCache; - - private readonly Dictionary _shaderPrograms; - - /// - /// Creates a new graphics shader cache hash table. - /// - public ShaderCacheHashTable() - { - _vertexACache.Initialize(); - _vertexBCache.Initialize(); - _tessControlCache.Initialize(); - _tessEvaluationCache.Initialize(); - _geometryCache.Initialize(); - _fragmentCache.Initialize(); - - _shaderPrograms = new Dictionary(); - } - - /// - /// Adds a program to the cache. - /// - /// Program to be added - public void Add(CachedShaderProgram program) - { - IdTable idTable = new IdTable(); - - foreach (var shader in program.Shaders) - { - if (shader == null) - { - continue; - } - - if (shader.Info != null) - { - switch (shader.Info.Stage) - { - case ShaderStage.Vertex: - idTable.VertexBId = _vertexBCache.Add(shader.Code); - break; - case ShaderStage.TessellationControl: - idTable.TessControlId = _tessControlCache.Add(shader.Code); - break; - case ShaderStage.TessellationEvaluation: - idTable.TessEvaluationId = _tessEvaluationCache.Add(shader.Code); - break; - case ShaderStage.Geometry: - idTable.GeometryId = _geometryCache.Add(shader.Code); - break; - case ShaderStage.Fragment: - idTable.FragmentId = _fragmentCache.Add(shader.Code); - break; - } - } - else - { - idTable.VertexAId = _vertexACache.Add(shader.Code); - } - } - - if (!_shaderPrograms.TryGetValue(idTable, out ShaderSpecializationList specList)) - { - specList = new ShaderSpecializationList(); - _shaderPrograms.Add(idTable, specList); - } - - specList.Add(program); - } - - /// - /// Tries to find a cached program. - /// - /// - /// Even if false is returned, might still contain cached guest code. - /// This can be used to avoid additional allocations for guest code that was already cached. - /// - /// GPU channel - /// Texture pool state - /// Graphics state - /// Guest addresses of the shaders to find - /// Cached host program for the given state, if found - /// Cached guest code, if any found - /// True if a cached host program was found, false otherwise - public bool TryFind( - GpuChannel channel, - ref GpuChannelPoolState poolState, - ref GpuChannelGraphicsState graphicsState, - ShaderAddresses addresses, - out CachedShaderProgram program, - out CachedGraphicsGuestCode guestCode) - { - var memoryManager = channel.MemoryManager; - IdTable idTable = new IdTable(); - guestCode = new CachedGraphicsGuestCode(); - - program = null; - - bool found = TryGetId(_vertexACache, memoryManager, addresses.VertexA, out idTable.VertexAId, out guestCode.VertexACode); - found &= TryGetId(_vertexBCache, memoryManager, addresses.VertexB, out idTable.VertexBId, out guestCode.VertexBCode); - found &= TryGetId(_tessControlCache, memoryManager, addresses.TessControl, out idTable.TessControlId, out guestCode.TessControlCode); - found &= TryGetId(_tessEvaluationCache, memoryManager, addresses.TessEvaluation, out idTable.TessEvaluationId, out guestCode.TessEvaluationCode); - found &= TryGetId(_geometryCache, memoryManager, addresses.Geometry, out idTable.GeometryId, out guestCode.GeometryCode); - found &= TryGetId(_fragmentCache, memoryManager, addresses.Fragment, out idTable.FragmentId, out guestCode.FragmentCode); - - if (found && _shaderPrograms.TryGetValue(idTable, out ShaderSpecializationList specList)) - { - return specList.TryFindForGraphics(channel, ref poolState, ref graphicsState, out program); - } - - return false; - } - - /// - /// Tries to get the ID of a single cached shader stage. - /// - /// ID cache of the stage - /// GPU memory manager - /// Base address of the shader - /// ID, if found - /// Cached guest code, if found - /// True if a cached shader is found, false otherwise - private static bool TryGetId(IdCache idCache, MemoryManager memoryManager, ulong baseAddress, out int id, out byte[] data) - { - if (baseAddress == 0) - { - id = 0; - data = null; - return true; - } - - ShaderCodeAccessor codeAccessor = new ShaderCodeAccessor(memoryManager, baseAddress); - return idCache.TryFind(codeAccessor, out id, out data); - } - - /// - /// Gets all programs that have been added to the table. - /// - /// Programs added to the table - public IEnumerable GetPrograms() - { - foreach (var specList in _shaderPrograms.Values) - { - foreach (var program in specList) - { - yield return program; - } - } - } - } -} \ No newline at end of file -- cgit v1.2.3