aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.Shader/Instructions
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.Graphics.Shader/Instructions')
-rw-r--r--Ryujinx.Graphics.Shader/Instructions/InstEmitMemory.cs22
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);
}