aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Graphics.Shader/Decoders/DecodedFunction.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Ryujinx.Graphics.Shader/Decoders/DecodedFunction.cs')
-rw-r--r--src/Ryujinx.Graphics.Shader/Decoders/DecodedFunction.cs48
1 files changed, 48 insertions, 0 deletions
diff --git a/src/Ryujinx.Graphics.Shader/Decoders/DecodedFunction.cs b/src/Ryujinx.Graphics.Shader/Decoders/DecodedFunction.cs
new file mode 100644
index 00000000..7a172fe6
--- /dev/null
+++ b/src/Ryujinx.Graphics.Shader/Decoders/DecodedFunction.cs
@@ -0,0 +1,48 @@
+using System;
+using System.Collections.Generic;
+
+namespace Ryujinx.Graphics.Shader.Decoders
+{
+ class DecodedFunction
+ {
+ private readonly HashSet<DecodedFunction> _callers;
+
+ public bool IsCompilerGenerated => Type != FunctionType.User;
+ public FunctionType Type { get; set; }
+ public int Id { get; set; }
+
+ public ulong Address { get; }
+ public Block[] Blocks { get; private set; }
+
+ public DecodedFunction(ulong address)
+ {
+ Address = address;
+ _callers = new HashSet<DecodedFunction>();
+ Type = FunctionType.User;
+ Id = -1;
+ }
+
+ public void SetBlocks(Block[] blocks)
+ {
+ if (Blocks != null)
+ {
+ throw new InvalidOperationException("Blocks have already been set.");
+ }
+
+ Blocks = blocks;
+ }
+
+ public void AddCaller(DecodedFunction caller)
+ {
+ _callers.Add(caller);
+ }
+
+ public void RemoveCaller(DecodedFunction caller)
+ {
+ if (_callers.Remove(caller) && _callers.Count == 0)
+ {
+ Type = FunctionType.Unused;
+ }
+ }
+ }
+} \ No newline at end of file