forked from Mirror/Ryujinx
Do not add more code after alpha test discard on fragment shader (#5529)
* Do not add more code after alpha test discard on fragment shader * Shader cache version bump
This commit is contained in:
parent
3ab0a71c7b
commit
42750a74f8
3 changed files with 23 additions and 9 deletions
|
@ -22,7 +22,7 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache
|
|||
private const ushort FileFormatVersionMajor = 1;
|
||||
private const ushort FileFormatVersionMinor = 2;
|
||||
private const uint FileFormatVersionPacked = ((uint)FileFormatVersionMajor << 16) | FileFormatVersionMinor;
|
||||
private const uint CodeGenVersion = 4675;
|
||||
private const uint CodeGenVersion = 5529;
|
||||
|
||||
private const string SharedTocFileName = "shared.toc";
|
||||
private const string SharedDataFileName = "shared.data";
|
||||
|
|
|
@ -162,8 +162,10 @@ namespace Ryujinx.Graphics.Shader.Instructions
|
|||
|
||||
if (op.Ccc == Ccc.T)
|
||||
{
|
||||
context.PrepareForReturn();
|
||||
context.Return();
|
||||
if (context.PrepareForReturn())
|
||||
{
|
||||
context.Return();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -174,8 +176,12 @@ namespace Ryujinx.Graphics.Shader.Instructions
|
|||
{
|
||||
Operand lblSkip = Label();
|
||||
context.BranchIfFalse(lblSkip, cond);
|
||||
context.PrepareForReturn();
|
||||
context.Return();
|
||||
|
||||
if (context.PrepareForReturn())
|
||||
{
|
||||
context.Return();
|
||||
}
|
||||
|
||||
context.MarkLabel(lblSkip);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -304,11 +304,11 @@ namespace Ryujinx.Graphics.Shader.Translation
|
|||
PrepareForVertexReturn();
|
||||
}
|
||||
|
||||
public void PrepareForReturn()
|
||||
public bool PrepareForReturn()
|
||||
{
|
||||
if (IsNonMain)
|
||||
{
|
||||
return;
|
||||
return true;
|
||||
}
|
||||
|
||||
if (Config.LastInVertexPipeline &&
|
||||
|
@ -383,13 +383,13 @@ namespace Ryujinx.Graphics.Shader.Translation
|
|||
|
||||
AlphaTestOp alphaTestOp = Config.GpuAccessor.QueryAlphaTestCompare();
|
||||
|
||||
if (alphaTestOp != AlphaTestOp.Always && (Config.OmapTargets & 8) != 0)
|
||||
if (alphaTestOp != AlphaTestOp.Always)
|
||||
{
|
||||
if (alphaTestOp == AlphaTestOp.Never)
|
||||
{
|
||||
this.Discard();
|
||||
}
|
||||
else
|
||||
else if ((Config.OmapTargets & 8) != 0)
|
||||
{
|
||||
Instruction comparator = alphaTestOp switch
|
||||
{
|
||||
|
@ -415,6 +415,12 @@ namespace Ryujinx.Graphics.Shader.Translation
|
|||
}
|
||||
}
|
||||
|
||||
// We don't need to output anything if alpha test always fails.
|
||||
if (alphaTestOp == AlphaTestOp.Never)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
int regIndexBase = 0;
|
||||
|
||||
for (int rtIndex = 0; rtIndex < 8; rtIndex++)
|
||||
|
@ -462,6 +468,8 @@ namespace Ryujinx.Graphics.Shader.Translation
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private void GenerateAlphaToCoverageDitherDiscard()
|
||||
|
|
Reference in a new issue