Support CC on FSET shader instruction, fix CC on ISET.BF shader instruction

This commit is contained in:
gdkchan 2019-12-16 02:42:01 -03:00 committed by Thog
parent 9d7a142a48
commit 82957fa96b
3 changed files with 24 additions and 14 deletions

View file

@ -327,14 +327,18 @@ namespace Ryujinx.Graphics.Shader.Instructions
if (boolFloat)
{
context.Copy(dest, context.ConditionalSelect(res, ConstF(1), Const(0)));
res = context.ConditionalSelect(res, ConstF(1), Const(0));
context.Copy(dest, res);
SetFPZnFlags(context, res, op.SetCondCode);
}
else
{
context.Copy(dest, res);
}
SetZnFlags(context, res, op.SetCondCode, op.Extended);
SetZnFlags(context, res, op.SetCondCode, op.Extended);
}
// TODO: X
}

View file

@ -84,5 +84,14 @@ namespace Ryujinx.Graphics.Shader.Instructions
context.Copy(GetNF(context), context.ICompareLess(dest, Const(0)));
}
public static void SetFPZnFlags(EmitterContext context, Operand dest, bool setCC)
{
if (setCC)
{
context.Copy(GetZF(context), context.FPCompareEqual(dest, ConstF(0)));
context.Copy(GetNF(context), context.FPCompareLess (dest, ConstF(0)));
}
}
}
}

View file

@ -163,14 +163,20 @@ namespace Ryujinx.Graphics.Shader.Instructions
if (boolFloat)
{
context.Copy(dest, context.ConditionalSelect(res, ConstF(1), Const(0)));
res = context.ConditionalSelect(res, ConstF(1), Const(0));
context.Copy(dest, res);
SetFPZnFlags(context, res, op.SetCondCode);
}
else
{
context.Copy(dest, res);
SetZnFlags(context, res, op.SetCondCode, op.Extended);
}
// TODO: CC, X
// TODO: X
}
public static void Fsetp(EmitterContext context)
@ -453,15 +459,6 @@ namespace Ryujinx.Graphics.Shader.Instructions
return res;
}
private static void SetFPZnFlags(EmitterContext context, Operand dest, bool setCC)
{
if (setCC)
{
context.Copy(GetZF(context), context.FPCompareEqual(dest, ConstF(0)));
context.Copy(GetNF(context), context.FPCompareLess (dest, ConstF(0)));
}
}
private static Operand[] GetHfmaSrcA(EmitterContext context)
{
IOpCodeHfma op = (IOpCodeHfma)context.CurrOp;