MakeArrayType() public method

public MakeArrayType ( ITypeHLSL elementType, EmitValHLSL elementCount ) : ITypeHLSL
elementType ITypeHLSL
elementCount EmitValHLSL
return ITypeHLSL
        public override void EmitImplSetup()
        {
            constantElement = GetElement( "Constant" );

            InitBlock.AppendComment( "D3D11 Geometry Shader" );

            var gsEnabledAttr = FindAttribute( constantElement, "__D3D11GeometryShaderEnabled" );
            if( gsEnabledAttr == null )
            {
                return;
            }

            var uniformElement = GetElement( "Uniform" );
            var fineVertexElement = GetElement( "FineVertex" );
            var rasterVertexElement = GetElement( "RasterVertex" );
            var geometryInputElement = GetElement( "GeometryInput" );
            var geometryOutputElement = GetElement( "GeometryOutput" );

            hlslContext = new EmitContextHLSL( SharedHLSL, Range, this.EmitClass.GetName() );
            var entryPointSpan = hlslContext.EntryPointSpan;

            var gsInstanceCount = GetAttribute( constantElement, "GS_InstanceCount" );
            var gsInputVertexCount = GetAttribute( constantElement, "GS_InputVertexCount" );
            var gsMaxOutputVertexCount = GetAttribute( constantElement, "GS_MaxOutputVertexCount" );
            var gsInstanceID = GetAttribute( geometryInputElement, "GS_InstanceID" );
            var gsInputVertices = GetAttribute( geometryInputElement, "GS_InputVertices" );
            var gsOutputStream = GetAttribute( geometryOutputElement, "GS_OutputStream" );

            hlslContext.GenerateConnectorType(fineVertexElement);
            hlslContext.GenerateConnectorType(rasterVertexElement);

            entryPointSpan.WriteLine( "[instance({0})]",
                hlslContext.EmitAttrLit( gsInstanceCount ) );
            entryPointSpan.WriteLine( "[maxvertexcount({0})]",
                hlslContext.EmitAttrLit( gsMaxOutputVertexCount ) );
            entryPointSpan.WriteLine( "void main(" );

            bool first = true;

            // \todo: "triangle" or appropriate prefix...
            hlslContext.DeclareParamAndBind(
                gsInputVertices,
                hlslContext.MakeArrayType(
                    hlslContext.GenerateConnectorType(fineVertexElement),
                    hlslContext.EmitAttribRef(gsInputVertexCount, null)),
                null,
                ref first,
                entryPointSpan,
                prefix: "triangle ");

            hlslContext.DeclareParamAndBind(
                gsOutputStream,
                null,
                ref first,
                entryPointSpan,
                prefix: "inout ");

            hlslContext.DeclareParamAndBind(
                gsInstanceID,
                "SV_GSInstanceID",
                ref first,
                entryPointSpan );

            entryPointSpan.WriteLine( "\t)" );
            entryPointSpan.WriteLine( "{" );

            var gi2go = hlslContext.EmitTempRecordCtor(
                entryPointSpan,
                geometryInputElement,
                GetAttribute(geometryOutputElement, "__gi2go"));

            hlslContext.BindAttr(
                GetAttribute(rasterVertexElement, "__gi2rv"),
                gi2go);

            var output = hlslContext.EmitConnectorCtor(
                entryPointSpan,
                geometryOutputElement );

            entryPointSpan.WriteLine( "}" );

            hlslContext.EmitConstantBufferDecl();

            EmitShaderSetup(
                hlslContext,
                "gs_5_0",
                "Geometry",
                "GS" );
        }