Esempio n. 1
0
        public IEmitVal EmitAttributeRef(
            MidAttributeDecl decl,
            IEmitBlock block,
            EmitEnv env)
        {
            if (env.ContainsKey(decl))
            {
                return(env.Lookup(decl, block));
            }

            IEmitVal attributeVal = null;

            if (decl.Exp != null)
            {
                attributeVal = block.Temp(
                    decl.Name.ToString(),
                    EmitExp(decl.Exp, block, env));
            }
            else
            {
                // \todo: This is a *huge* hack,
                // since we use @Constant attributes
                // to make various D3D constants visible... :(
                attributeVal = block.BuiltinApp(
                    EmitType(decl.Type, env),
                    decl.Name.ToString(),
                    null);
            }

            env.Insert(decl, (b) => attributeVal);
            return(attributeVal);
        }
Esempio n. 2
0
 public void ApplyTo(IEmitBlock block)
 {
     foreach (var a in _actions)
     {
         a(block);
     }
 }
Esempio n. 3
0
 public static IEmitVal Array(
     this IEmitBlock block,
     IEmitType elementType,
     IEnumerable <IEmitVal> elements)
 {
     return(block.Array(elementType, elements.ToArray()));
 }
Esempio n. 4
0
 public IEmitVal EmitExp(
     MidExp exp,
     IEmitBlock block,
     EmitEnv env)
 {
     return(EmitExpImpl((dynamic)exp, block, env));
 }
Esempio n. 5
0
 private IEmitVal EmitExpImpl(
     MidAttributeRef attrRef,
     IEmitBlock block,
     EmitEnv env)
 {
     return(EmitAttributeRef(attrRef.Decl, block, env));
 }
Esempio n. 6
0
 private IEmitVal EmitExpImpl(
     MidLit <float> lit,
     IEmitBlock block,
     EmitEnv env)
 {
     return(_target.LiteralF32(lit.Value));
 }
Esempio n. 7
0
 private IEmitVal EmitExpImpl(
     MidLit <bool> lit,
     IEmitBlock block,
     EmitEnv env)
 {
     return(_target.LiteralBool(lit.Value));
 }
Esempio n. 8
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));
        }
Esempio n. 9
0
 private IEmitVal EmitExpImpl(
     MidVarRef exp,
     IEmitBlock block,
     EmitEnv env)
 {
     return(env.Lookup(exp.Var, block));
 }
Esempio n. 10
0
        private void EmitShaderBinds(
            IEmitBlock block,
            string prefix,
            EmitContextHLSL hlslContext)
        {
            block.CallCOM(
                SubmitContext,
                "ID3D11DeviceContext",
                string.Format("{0}SetConstantBuffers", prefix),
                block.LiteralU32(0),
                block.LiteralU32(1),
                block.GetArrow(SubmitThis, EmitPass.CBField).GetAddress());

            var resources     = hlslContext.ShaderResources.ToArray();
            var resourceCount = resources.Length;

            if (resourceCount != 0)
            {
                var resourceVals = (from r in resources
                                    select EmitContext.EmitExp(r, block, SubmitEnv)).ToArray();

                var resourcesVal = block.Temp(
                    string.Format("{0}Resources", prefix),
                    block.Array(
                        EmitTarget.GetOpaqueType("ID3D11ShaderResourceView*"),
                        resourceVals));

                block.CallCOM(
                    SubmitContext,
                    "ID3D11DeviceContext",
                    string.Format("{0}SetShaderResources", prefix),
                    block.LiteralU32(0),
                    block.LiteralU32((UInt32)resourceCount),
                    resourcesVal.GetAddress());
            }

            var samplers     = hlslContext.SamplerStates.ToArray();
            var samplerCount = samplers.Length;

            if (samplerCount != 0)
            {
                var samplerVals = (from s in samplers
                                   select EmitContext.EmitExp(s, block, SubmitEnv)).ToArray();

                var samplersVal = block.Temp(
                    string.Format("{0}Samplers", prefix),
                    block.Array(
                        EmitTarget.GetOpaqueType("ID3D11SamplerState*"),
                        samplerVals));

                block.CallCOM(
                    SubmitContext,
                    "ID3D11DeviceContext",
                    string.Format("{0}SetSamplers", prefix),
                    block.LiteralU32(0),
                    block.LiteralU32((UInt32)samplerCount),
                    samplersVal.GetAddress());
            }
        }
