Add support for conditional (with CC) shader Exit instructions (#3470)

* Add support for conditional (with CC) shader Exit instructions

* Shader cache version bump

* Make CSM conditions default to false for EXIT.CC
This commit is contained in:
gdkchan 2022-07-24 15:33:30 -03:00 committed by GitHub
parent 84d0ca5645
commit 1a888ae087
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 16 additions and 5 deletions

View file

@ -21,7 +21,7 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache
private const ushort FileFormatVersionMajor = 1; private const ushort FileFormatVersionMajor = 1;
private const ushort FileFormatVersionMinor = 1; private const ushort FileFormatVersionMinor = 1;
private const uint FileFormatVersionPacked = ((uint)FileFormatVersionMajor << 16) | FileFormatVersionMinor; private const uint FileFormatVersionPacked = ((uint)FileFormatVersionMajor << 16) | FileFormatVersionMinor;
private const uint CodeGenVersion = 3472; private const uint CodeGenVersion = 3469;
private const string SharedTocFileName = "shared.toc"; private const string SharedTocFileName = "shared.toc";
private const string SharedDataFileName = "shared.data"; private const string SharedDataFileName = "shared.data";

View file

@ -104,12 +104,23 @@ namespace Ryujinx.Graphics.Shader.Instructions
return; return;
} }
// TODO: Figure out how this is supposed to work in the
// presence of other condition codes.
if (op.Ccc == Ccc.T) if (op.Ccc == Ccc.T)
{ {
context.Return(); context.Return();
} }
else
{
Operand cond = GetCondition(context, op.Ccc, IrConsts.False);
// If the condition is always false, we don't need to do anything.
if (cond.Type != OperandType.Constant || cond.Value != IrConsts.False)
{
Operand lblSkip = Label();
context.BranchIfFalse(lblSkip, cond);
context.Return();
context.MarkLabel(lblSkip);
}
}
} }
public static void Kil(EmitterContext context) public static void Kil(EmitterContext context)
@ -250,7 +261,7 @@ namespace Ryujinx.Graphics.Shader.Instructions
} }
} }
private static Operand GetCondition(EmitterContext context, Ccc cond) private static Operand GetCondition(EmitterContext context, Ccc cond, int defaultCond = IrConsts.True)
{ {
// TODO: More condition codes, figure out how they work. // TODO: More condition codes, figure out how they work.
switch (cond) switch (cond)
@ -263,7 +274,7 @@ namespace Ryujinx.Graphics.Shader.Instructions
return context.BitwiseNot(GetZF()); return context.BitwiseNot(GetZF());
} }
return Const(IrConsts.True); return Const(defaultCond);
} }
} }
} }