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"); }