aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorriperiperi <rhy3756547@hotmail.com>2021-06-15 01:09:59 +0100
committerGitHub <noreply@github.com>2021-06-15 02:09:59 +0200
commit7ff1f9aa121a7c2f59f8cba4bb5367839342ed62 (patch)
tree64a12c5d1e4732af088b6f006eafd4506ddf662b
parentbfcc6a8ad63a0eb0f06968145a310c484a96e8ca (diff)
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
-rw-r--r--Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs4
-rw-r--r--Ryujinx.Graphics.Shader/Decoders/Decoder.cs4
2 files changed, 5 insertions, 3 deletions
diff --git a/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs b/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs
index f72b5e6c..b080a8bb 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 2d00f237..9ca58177 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)