aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.Shader/Decoders/Decoder.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.Graphics.Shader/Decoders/Decoder.cs')
-rw-r--r--Ryujinx.Graphics.Shader/Decoders/Decoder.cs13
1 files changed, 10 insertions, 3 deletions
diff --git a/Ryujinx.Graphics.Shader/Decoders/Decoder.cs b/Ryujinx.Graphics.Shader/Decoders/Decoder.cs
index 1c329b59..9dafb089 100644
--- a/Ryujinx.Graphics.Shader/Decoders/Decoder.cs
+++ b/Ryujinx.Graphics.Shader/Decoders/Decoder.cs
@@ -377,6 +377,8 @@ namespace Ryujinx.Graphics.Shader.Decoders
if (lastOp.Name == InstName.Brx && block.Successors.Count == (hasNext ? 1 : 0))
{
+ HashSet<ulong> visited = new HashSet<ulong>();
+
InstBrx opBrx = new InstBrx(lastOp.RawOpCode);
ulong baseOffset = lastOp.GetAbsoluteAddress();
@@ -392,9 +394,14 @@ namespace Ryujinx.Graphics.Shader.Decoders
for (int i = 0; i < cbOffsetsCount; i++)
{
uint targetOffset = config.ConstantBuffer1Read(cbBaseOffset + i * 4);
- Block target = getBlock(baseOffset + targetOffset);
- target.Predecessors.Add(block);
- block.Successors.Add(target);
+ ulong targetAddress = baseOffset + targetOffset;
+
+ if (visited.Add(targetAddress))
+ {
+ Block target = getBlock(targetAddress);
+ target.Predecessors.Add(block);
+ block.Successors.Add(target);
+ }
}
}
}