From 7ff1f9aa121a7c2f59f8cba4bb5367839342ed62 Mon Sep 17 00:00:00 2001 From: riperiperi 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 f72b5e6cc..b080a8bb4 100644 --- a/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs +++ b/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs @@ -36,7 +36,7 @@ namespace Ryujinx.Graphics.Gpu.Shader /// /// Version of the codegen (to be changed when codegen or guest format change). /// - 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 2d00f237b..9ca581771 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(startAdddress + currBlock.EndAddress); - return inst != 0UL; + return inst != 0UL && inst != ShaderEndDelimiter; } private static bool BinarySearch(List blocks, ulong address, out int index)