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) 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 else
{ {
context.Copy(dest, res); context.Copy(dest, res);
}
SetZnFlags(context, res, op.SetCondCode, op.Extended); SetZnFlags(context, res, op.SetCondCode, op.Extended);
}
// TODO: X // TODO: X
} }

View file

@ -84,5 +84,14 @@ namespace Ryujinx.Graphics.Shader.Instructions
context.Copy(GetNF(context), context.ICompareLess(dest, Const(0))); 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) 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 else
{ {
context.Copy(dest, res); context.Copy(dest, res);
SetZnFlags(context, res, op.SetCondCode, op.Extended);
} }
// TODO: CC, X // TODO: X
} }
public static void Fsetp(EmitterContext context) public static void Fsetp(EmitterContext context)
@ -453,15 +459,6 @@ namespace Ryujinx.Graphics.Shader.Instructions
return res; 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) private static Operand[] GetHfmaSrcA(EmitterContext context)
{ {
IOpCodeHfma op = (IOpCodeHfma)context.CurrOp; IOpCodeHfma op = (IOpCodeHfma)context.CurrOp;