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:
parent
2ab777885b
commit
acc0b0f313
6 changed files with 27 additions and 15 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 = 2816;
|
private const ulong ShaderCodeGenVersion = 2876;
|
||||||
|
|
||||||
// Progress reporting helpers
|
// Progress reporting helpers
|
||||||
private volatile int _shaderCount;
|
private volatile int _shaderCount;
|
||||||
|
|
|
@ -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");
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Reference in a new issue