Esempio n. 11
0
 public static IEmitVal Enum32(
     this IEmitBlock block,
     string type,
     string name,
     Enum val)
 {
     return(block.Enum32(type, name, Convert.ToUInt32(val)));
 }
Esempio n. 12
0
 public static IEmitVal Enum32(
     this IEmitBlock block,
     Enum val)
 {
     return(block.Enum32(
                val.GetType().Name,
                val.ToString(),
                Convert.ToUInt32(val)));
 }
Esempio n. 13
0
 public IEmitVal EmitAttributeRef(
     MidAttributeWrapperDecl wrapper,
     IEmitBlock block,
     EmitEnv env)
 {
     return(EmitAttributeRef(
                wrapper.Attribute,
                block,
                env));
 }
Esempio n. 14
0
 private IEnumerable <IEmitVal> DeclareInputElementsImpl(
     IEmitBlock block,
     string name,
     StructInfo info)
 {
     foreach (var f in info.Fields)
     {
         var fieldElements = (DeclareInputElements(
                                  block,
                                  name,
                                  f.Info)).ToArray();
         foreach (var fe in fieldElements)
         {
             yield return(fe);
         }
     }
 }
Esempio n. 15
0
        private IEnumerable <IEmitVal> DeclareInputElementsImpl(
            IEmitBlock block,
            string name,
            InputElementInfo info)
        {
            _inputElementCount++;

            yield return(block.Struct(
                             "D3D11_INPUT_ELEMENT_DESC",
                             block.LiteralString(string.Format("USER_{0}", name)),
                             block.LiteralU32(0),
                             info.Format,
                             block.LiteralU32((UInt32)info.InputSlotIndex),
                             block.LiteralU32((UInt32)info.ByteOffset),
                             info.Index.InputSlotClass,
                             block.LiteralU32((UInt32)info.Index.StepRate)));
        }
Esempio n. 16
0
 private IEnumerable <IEmitVal> DeclareInputElements(
     IEmitBlock block,
     string name,
     AttributeInfo info)
 {
     try
     {
         return(DeclareInputElementsImpl(
                    block,
                    name,
                    (dynamic)info));
     }
     catch (D3D11InputAssemblerOperationTooComplex)
     {
         return(new IEmitVal[] { });
     }
 }
Esempio n. 17
0
        private IEmitVal EmitExpImpl(
            MidLetExp exp,
            IEmitBlock block,
            EmitEnv env)
        {
            var letVar = exp.Var;

            var letVal = EmitExp(exp.Exp, block, env);

            var letEnv = new EmitEnv(env);

            letEnv.Insert(letVar, (b) => letVal);

            var bodyVal = EmitExp(exp.Body, block, letEnv);

            return(bodyVal);
        }
Esempio n. 18
0
        public IEmitVal Lookup(
            MidVar var,
            IEmitBlock block)
        {
            Func <IEmitBlock, IEmitVal> generator;

            if (_vars.TryGetValue(var, out generator))
            {
                return(generator(block));
            }

            if (_outer != null)
            {
                return(_outer.Lookup(var, block));
            }

            throw new KeyNotFoundException();
        }
Esempio n. 19
0
        public IEmitVal Lookup(
            Mid.MidAttributeDecl attribute,
            IEmitBlock block)
        {
            Func <IEmitBlock, IEmitVal> generator;

            if (_attributes.TryGetValue(attribute, out generator))
            {
                return(generator(block));
            }

            if (_outer != null)
            {
                return(_outer.Lookup(attribute, block));
            }

            throw new KeyNotFoundException();
        }
