diff options
Diffstat (limited to 'Ryujinx.Graphics.Shader/Instructions')
| -rw-r--r-- | Ryujinx.Graphics.Shader/Instructions/InstEmitMemory.cs | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/Ryujinx.Graphics.Shader/Instructions/InstEmitMemory.cs b/Ryujinx.Graphics.Shader/Instructions/InstEmitMemory.cs index 1fddcc8c..7eb88883 100644 --- a/Ryujinx.Graphics.Shader/Instructions/InstEmitMemory.cs +++ b/Ryujinx.Graphics.Shader/Instructions/InstEmitMemory.cs @@ -96,17 +96,27 @@ namespace Ryujinx.Graphics.Shader.Instructions { OpCodeIpa op = (OpCodeIpa)context.CurrOp; - InterpolationQualifier iq = InterpolationQualifier.None; + Operand res = Attribute(op.AttributeOffset); - switch (op.Mode) + if (op.AttributeOffset >= AttributeConsts.UserAttributeBase && + op.AttributeOffset < AttributeConsts.UserAttributeEnd) { - case InterpolationMode.Constant: iq = InterpolationQualifier.Flat; break; - case InterpolationMode.Pass: iq = InterpolationQualifier.NoPerspective; break; + int index = (op.AttributeOffset - AttributeConsts.UserAttributeBase) >> 4; + + if (context.Config.ImapTypes[index].GetFirstUsedType() == PixelImap.Perspective) + { + res = context.FPMultiply(res, Attribute(AttributeConsts.PositionW)); + } } + + if (op.Mode == InterpolationMode.Default) + { + Operand srcB = GetSrcB(context); - Operand srcA = Attribute(op.AttributeOffset, iq); + res = context.FPMultiply(res, srcB); + } - Operand res = context.FPSaturate(srcA, op.Saturate); + res = context.FPSaturate(res, op.Saturate); context.Copy(GetDest(context), res); } |
