示例#1
0
        private AttributeInfo GenerateInputElementsImpl(
            SourceRange range,
            string name,
            MidBuiltinType type,
            int vertexStream,
            IndexSourceInfo index,
            UInt32 baseOffset,
            int inputSlotIndex)
        {
            var format = MapBuiltinTypeFormat(type);

            return(new InputElementInfo(range)
            {
                Name = name,
                Format = format,
                ByteOffset = baseOffset,
                Index = index,
                InputSlotIndex = inputSlotIndex,
            });
        }
示例#2
0
        private AttributeInfo GenerateInputElementsImpl(
            SourceRange range,
            string name,
            MidStructRef type,
            int vertexStream,
            IndexSourceInfo index,
            UInt32 baseOffset,
            int inputSlotIndex)
        {
            var    fields      = new List <FieldInfo>();
            UInt32 totalOffset = baseOffset;

            foreach (var f in type.Fields)
            {
                // \todo: Align

                fields.Add(new FieldInfo
                {
                    Field = f,
                    Info  = GenerateInputElements(
                        range,
                        string.Format("{0}_{1}", name, f.Name.ToString()),
                        f.Type,
                        vertexStream,
                        index,
                        totalOffset)
                });

                totalOffset += GetSizeOf(f.Type);
            }

            return(new StructInfo(range)
            {
                Fields = fields.ToArray()
            });
        }
示例#3
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");
            }
        }
        private AttributeInfo GenerateInputElementsImpl(
            SourceRange range,
            string name,
            MidBuiltinType type,
            int vertexStream,
            IndexSourceInfo index,
            UInt32 baseOffset,
            int inputSlotIndex)
        {
            var format = MapBuiltinTypeFormat(type);

            return new InputElementInfo(range)
            {
                Name = name,
                Format = format,
                ByteOffset = baseOffset,
                Index = index,
                InputSlotIndex = inputSlotIndex,
            };
        }
        private AttributeInfo GenerateInputElementsImpl(
            SourceRange range,
            string name,
            MidStructRef type,
            int vertexStream,
            IndexSourceInfo index,
            UInt32 baseOffset,
            int inputSlotIndex)
        {
            var fields = new List<FieldInfo>();
            UInt32 totalOffset = baseOffset;
            foreach (var f in type.Fields)
            {
                // \todo: Align

                fields.Add(new FieldInfo
                {
                    Field = f,
                    Info = GenerateInputElements(
                      range,
                      string.Format("{0}_{1}", name, f.Name.ToString()),
                      f.Type,
                      vertexStream,
                      index,
                      totalOffset)
                });

                totalOffset += GetSizeOf(f.Type);
            }

            return new StructInfo(range) { Fields = fields.ToArray() };
        }
        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");
            }
        }