protected void EmitShaderSetup( EmitContextHLSL hlslContext, string profile, string stageName, string prefix) { var hlslSpan = hlslContext.Span; var bytecode = hlslContext.Compile(profile); InitBlock.AppendComment(hlslContext.Span); if (bytecode != null && bytecode.Length > 0) { EmitTarget.ShaderBytecodeCallback(prefix, bytecode); } var bytecodeLengthVal = InitBlock.Temp( "bytecodeSize", InitBlock.LiteralU32( (UInt32)bytecode.Length)); var bytecodeVal = InitBlock.Temp( "bytecode", InitBlock.LiteralData(bytecode)); // Terrible hack - save off vals in case of vertex shader... :( // This is required because creating an Input Layout // requires VS bytecode... for some reason... if (prefix == "VS") { EmitPass.VertexShaderBytecodeVal = bytecodeVal; EmitPass.VertexShaderBytecodeSizeVal = bytecodeLengthVal; } var shaderType = EmitTarget.GetOpaqueType( string.Format("ID3D11{0}Shader*", stageName)); var shaderNull = EmitTarget.GetNullPointer(shaderType); _shaderField = EmitClass.AddPrivateField( shaderType, string.Format("_{0}Shader", stageName)); InitBlock.SetArrow( CtorThis, _shaderField, shaderNull); var classLinkageNull = EmitTarget.GetNullPointer( EmitTarget.GetOpaqueType("ID3D11ClassLinkage*")); InitBlock.CallCOM( CtorDevice, "ID3D11Device", string.Format("Create{0}Shader", stageName), bytecodeVal, bytecodeLengthVal, classLinkageNull, InitBlock.GetArrow(CtorThis, _shaderField).GetAddress()); DtorBlock.CallCOM( DtorBlock.GetArrow(DtorThis, _shaderField), "IUnknown", "Release"); }