Support CC on FSET shader instruction, fix CC on ISET.BF shader instruction
This commit is contained in:
parent
9d7a142a48
commit
82957fa96b
3 changed files with 24 additions and 14 deletions
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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;
|
||||||
|
|
Reference in a new issue