Simplified F2I shader instruction codegen

This commit is contained in:
gdk 2019-11-26 01:00:58 -03:00 committed by Thog
parent b8528c6317
commit 99f236fcf0
5 changed files with 26 additions and 9 deletions

View File

@ -50,6 +50,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl.Instructions
Add(Instruction.CompareNotEqual, InstType.OpBinaryCom, "!=", 5); Add(Instruction.CompareNotEqual, InstType.OpBinaryCom, "!=", 5);
Add(Instruction.ConditionalSelect, InstType.OpTernary, "?:", 12); Add(Instruction.ConditionalSelect, InstType.OpTernary, "?:", 12);
Add(Instruction.ConvertFPToS32, InstType.CallUnary, "int"); Add(Instruction.ConvertFPToS32, InstType.CallUnary, "int");
Add(Instruction.ConvertFPToU32, InstType.CallUnary, "uint");
Add(Instruction.ConvertS32ToFP, InstType.CallUnary, "float"); Add(Instruction.ConvertS32ToFP, InstType.CallUnary, "float");
Add(Instruction.ConvertU32ToFP, InstType.CallUnary, "float"); Add(Instruction.ConvertU32ToFP, InstType.CallUnary, "float");
Add(Instruction.Cosine, InstType.CallUnary, "cos"); Add(Instruction.Cosine, InstType.CallUnary, "cos");

View File

@ -99,12 +99,26 @@ namespace Ryujinx.Graphics.Shader.Instructions
break; break;
} }
long min = GetIntMin(intType); if (!isSignedInt)
long max = GetIntMax(intType); {
// Negative float to uint cast is undefined, so we clamp
// the value before conversion.
srcB = context.FPMaximum(srcB, ConstF(0));
}
srcB = context.FPClamp(srcB, ConstF(min), ConstF(max)); srcB = isSignedInt
? context.FPConvertToS32(srcB)
: context.FPConvertToU32(srcB);
srcB = context.FPConvertToS32(srcB); if (isSmallInt)
{
int min = (int)GetIntMin(intType);
int max = (int)GetIntMax(intType);
srcB = isSignedInt
? context.IClampS32(srcB, Const(min), Const(max))
: context.IClampU32(srcB, Const(min), Const(max));
}
Operand dest = GetDest(context); Operand dest = GetDest(context);

View File

@ -46,6 +46,7 @@ namespace Ryujinx.Graphics.Shader.IntermediateRepresentation
CompareNotEqual, CompareNotEqual,
ConditionalSelect, ConditionalSelect,
ConvertFPToS32, ConvertFPToS32,
ConvertFPToU32,
ConvertS32ToFP, ConvertS32ToFP,
ConvertU32ToFP, ConvertU32ToFP,
Copy, Copy,

View File

@ -64,6 +64,7 @@ namespace Ryujinx.Graphics.Shader.StructuredIr
Add(Instruction.CompareNotEqual, VariableType.Bool, VariableType.Scalar, VariableType.Scalar); Add(Instruction.CompareNotEqual, VariableType.Bool, VariableType.Scalar, VariableType.Scalar);
Add(Instruction.ConditionalSelect, VariableType.Scalar, VariableType.Bool, VariableType.Scalar, VariableType.Scalar); Add(Instruction.ConditionalSelect, VariableType.Scalar, VariableType.Bool, VariableType.Scalar, VariableType.Scalar);
Add(Instruction.ConvertFPToS32, VariableType.S32, VariableType.F32); Add(Instruction.ConvertFPToS32, VariableType.S32, VariableType.F32);
Add(Instruction.ConvertFPToU32, VariableType.U32, VariableType.F32);
Add(Instruction.ConvertS32ToFP, VariableType.F32, VariableType.S32); Add(Instruction.ConvertS32ToFP, VariableType.F32, VariableType.S32);
Add(Instruction.ConvertU32ToFP, VariableType.F32, VariableType.U32); Add(Instruction.ConvertU32ToFP, VariableType.F32, VariableType.U32);
Add(Instruction.Cosine, VariableType.Scalar, VariableType.Scalar); Add(Instruction.Cosine, VariableType.Scalar, VariableType.Scalar);

View File

@ -206,11 +206,6 @@ namespace Ryujinx.Graphics.Shader.Translation
return context.Add(Instruction.FP | Instruction.Ceiling, Local(), a); return context.Add(Instruction.FP | Instruction.Ceiling, Local(), a);
} }
public static Operand FPClamp(this EmitterContext context, Operand a, Operand b, Operand c)
{
return context.Add(Instruction.FP | Instruction.Clamp, Local(), a, b, c);
}
public static Operand FPCompareEqual(this EmitterContext context, Operand a, Operand b) public static Operand FPCompareEqual(this EmitterContext context, Operand a, Operand b)
{ {
return context.Add(Instruction.FP | Instruction.CompareEqual, Local(), a, b); return context.Add(Instruction.FP | Instruction.CompareEqual, Local(), a, b);
@ -226,6 +221,11 @@ namespace Ryujinx.Graphics.Shader.Translation
return context.Add(Instruction.ConvertFPToS32, Local(), a); return context.Add(Instruction.ConvertFPToS32, Local(), a);
} }
public static Operand FPConvertToU32(this EmitterContext context, Operand a)
{
return context.Add(Instruction.ConvertFPToU32, Local(), a);
}
public static Operand FPCosine(this EmitterContext context, Operand a) public static Operand FPCosine(this EmitterContext context, Operand a)
{ {
return context.Add(Instruction.FP | Instruction.Cosine, Local(), a); return context.Add(Instruction.FP | Instruction.Cosine, Local(), a);