Esempio n. 1
0
        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");
        }