Exemplo n.º 1
0
        private IEmitVal EmitExpImpl(
            MidBuiltinApp app,
            IEmitBlock block,
            EmitEnv env)
        {
            var template = app.Decl.GetTemplate(Target.TargetName);

            if (template == null)
            {
                Diagnostics.Add(
                    Severity.Error,
                    new SourceRange(),
                    "No builtin function implementation defined for \"{0}\" for target \"{1}\"",
                    app.Decl.Name,
                    Target.TargetName);
                return(block.Local("error", EmitType(app.Type, env)));
            }
            var args = (from a in app.Args
                        select EmitExp(a, block, env)).ToArray();

            return(block.BuiltinApp(
                       EmitType(app.Type, env),
                       template,
                       args));
        }
Exemplo n.º 2
0
        private AttrInfo DecomposeAttrImpl(
            MidBuiltinApp app,
            DecomposeAttrContext context)
        {
            string template = app.Decl.GetTemplate("blend");

            if (template == null)
            {
                throw OperationTooComplexError(app.Range);
            }

            var args = app.Args.ToArray();

            switch (template)
            {
            case "AddFloat4":
            {
                var left  = DecomposeAttr(args[0], context);
                var right = DecomposeAttr(args[1], context);
                return(new OpInfo(
                           app.Range,
                           D3D11_BLEND_OP.D3D11_BLEND_OP_ADD,
                           left,
                           right));
            }

            case "MulFloat4": {
                var left  = DecomposeAttr(args[0], context);
                var right = DecomposeAttr(args[1], context);
                return(new TermInfo(app.Range, left, right));
            }

            case "MulFloat_Float4": {
                var left  = DecomposeAttr(args[0], context.SwitchToAlpha());
                var right = DecomposeAttr(args[1], context);
                return(new TermInfo(app.Range, left, right));
            }

            case "MulFloat4_Float": {
                var left  = DecomposeAttr(args[0], context);
                var right = DecomposeAttr(args[1], context.SwitchToAlpha());
                return(new TermInfo(app.Range, left, right));
            }

            case "GetAlpha": {
                var arg = DecomposeAttr(args[0], context.SwitchToAlpha());
                return(arg);
            }

            case "SubFloat":
            {
                var left  = DecomposeAttr(args[0], context);
                var right = DecomposeAttr(args[1], context);
                return(new SubInfo(app.Range, left, right));
            }

            case "IntToFloat":
            {
                var arg = DecomposeAttr(args[0], context);
                return(arg);
            }

            default:
                throw OperationTooComplexError(app.Range);
            }
        }