public static void Ipa(EmitterContext context) { OpCodeIpa op = (OpCodeIpa)context.CurrOp; context.FlagAttributeRead(op.AttributeOffset); Operand res = Attribute(op.AttributeOffset); if (op.AttributeOffset >= AttributeConsts.UserAttributeBase && op.AttributeOffset < AttributeConsts.UserAttributeEnd) { 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); res = context.FPMultiply(res, srcB); } res = context.FPSaturate(res, op.Saturate); context.Copy(GetDest(context), res); }
public static void Ipa(EmitterContext context) { OpCodeIpa op = (OpCodeIpa)context.CurrOp; Operand srcA = new Operand(OperandType.Attribute, op.AttributeOffset); Operand srcB = GetSrcB(context); context.Copy(GetDest(context), srcA); }
public static void Ipa(EmitterContext context) { OpCodeIpa op = (OpCodeIpa)context.CurrOp; InterpolationQualifier iq = InterpolationQualifier.None; switch (op.Mode) { case InterpolationMode.Pass: iq = InterpolationQualifier.NoPerspective; break; } Operand srcA = Attribute(op.AttributeOffset, iq); Operand res = context.FPSaturate(srcA, op.Saturate); context.Copy(GetDest(context), res); }
public static void Ipa(EmitterContext context) { OpCodeIpa op = (OpCodeIpa)context.CurrOp; context.FlagAttributeRead(op.AttributeOffset); Operand res; if (op.Idx) { Operand userAttrOffset = context.ISubtract(GetSrcA(context), Const(AttributeConsts.UserAttributeBase)); Operand userAttrIndex = context.ShiftRightU32(userAttrOffset, Const(2)); res = context.LoadAttribute(Const(AttributeConsts.UserAttributeBase), userAttrIndex, Const(0)); res = context.FPMultiply(res, Attribute(AttributeConsts.PositionW)); context.Config.SetUsedFeature(FeatureFlags.IaIndexing); } else { res = Attribute(op.AttributeOffset); if (op.AttributeOffset >= AttributeConsts.UserAttributeBase && op.AttributeOffset < AttributeConsts.UserAttributeEnd) { 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); res = context.FPMultiply(res, srcB); } res = context.FPSaturate(res, op.Saturate); context.Copy(GetDest(context), res); }