瀏覽代碼

Add missing check for BRX, do not add a out of bounds block to the queue

gdk 6 年之前
父節點
當前提交
eea73bc421
共有 1 個文件被更改,包括 4 次插入2 次删除
  1. 4 2
      Ryujinx.Graphics.Shader/Decoders/Decoder.cs

+ 4 - 2
Ryujinx.Graphics.Shader/Decoders/Decoder.cs

@@ -45,6 +45,8 @@ namespace Ryujinx.Graphics.Shader.Decoders
 
             GetBlock(0);
 
+            ulong maxAddress = (ulong)code.Length - headerSize;
+
             while (workQueue.TryDequeue(out Block currBlock))
             {
                 // Check if the current block is inside another block.
@@ -65,7 +67,7 @@ namespace Ryujinx.Graphics.Shader.Decoders
                 }
 
                 // If we have a block after the current one, set the limit address.
-                ulong limitAddress = (ulong)code.Length - headerSize;
+                ulong limitAddress = maxAddress;
 
                 if (nBlkIndex != blocks.Count)
                 {
@@ -140,7 +142,7 @@ namespace Ryujinx.Graphics.Shader.Decoders
                 }
 
                 // Do we have a block after the current one?
-                if (!IsExit(currBlock.GetLastOp()) && currBlock.BrIndir != null)
+                if (!IsExit(currBlock.GetLastOp()) && currBlock.BrIndir != null && currBlock.EndAddress < maxAddress)
                 {
                     bool targetVisited = visited.ContainsKey(currBlock.EndAddress);