Add support for alpha to coverage dithering (#3069)
* Add support for alpha to coverage dithering * Shader cache version bump * Fix wrong alpha register * Ensure support buffer is cleared * New shader specialization based approach
This commit is contained in:
parent
594246ea47
commit
b46b63e06a
20 changed files with 217 additions and 34 deletions
|
@ -205,6 +205,8 @@ namespace Ryujinx.Graphics.Shader.Translation
|
|||
}
|
||||
else if (Config.Stage == ShaderStage.Fragment)
|
||||
{
|
||||
GenerateAlphaToCoverageDitherDiscard();
|
||||
|
||||
if (Config.OmapDepth)
|
||||
{
|
||||
Operand dest = Attribute(AttributeConsts.FragmentOutputDepth);
|
||||
|
@ -266,6 +268,35 @@ namespace Ryujinx.Graphics.Shader.Translation
|
|||
}
|
||||
}
|
||||
|
||||
private void GenerateAlphaToCoverageDitherDiscard()
|
||||
{
|
||||
// If the feature is disabled, or alpha is not written, then we're done.
|
||||
if (!Config.GpuAccessor.QueryAlphaToCoverageDitherEnable() || (Config.OmapTargets & 8) == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// 11 11 11 10 10 10 10 00
|
||||
// 11 01 01 01 01 00 00 00
|
||||
Operand ditherMask = Const(unchecked((int)0xfbb99110u));
|
||||
|
||||
Operand x = this.BitwiseAnd(this.FP32ConvertToU32(Attribute(AttributeConsts.PositionX)), Const(1));
|
||||
Operand y = this.BitwiseAnd(this.FP32ConvertToU32(Attribute(AttributeConsts.PositionY)), Const(1));
|
||||
Operand xy = this.BitwiseOr(x, this.ShiftLeft(y, Const(1)));
|
||||
|
||||
Operand alpha = Register(3, RegisterType.Gpr);
|
||||
Operand scaledAlpha = this.FPMultiply(this.FPSaturate(alpha), ConstF(8));
|
||||
Operand quantizedAlpha = this.IMinimumU32(this.FP32ConvertToU32(scaledAlpha), Const(7));
|
||||
Operand shift = this.BitwiseOr(this.ShiftLeft(quantizedAlpha, Const(2)), xy);
|
||||
Operand opaque = this.BitwiseAnd(this.ShiftRightU32(ditherMask, shift), Const(1));
|
||||
|
||||
Operand a2cDitherEndLabel = Label();
|
||||
|
||||
this.BranchIfTrue(a2cDitherEndLabel, opaque);
|
||||
this.Discard();
|
||||
this.MarkLabel(a2cDitherEndLabel);
|
||||
}
|
||||
|
||||
public Operation[] GetOperations()
|
||||
{
|
||||
return _operations.ToArray();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue