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:
parent
00c69f2098
commit
119a3a1887
3 changed files with 51 additions and 18 deletions
|
@ -40,7 +40,7 @@ namespace Ryujinx.Graphics.Gpu.Shader
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Version of the codegen (to be changed when codegen or guest format change).
|
/// Version of the codegen (to be changed when codegen or guest format change).
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private const ulong ShaderCodeGenVersion = 2845;
|
private const ulong ShaderCodeGenVersion = 2885;
|
||||||
|
|
||||||
// Progress reporting helpers
|
// Progress reporting helpers
|
||||||
private volatile int _shaderCount;
|
private volatile int _shaderCount;
|
||||||
|
|
|
@ -219,9 +219,9 @@ namespace Ryujinx.Graphics.Shader.Instructions
|
||||||
|
|
||||||
Operand GetDest()
|
Operand GetDest()
|
||||||
{
|
{
|
||||||
if (dest > RegisterConsts.RegisterZeroIndex)
|
if (dest >= RegisterConsts.RegisterZeroIndex)
|
||||||
{
|
{
|
||||||
return Const(0);
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Register(dest++, RegisterType.Gpr);
|
return Register(dest++, RegisterType.Gpr);
|
||||||
|
|
|
@ -306,9 +306,9 @@ namespace Ryujinx.Graphics.Shader.Instructions
|
||||||
|
|
||||||
Operand GetDest()
|
Operand GetDest()
|
||||||
{
|
{
|
||||||
if (rdIndex > RegisterConsts.RegisterZeroIndex)
|
if (rdIndex >= RegisterConsts.RegisterZeroIndex)
|
||||||
{
|
{
|
||||||
return Const(0);
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Register(rdIndex++, RegisterType.Gpr);
|
return Register(rdIndex++, RegisterType.Gpr);
|
||||||
|
@ -322,6 +322,11 @@ namespace Ryujinx.Graphics.Shader.Instructions
|
||||||
{
|
{
|
||||||
Operand dest = GetDest();
|
Operand dest = GetDest();
|
||||||
|
|
||||||
|
if (dest == null)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
TextureOperation operation = context.CreateTextureOperation(
|
TextureOperation operation = context.CreateTextureOperation(
|
||||||
Instruction.TextureSample,
|
Instruction.TextureSample,
|
||||||
type,
|
type,
|
||||||
|
@ -795,9 +800,9 @@ namespace Ryujinx.Graphics.Shader.Instructions
|
||||||
|
|
||||||
Operand GetDest()
|
Operand GetDest()
|
||||||
{
|
{
|
||||||
if (dest > RegisterConsts.RegisterZeroIndex)
|
if (dest >= RegisterConsts.RegisterZeroIndex)
|
||||||
{
|
{
|
||||||
return Const(0);
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Register(dest++, RegisterType.Gpr);
|
return Register(dest++, RegisterType.Gpr);
|
||||||
|
@ -809,13 +814,20 @@ namespace Ryujinx.Graphics.Shader.Instructions
|
||||||
{
|
{
|
||||||
if ((compMask & 1) != 0)
|
if ((compMask & 1) != 0)
|
||||||
{
|
{
|
||||||
|
Operand destOperand = GetDest();
|
||||||
|
|
||||||
|
if (destOperand == null)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
TextureOperation operation = context.CreateTextureOperation(
|
TextureOperation operation = context.CreateTextureOperation(
|
||||||
Instruction.TextureSample,
|
Instruction.TextureSample,
|
||||||
type,
|
type,
|
||||||
flags,
|
flags,
|
||||||
handle,
|
handle,
|
||||||
compIndex,
|
compIndex,
|
||||||
GetDest(),
|
destOperand,
|
||||||
sources);
|
sources);
|
||||||
|
|
||||||
context.Add(operation);
|
context.Add(operation);
|
||||||
|
@ -902,9 +914,9 @@ namespace Ryujinx.Graphics.Shader.Instructions
|
||||||
|
|
||||||
Operand GetDest()
|
Operand GetDest()
|
||||||
{
|
{
|
||||||
if (dest > RegisterConsts.RegisterZeroIndex)
|
if (dest >= RegisterConsts.RegisterZeroIndex)
|
||||||
{
|
{
|
||||||
return Const(0);
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Register(dest++, RegisterType.Gpr);
|
return Register(dest++, RegisterType.Gpr);
|
||||||
|
@ -916,11 +928,18 @@ namespace Ryujinx.Graphics.Shader.Instructions
|
||||||
{
|
{
|
||||||
if ((compMask & 1) != 0)
|
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.
|
// Components z and w aren't standard, we return 0 in this case and add a comment.
|
||||||
if (compIndex >= 2)
|
if (compIndex >= 2)
|
||||||
{
|
{
|
||||||
context.Add(new CommentNode("Unsupported component z or w found"));
|
context.Add(new CommentNode("Unsupported component z or w found"));
|
||||||
context.Copy(GetDest(), Const(0));
|
context.Copy(destOperand, Const(0));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -941,7 +960,7 @@ namespace Ryujinx.Graphics.Shader.Instructions
|
||||||
|
|
||||||
Operand fixedPointValue = context.FP32ConvertToS32(tempDest);
|
Operand fixedPointValue = context.FP32ConvertToS32(tempDest);
|
||||||
|
|
||||||
context.Copy(GetDest(), fixedPointValue);
|
context.Copy(destOperand, fixedPointValue);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1055,9 +1074,9 @@ namespace Ryujinx.Graphics.Shader.Instructions
|
||||||
|
|
||||||
Operand GetDest()
|
Operand GetDest()
|
||||||
{
|
{
|
||||||
if (dest > RegisterConsts.RegisterZeroIndex)
|
if (dest >= RegisterConsts.RegisterZeroIndex)
|
||||||
{
|
{
|
||||||
return Const(0);
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Register(dest++, RegisterType.Gpr);
|
return Register(dest++, RegisterType.Gpr);
|
||||||
|
@ -1069,13 +1088,20 @@ namespace Ryujinx.Graphics.Shader.Instructions
|
||||||
{
|
{
|
||||||
if ((compMask & 1) != 0)
|
if ((compMask & 1) != 0)
|
||||||
{
|
{
|
||||||
|
Operand destOperand = GetDest();
|
||||||
|
|
||||||
|
if (destOperand == null)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
TextureOperation operation = context.CreateTextureOperation(
|
TextureOperation operation = context.CreateTextureOperation(
|
||||||
Instruction.TextureSample,
|
Instruction.TextureSample,
|
||||||
type,
|
type,
|
||||||
flags,
|
flags,
|
||||||
handle,
|
handle,
|
||||||
compIndex,
|
compIndex,
|
||||||
GetDest(),
|
destOperand,
|
||||||
sources);
|
sources);
|
||||||
|
|
||||||
context.Add(operation);
|
context.Add(operation);
|
||||||
|
@ -1126,9 +1152,9 @@ namespace Ryujinx.Graphics.Shader.Instructions
|
||||||
|
|
||||||
Operand GetDest()
|
Operand GetDest()
|
||||||
{
|
{
|
||||||
if (dest > RegisterConsts.RegisterZeroIndex)
|
if (dest >= RegisterConsts.RegisterZeroIndex)
|
||||||
{
|
{
|
||||||
return Const(0);
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Register(dest++, RegisterType.Gpr);
|
return Register(dest++, RegisterType.Gpr);
|
||||||
|
@ -1149,13 +1175,20 @@ namespace Ryujinx.Graphics.Shader.Instructions
|
||||||
{
|
{
|
||||||
if ((compMask & 1) != 0)
|
if ((compMask & 1) != 0)
|
||||||
{
|
{
|
||||||
|
Operand destOperand = GetDest();
|
||||||
|
|
||||||
|
if (destOperand == null)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
TextureOperation operation = context.CreateTextureOperation(
|
TextureOperation operation = context.CreateTextureOperation(
|
||||||
inst,
|
inst,
|
||||||
type,
|
type,
|
||||||
flags,
|
flags,
|
||||||
imm,
|
imm,
|
||||||
compIndex,
|
compIndex,
|
||||||
GetDest(),
|
destOperand,
|
||||||
sources);
|
sources);
|
||||||
|
|
||||||
context.Add(operation);
|
context.Add(operation);
|
||||||
|
|
Reference in a new issue