Fix FLO.SH shader instruction with a input of 0 (#2876)

* Fix FLO.SH shader instruction with a input of 0

* Shader cache version bump
This commit is contained in:
gdkchan 2021-12-05 09:25:05 -03:00 committed by GitHub
parent 2ab777885b
commit acc0b0f313
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 27 additions and 15 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 = 2816;
private const ulong ShaderCodeGenVersion = 2876;
// Progress reporting helpers
private volatile int _shaderCount;

View file

@ -71,8 +71,9 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl.Instructions
Add(Instruction.ExponentB2, InstType.CallUnary, "exp2");
Add(Instruction.FSIBegin, InstType.Special);
Add(Instruction.FSIEnd, InstType.Special);
Add(Instruction.FindFirstSetS32, InstType.CallUnary, "findMSB");
Add(Instruction.FindFirstSetU32, InstType.CallUnary, "findMSB");
Add(Instruction.FindLSB, InstType.CallUnary, "findLSB");
Add(Instruction.FindMSBS32, InstType.CallUnary, "findMSB");
Add(Instruction.FindMSBU32, InstType.CallUnary, "findMSB");
Add(Instruction.Floor, InstType.CallUnary, "floor");
Add(Instruction.FusedMultiplyAdd, InstType.CallTernary, "fma");
Add(Instruction.GroupMemoryBarrier, InstType.CallNullary, "groupMemoryBarrier");

View file

@ -166,13 +166,17 @@ namespace Ryujinx.Graphics.Shader.Instructions
{
Operand srcB = context.BitwiseNot(src, invert);
Operand res = isSigned
? context.FindFirstSetS32(srcB)
: context.FindFirstSetU32(srcB);
Operand res;
if (sh)
{
res = context.BitwiseExclusiveOr(res, Const(31));
res = context.FindLSB(context.BitfieldReverse(srcB));
}
else
{
res = isSigned
? context.FindMSBS32(srcB)
: context.FindMSBU32(srcB);
}
context.Copy(GetDest(rd), res);

View file

@ -68,8 +68,9 @@ namespace Ryujinx.Graphics.Shader.IntermediateRepresentation
ExponentB2,
FSIBegin,
FSIEnd,
FindFirstSetS32,
FindFirstSetU32,
FindLSB,
FindMSBS32,
FindMSBU32,
Floor,
FusedMultiplyAdd,
GroupMemoryBarrier,

View file

@ -79,8 +79,9 @@ namespace Ryujinx.Graphics.Shader.StructuredIr
Add(Instruction.Ddy, VariableType.F32, VariableType.F32);
Add(Instruction.Divide, VariableType.Scalar, VariableType.Scalar, VariableType.Scalar);
Add(Instruction.ExponentB2, VariableType.Scalar, VariableType.Scalar);
Add(Instruction.FindFirstSetS32, VariableType.S32, VariableType.S32);
Add(Instruction.FindFirstSetU32, VariableType.S32, VariableType.U32);
Add(Instruction.FindLSB, VariableType.Int, VariableType.Int);
Add(Instruction.FindMSBS32, VariableType.S32, VariableType.S32);
Add(Instruction.FindMSBU32, VariableType.S32, VariableType.U32);
Add(Instruction.Floor, VariableType.Scalar, VariableType.Scalar);
Add(Instruction.FusedMultiplyAdd, VariableType.Scalar, VariableType.Scalar, VariableType.Scalar, VariableType.Scalar);
Add(Instruction.ImageLoad, VariableType.F32);

View file

@ -181,14 +181,19 @@ namespace Ryujinx.Graphics.Shader.Translation
return context.Add(Instruction.EndPrimitive);
}
public static Operand FindFirstSetS32(this EmitterContext context, Operand a)
public static Operand FindLSB(this EmitterContext context, Operand a)
{
return context.Add(Instruction.FindFirstSetS32, Local(), a);
return context.Add(Instruction.FindLSB, Local(), a);
}
public static Operand FindFirstSetU32(this EmitterContext context, Operand a)
public static Operand FindMSBS32(this EmitterContext context, Operand a)
{
return context.Add(Instruction.FindFirstSetU32, Local(), a);
return context.Add(Instruction.FindMSBS32, Local(), a);
}
public static Operand FindMSBU32(this EmitterContext context, Operand a)
{
return context.Add(Instruction.FindMSBU32, Local(), a);
}
public static Operand FP32ConvertToFP64(this EmitterContext context, Operand a)