mirror of
https://github.com/Ryujinx/Ryujinx.git
synced 2024-08-18 14:48:44 +02: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:
parent
84d0ca5645
commit
1a888ae087
2 changed files with 16 additions and 5 deletions
|
@ -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";
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in a new issue