diff options
Diffstat (limited to 'src/Ryujinx.Graphics.Shader/Decoders/DecodedProgram.cs')
-rw-r--r-- | src/Ryujinx.Graphics.Shader/Decoders/DecodedProgram.cs | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/src/Ryujinx.Graphics.Shader/Decoders/DecodedProgram.cs b/src/Ryujinx.Graphics.Shader/Decoders/DecodedProgram.cs new file mode 100644 index 00000000..2dd60155 --- /dev/null +++ b/src/Ryujinx.Graphics.Shader/Decoders/DecodedProgram.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections; +using System.Collections.Generic; + +namespace Ryujinx.Graphics.Shader.Decoders +{ + readonly struct DecodedProgram : IEnumerable<DecodedFunction> + { + public DecodedFunction MainFunction { get; } + private readonly IReadOnlyDictionary<ulong, DecodedFunction> _functions; + private readonly List<DecodedFunction> _functionsWithId; + public int FunctionsWithIdCount => _functionsWithId.Count; + + public DecodedProgram(DecodedFunction mainFunction, IReadOnlyDictionary<ulong, DecodedFunction> functions) + { + MainFunction = mainFunction; + _functions = functions; + _functionsWithId = new List<DecodedFunction>(); + } + + public DecodedFunction GetFunctionByAddress(ulong address) + { + if (_functions.TryGetValue(address, out DecodedFunction function)) + { + return function; + } + + return null; + } + + public DecodedFunction GetFunctionById(int id) + { + if ((uint)id >= (uint)_functionsWithId.Count) + { + throw new ArgumentOutOfRangeException(nameof(id)); + } + + return _functionsWithId[id]; + } + + public void AddFunctionAndSetId(DecodedFunction function) + { + function.Id = _functionsWithId.Count; + _functionsWithId.Add(function); + } + + public IEnumerator<DecodedFunction> GetEnumerator() + { + return _functions.Values.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + } +}
\ No newline at end of file |