Esempio n. 20
0
        private IEnumerable <IEmitVal> DeclareInputElementsImpl(
            IEmitBlock block,
            string name,
            AttributeInfo info)
        {
            // Default behavior is to emit an error: this value cannot (apparently)
            // be plumbed from the IA to the VS.
            //
            // We detect IA_VertexID and IA_IntanceID as special cases, since
            // they are so pervasive:
            if (info == _info[_vertexIDAttr])
            {
                Diagnostics.Add(
                    Severity.Error,
                    info.Range,
                    "The built-in attribute IA_VertexID cannot be plumbed from the D3D11 Input Assembler (IA) stage to the Vertex Shader (VS)");
                Diagnostics.Add(
                    Severity.Info,
                    info.Range,
                    "Consider using the equivalent VS-stage attribute VS_VertexID");
            }
            else if (info == _info[_instanceIDAttr])
            {
                Diagnostics.Add(
                    Severity.Error,
                    info.Range,
                    "The built-in attribute IA_InstanceID cannot be plumbed from the D3D11 Input Assembler (IA) stage to the Vertex Shader (VS)");
                Diagnostics.Add(
                    Severity.Info,
                    info.Range,
                    "Consider using the equivalent VS-stage attribute VS_InstanceID");
            }
            else
            {
                Diagnostics.Add(
                    Severity.Error,
                    info.Range,
                    "This value cannot be plumbed from the D3D11 Input Assembler (IA) stage to the Vertex Shader (VS)");
            }

            throw new D3D11InputAssemblerOperationTooComplex();
        }
Esempio n. 21
0
 public static IEmitVal LiteralF32(this IEmitBlock block, float val)
 {
     return(block.Target.LiteralF32(val));
 }
Esempio n. 22
0
 public static IEmitVal LiteralS32(this IEmitBlock block, Int32 val)
 {
     return(block.Target.LiteralS32(val));
 }
Esempio n. 23
0
 public static IEmitVal LiteralBool(this IEmitBlock block, bool val)
 {
     return(block.Target.LiteralBool(val));
 }
 private IEnumerable<IEmitVal> DeclareInputElements(
     IEmitBlock block,
     string name,
     AttributeInfo info)
 {
     try
     {
         return DeclareInputElementsImpl(
             block,
             name,
             (dynamic)info);
     }
     catch (D3D11InputAssemblerOperationTooComplex)
     {
         return new IEmitVal[] { };
     }
 }
        private IEnumerable<IEmitVal> DeclareInputElementsImpl(
            IEmitBlock block,
            string name,
            AttributeInfo info)
        {
            // Default behavior is to emit an error: this value cannot (apparently)
            // be plumbed from the IA to the VS.
            //
            // We detect IA_VertexID and IA_IntanceID as special cases, since
            // they are so pervasive:
            if (info == _info[_vertexIDAttr])
            {
                Diagnostics.Add(
                    Severity.Error,
                    info.Range,
                    "The built-in attribute IA_VertexID cannot be plumbed from the D3D11 Input Assembler (IA) stage to the Vertex Shader (VS)");
                Diagnostics.Add(
                    Severity.Info,
                    info.Range,
                    "Consider using the equivalent VS-stage attribute VS_VertexID");
            }
            else if (info == _info[_instanceIDAttr])
            {
                Diagnostics.Add(
                    Severity.Error,
                    info.Range,
                    "The built-in attribute IA_InstanceID cannot be plumbed from the D3D11 Input Assembler (IA) stage to the Vertex Shader (VS)");
                Diagnostics.Add(
                    Severity.Info,
                    info.Range,
                    "Consider using the equivalent VS-stage attribute VS_InstanceID");
            }
            else
            {
                Diagnostics.Add(
                    Severity.Error,
                    info.Range,
                    "This value cannot be plumbed from the D3D11 Input Assembler (IA) stage to the Vertex Shader (VS)");
            }

            throw new D3D11InputAssemblerOperationTooComplex();
        }
 private IEnumerable<IEmitVal> DeclareInputElementsImpl(
     IEmitBlock block,
     string name,
     StructInfo info)
 {
     foreach (var f in info.Fields)
     {
         var fieldElements = (DeclareInputElements(
             block,
             name,
             f.Info)).ToArray();
         foreach (var fe in fieldElements)
             yield return fe;
     }
 }
        private IEnumerable<IEmitVal> DeclareInputElementsImpl(
            IEmitBlock block,
            string name,
            InputElementInfo info)
        {
            _inputElementCount++;

            yield return block.Struct(
                "D3D11_INPUT_ELEMENT_DESC",
                block.LiteralString(string.Format("USER_{0}", name)),
                block.LiteralU32(0),
                info.Format,
                block.LiteralU32((UInt32) info.InputSlotIndex),
                block.LiteralU32((UInt32) info.ByteOffset),
                info.Index.InputSlotClass,
                block.LiteralU32((UInt32) info.Index.StepRate));
        }
