From 7ff1f9aa121a7c2f59f8cba4bb5367839342ed62 Mon Sep 17 00:00:00 2001
From: riperiperi <rhy3756547@hotmail.com>
Date: Tue, 15 Jun 2021 01:09:59 +0100
Subject: [PATCH] End shader decoding when reaching a block that starts with an
 infinite loop (after BRX) (#2367)

* End shader decoding when reaching an infinite loop

The NV shader compiler puts these at the end of shaders.

* Update shader cache version
---
 Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs  | 4 ++--
 Ryujinx.Graphics.Shader/Decoders/Decoder.cs | 4 +++-
 2 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs b/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs
index f72b5e6cc6..b080a8bb40 100644
--- a/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs
+++ b/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs
@@ -36,7 +36,7 @@ namespace Ryujinx.Graphics.Gpu.Shader
         /// <summary>
         /// Version of the codegen (to be changed when codegen or guest format change).
         /// </summary>
-        private const ulong ShaderCodeGenVersion = 2329;
+        private const ulong ShaderCodeGenVersion = 2367;
 
         // Progress reporting helpers
         private volatile int _shaderCount;
@@ -955,4 +955,4 @@ namespace Ryujinx.Graphics.Gpu.Shader
             _cacheManager?.Dispose();
         }
     }
-}
\ No newline at end of file
+}
diff --git a/Ryujinx.Graphics.Shader/Decoders/Decoder.cs b/Ryujinx.Graphics.Shader/Decoders/Decoder.cs
index 2d00f237b8..9ca581771a 100644
--- a/Ryujinx.Graphics.Shader/Decoders/Decoder.cs
+++ b/Ryujinx.Graphics.Shader/Decoders/Decoder.cs
@@ -9,6 +9,8 @@ namespace Ryujinx.Graphics.Shader.Decoders
 {
     static class Decoder
     {
+        public const ulong ShaderEndDelimiter = 0xe2400fffff87000f;
+
         public static Block[][] Decode(IGpuAccessor gpuAccessor, ulong startAddress, out bool hasBindless)
         {
             hasBindless = false;
@@ -190,7 +192,7 @@ namespace Ryujinx.Graphics.Shader.Decoders
 
             ulong inst = gpuAccessor.MemoryRead<ulong>(startAdddress + currBlock.EndAddress);
 
-            return inst != 0UL;
+            return inst != 0UL && inst != ShaderEndDelimiter;
         }
 
         private static bool BinarySearch(List<Block> blocks, ulong address, out int index)