0
0
Fork 0
mirror of https://github.com/GreemDev/Ryujinx.git synced 2024-12-22 22:45:46 +00:00

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 FileFormatVersionMinor = 1;
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 SharedDataFileName = "shared.data";

View file

@ -104,12 +104,23 @@ namespace Ryujinx.Graphics.Shader.Instructions
return;
}
// TODO: Figure out how this is supposed to work in the
// presence of other condition codes.
if (op.Ccc == Ccc.T)
{
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)
@ -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.
switch (cond)
@ -263,7 +274,7 @@ namespace Ryujinx.Graphics.Shader.Instructions
return context.BitwiseNot(GetZF());
}
return Const(IrConsts.True);
return Const(defaultCond);
}
}
}