Esempio n. 28
0
 public static IEmitVal Enum32(this IEmitBlock block, string type, string name, UInt32 val)
 {
     return(block.Target.Enum32(type, name, val));
 }
Esempio n. 29
0
 protected IEmitVal EmitExp(MidExp midExp, IEmitBlock block, EmitEnv env)
 {
     return EmitContext.EmitExp(midExp, block, env);
 }
 public void ApplyTo(IEmitBlock block)
 {
     foreach (var a in _actions)
         a(block);
 }
Esempio n. 31
0
        private void EmitShaderBinds(
            IEmitBlock block,
            string prefix,
            EmitContextHLSL hlslContext)
        {
            block.CallCOM(
                SubmitContext,
                "ID3D11DeviceContext",
                string.Format("{0}SetConstantBuffers", prefix),
                block.LiteralU32(0),
                block.LiteralU32(1),
                block.GetArrow(SubmitThis, EmitPass.CBField).GetAddress());

            var resources = hlslContext.ShaderResources.ToArray();
            var resourceCount = resources.Length;
            if (resourceCount != 0)
            {
                var resourceVals = (from r in resources
                                    select EmitContext.EmitExp(r, block, SubmitEnv)).ToArray();

                var resourcesVal = block.Temp(
                    string.Format("{0}Resources", prefix),
                    block.Array(
                        EmitTarget.GetOpaqueType("ID3D11ShaderResourceView*"),
                        resourceVals));

                block.CallCOM(
                    SubmitContext,
                    "ID3D11DeviceContext",
                    string.Format("{0}SetShaderResources", prefix),
                    block.LiteralU32(0),
                    block.LiteralU32((UInt32)resourceCount),
                    resourcesVal.GetAddress());
            }

            var samplers = hlslContext.SamplerStates.ToArray();
            var samplerCount = samplers.Length;
            if (samplerCount != 0)
            {
                var samplerVals = (from s in samplers
                                   select EmitContext.EmitExp(s, block, SubmitEnv)).ToArray();

                var samplersVal = block.Temp(
                    string.Format("{0}Samplers", prefix),
                    block.Array(
                        EmitTarget.GetOpaqueType("ID3D11SamplerState*"),
                        samplerVals));

                block.CallCOM(
                    SubmitContext,
                    "ID3D11DeviceContext",
                    string.Format("{0}SetSamplers", prefix),
                    block.LiteralU32(0),
                    block.LiteralU32((UInt32)samplerCount),
                    samplersVal.GetAddress());
            }
        }
Esempio n. 32
0
 public static IEmitVal CastRawPointer(
     this IEmitBlock block,
     IEmitVal val)
 {
     return(block.CastRawPointer(val, null));
 }
Esempio n. 33
0
 protected IEmitVal EmitExp(MidExp midExp, IEmitBlock block, EmitEnv env)
 {
     return(EmitContext.EmitExp(midExp, block, env));
 }