aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.Shader/Decoders/Decoder.cs
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2022-10-15 20:20:16 -0300
committerGitHub <noreply@github.com>2022-10-15 23:20:16 +0000
commit2df16ded9ba06a874b58132cc2c78175631a3b8d (patch)
tree14a637508ad67a9424b47698094020fececca4a8 /Ryujinx.Graphics.Shader/Decoders/Decoder.cs
parente43390c7233af875133f23bfcfc6e4a211080070 (diff)
Improve shader BRX instruction code generation (#3759)1.1.301
* Improve shader BRX instruction code generation * Shader cache version bump, add some comments and asserts
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);
+ }
}
}
}