예제 #1
0
        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);
        }
예제 #2
0
        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);
        }
예제 #3
0
        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);
        }
예제 #4
0
        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);
        }