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> /// <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 = 2816; private const ulong ShaderCodeGenVersion = 2876;
// Progress reporting helpers // Progress reporting helpers
private volatile int _shaderCount; 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.ExponentB2, InstType.CallUnary, "exp2");
Add(Instruction.FSIBegin, InstType.Special); Add(Instruction.FSIBegin, InstType.Special);
Add(Instruction.FSIEnd, InstType.Special); Add(Instruction.FSIEnd, InstType.Special);
Add(Instruction.FindFirstSetS32, InstType.CallUnary, "findMSB"); Add(Instruction.FindLSB, InstType.CallUnary, "findLSB");
Add(Instruction.FindFirstSetU32, InstType.CallUnary, "findMSB"); Add(Instruction.FindMSBS32, InstType.CallUnary, "findMSB");
Add(Instruction.FindMSBU32, InstType.CallUnary, "findMSB");
Add(Instruction.Floor, InstType.CallUnary, "floor"); Add(Instruction.Floor, InstType.CallUnary, "floor");
Add(Instruction.FusedMultiplyAdd, InstType.CallTernary, "fma"); Add(Instruction.FusedMultiplyAdd, InstType.CallTernary, "fma");
Add(Instruction.GroupMemoryBarrier, InstType.CallNullary, "groupMemoryBarrier"); Add(Instruction.GroupMemoryBarrier, InstType.CallNullary, "groupMemoryBarrier");

View file

@ -166,13 +166,17 @@ namespace Ryujinx.Graphics.Shader.Instructions
{ {
Operand srcB = context.BitwiseNot(src, invert); Operand srcB = context.BitwiseNot(src, invert);
Operand res = isSigned Operand res;
? context.FindFirstSetS32(srcB)
: context.FindFirstSetU32(srcB);
if (sh) 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); context.Copy(GetDest(rd), res);

View file

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

View file

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

View file

@ -181,14 +181,19 @@ namespace Ryujinx.Graphics.Shader.Translation
return context.Add(Instruction.EndPrimitive); 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) public static Operand FP32ConvertToFP64(this EmitterContext context, Operand a)