diff --git a/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs b/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs index 87bc55bd2..32a1e4bd8 100644 --- a/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs +++ b/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs @@ -40,7 +40,7 @@ namespace Ryujinx.Graphics.Gpu.Shader /// /// Version of the codegen (to be changed when codegen or guest format change). /// - private const ulong ShaderCodeGenVersion = 2845; + private const ulong ShaderCodeGenVersion = 2885; // Progress reporting helpers private volatile int _shaderCount; diff --git a/Ryujinx.Graphics.Shader/Instructions/InstEmitSurface.cs b/Ryujinx.Graphics.Shader/Instructions/InstEmitSurface.cs index 5959ac964..6d59b6207 100644 --- a/Ryujinx.Graphics.Shader/Instructions/InstEmitSurface.cs +++ b/Ryujinx.Graphics.Shader/Instructions/InstEmitSurface.cs @@ -219,9 +219,9 @@ namespace Ryujinx.Graphics.Shader.Instructions Operand GetDest() { - if (dest > RegisterConsts.RegisterZeroIndex) + if (dest >= RegisterConsts.RegisterZeroIndex) { - return Const(0); + return null; } return Register(dest++, RegisterType.Gpr); diff --git a/Ryujinx.Graphics.Shader/Instructions/InstEmitTexture.cs b/Ryujinx.Graphics.Shader/Instructions/InstEmitTexture.cs index 33cc6af7c..4d20a5ce1 100644 --- a/Ryujinx.Graphics.Shader/Instructions/InstEmitTexture.cs +++ b/Ryujinx.Graphics.Shader/Instructions/InstEmitTexture.cs @@ -306,9 +306,9 @@ namespace Ryujinx.Graphics.Shader.Instructions Operand GetDest() { - if (rdIndex > RegisterConsts.RegisterZeroIndex) + if (rdIndex >= RegisterConsts.RegisterZeroIndex) { - return Const(0); + return null; } return Register(rdIndex++, RegisterType.Gpr); @@ -322,6 +322,11 @@ namespace Ryujinx.Graphics.Shader.Instructions { Operand dest = GetDest(); + if (dest == null) + { + break; + } + TextureOperation operation = context.CreateTextureOperation( Instruction.TextureSample, type, @@ -795,9 +800,9 @@ namespace Ryujinx.Graphics.Shader.Instructions Operand GetDest() { - if (dest > RegisterConsts.RegisterZeroIndex) + if (dest >= RegisterConsts.RegisterZeroIndex) { - return Const(0); + return null; } return Register(dest++, RegisterType.Gpr); @@ -809,13 +814,20 @@ namespace Ryujinx.Graphics.Shader.Instructions { if ((compMask & 1) != 0) { + Operand destOperand = GetDest(); + + if (destOperand == null) + { + break; + } + TextureOperation operation = context.CreateTextureOperation( Instruction.TextureSample, type, flags, handle, compIndex, - GetDest(), + destOperand, sources); context.Add(operation); @@ -902,9 +914,9 @@ namespace Ryujinx.Graphics.Shader.Instructions Operand GetDest() { - if (dest > RegisterConsts.RegisterZeroIndex) + if (dest >= RegisterConsts.RegisterZeroIndex) { - return Const(0); + return null; } return Register(dest++, RegisterType.Gpr); @@ -916,11 +928,18 @@ namespace Ryujinx.Graphics.Shader.Instructions { if ((compMask & 1) != 0) { + Operand destOperand = GetDest(); + + if (destOperand == null) + { + break; + } + // Components z and w aren't standard, we return 0 in this case and add a comment. if (compIndex >= 2) { context.Add(new CommentNode("Unsupported component z or w found")); - context.Copy(GetDest(), Const(0)); + context.Copy(destOperand, Const(0)); } else { @@ -941,7 +960,7 @@ namespace Ryujinx.Graphics.Shader.Instructions Operand fixedPointValue = context.FP32ConvertToS32(tempDest); - context.Copy(GetDest(), fixedPointValue); + context.Copy(destOperand, fixedPointValue); } } } @@ -1055,9 +1074,9 @@ namespace Ryujinx.Graphics.Shader.Instructions Operand GetDest() { - if (dest > RegisterConsts.RegisterZeroIndex) + if (dest >= RegisterConsts.RegisterZeroIndex) { - return Const(0); + return null; } return Register(dest++, RegisterType.Gpr); @@ -1069,13 +1088,20 @@ namespace Ryujinx.Graphics.Shader.Instructions { if ((compMask & 1) != 0) { + Operand destOperand = GetDest(); + + if (destOperand == null) + { + break; + } + TextureOperation operation = context.CreateTextureOperation( Instruction.TextureSample, type, flags, handle, compIndex, - GetDest(), + destOperand, sources); context.Add(operation); @@ -1126,9 +1152,9 @@ namespace Ryujinx.Graphics.Shader.Instructions Operand GetDest() { - if (dest > RegisterConsts.RegisterZeroIndex) + if (dest >= RegisterConsts.RegisterZeroIndex) { - return Const(0); + return null; } return Register(dest++, RegisterType.Gpr); @@ -1149,13 +1175,20 @@ namespace Ryujinx.Graphics.Shader.Instructions { if ((compMask & 1) != 0) { + Operand destOperand = GetDest(); + + if (destOperand == null) + { + break; + } + TextureOperation operation = context.CreateTextureOperation( inst, type, flags, imm, compIndex, - GetDest(), + destOperand, sources); context.Add(operation);