From 2df16ded9ba06a874b58132cc2c78175631a3b8d Mon Sep 17 00:00:00 2001 From: gdkchan Date: Sat, 15 Oct 2022 20:20:16 -0300 Subject: Improve shader BRX instruction code generation (#3759) * Improve shader BRX instruction code generation * Shader cache version bump, add some comments and asserts --- Ryujinx.Graphics.Shader/Decoders/Decoder.cs | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) (limited to 'Ryujinx.Graphics.Shader/Decoders/Decoder.cs') 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 visited = new HashSet(); + 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); + } } } } -- cgit v1.2.3