Пример #1
0
        private void DecomposeAttr(
            MidAttributeDecl midAttrDecl,
            int index)
        {
            DecomposeAttrContext context;

            context.index  = index;
            context.flavor = AttrCase.Combined;

            AttrInfo info = DecomposeAttr(midAttrDecl, context);

            try
            {
                var blendDesc = GetTargetBlendDesc(info);
                _renderTargetBlendDescs[index] = blendDesc;


                // Do validation stuff - basically, we need to
                // be sure that whatever expressions get put into
                // the _renderTargetSources[index] entry are more
                // or less the "same" source...
            }
            catch (D3D11PixelShaderOperationTooComplex)
            {
                // error should have been reported when
                // the exception was thrown
            }
        }
Пример #2
0
            public void BindAttribute(
                MidFacetDecl midFacet,
                MidAttributeDecl midAttr,
                Func <IEmitBlock, IEmitVal, IEmitVal> accessor,
                IEmitType type,
                string name)
            {
                int ii = 0;

                foreach (var a in midFacet.Attributes)
                {
                    if (a == midAttr)
                    {
                        Attributes[ii] = new ShaderAttributeInfo
                        {
                            AttributeDecl = midAttr,
                            Accessor      = accessor,
                            Type          = type,
                            Name          = name,
                        };
                        return;
                    }

                    ++ii;
                }
                throw new NotImplementedException();
            }
Пример #3
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);
        }
Пример #4
0
        private AttributeInfo DecomposeAttr(
            SourceRange range,
            MidAttributeDecl midAttrDecl)
        {
            var attrInfo = _info.Cache(midAttrDecl,
                                       () => DecomposeAttr(range, midAttrDecl.Exp));

            attrInfo.Range = range;
            return(attrInfo);
        }
Пример #5
0
 private AttributeInfo TryDecomposeAttr(
     SourceRange range,
     MidAttributeDecl midAttrDecl)
 {
     try
     {
         return(DecomposeAttr(range, midAttrDecl));
     }
     catch (D3D11InputAssemblerOperationTooComplex)
     {
         return(null);
     }
 }
Пример #6
0
        private void SetSource(
            ref MidExp srcExp,
            MidAttributeDecl attr)
        {
            if (srcExp != null)
            {
                if (srcExp is MidAttributeRef)
                {
                    var srcAttr = ((MidAttributeRef)srcExp).Decl;
                    if (srcAttr != attr)
                    {
                        throw OperationTooComplexError(srcExp.Range);
                    }
                }
                else
                {
                    throw OperationTooComplexError(srcExp.Range);
                }
            }

            srcExp = new MidAttributeRef(attr.Range, attr, new LazyFactory());
        }
Пример #7
0
        public override void EmitImplSetup()
        {
            var uniformElement = GetElement("Uniform");
            var iaElement      = GetElement("AssembledVertex");

            _vertexIDAttr   = GetAttribute(iaElement, "IA_VertexID").Attribute;
            _instanceIDAttr = GetAttribute(iaElement, "IA_InstanceID").Attribute;

            _info[_vertexIDAttr] = new IndexSourceInfo(_vertexIDAttr.Range)
            {
                InputSlotClass = InitBlock.Enum32("D3D11_INPUT_CLASSIFICATION", "D3D11_INPUT_PER_VERTEX_DATA", D3D11_INPUT_CLASSIFICATION.D3D11_INPUT_PER_VERTEX_DATA),
                StepRate       = 0
            };

            _info[_instanceIDAttr] = new IndexSourceInfo(_instanceIDAttr.Range)
            {
                InputSlotClass = InitBlock.Enum32("D3D11_INPUT_CLASSIFICATION", "D3D11_INPUT_PER_INSTANCE_DATA", D3D11_INPUT_CLASSIFICATION.D3D11_INPUT_PER_INSTANCE_DATA),
                StepRate       = 1
            };

            InitBlock.AppendComment("D3D11 Input Assembler");

            var inputElementInits = (from a in iaElement.Attributes
                                     where a.IsOutput
                                     let name = SharedHLSL.MapName(a)
                                                let attrInfo = TryDecomposeAttr(a.Range, a)
                                                               where attrInfo != null
                                                               from e in DeclareInputElements(InitBlock, name, attrInfo)
                                                               select e).ToArray();

            if (_inputElementCount != 0)
            {
                var inputElementDescsVal = InitBlock.Temp(
                    "inputElementDescs",
                    InitBlock.Array(
                        EmitTarget.GetBuiltinType("D3D11_INPUT_ELEMENT_DESC"),
                        inputElementInits));

                var inputLayoutPointerType = EmitTarget.GetOpaqueType("ID3D11InputLayout*");
                inputLayoutField = EmitClass.AddPrivateField(
                    inputLayoutPointerType,
                    "_inputLayout");
                InitBlock.SetArrow(
                    CtorThis,
                    inputLayoutField,
                    EmitTarget.GetNullPointer(inputLayoutPointerType));

                InitBlock.CallCOM(
                    CtorDevice,
                    "ID3D11Device",
                    "CreateInputLayout",
                    inputElementDescsVal.GetAddress(),
                    InitBlock.LiteralU32((UInt32)_inputElementCount),
                    EmitPass.VertexShaderBytecodeVal,
                    EmitPass.VertexShaderBytecodeSizeVal,
                    InitBlock.GetArrow(CtorThis, inputLayoutField).GetAddress());

                DtorBlock.CallCOM(
                    DtorBlock.GetArrow(DtorThis, inputLayoutField),
                    "IUnknown",
                    "Release");
            }
        }
Пример #8
0
 private AttrInfo DecomposeAttr(
     MidAttributeDecl midAttrDecl,
     DecomposeAttrContext context)
 {
     return(DecomposeAttr(midAttrDecl.Exp, context));
 }