Fix SUATOM and other texture shader instructions with RZ dest (#2885)

* Fix SUATOM and other texture shader instructions with RZ dest

* Shader cache version bump
This commit is contained in:
gdkchan 2021-12-08 18:36:09 -03:00 committed by GitHub
parent 00c69f2098
commit 119a3a1887
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 51 additions and 18 deletions

View file

@ -40,7 +40,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 = 2845;
private const ulong ShaderCodeGenVersion = 2885;
// Progress reporting helpers
private volatile int _shaderCount;

View file

@ -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);

View file

@ -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);