Spark.Emit.HLSL.EmitContextHLSL.Compile C# (CSharp) Method

Compile() public method

public Compile ( string profile ) : byte[]
profile string
return byte[]
        public byte[] Compile(string profile)
        {
            if (_hlslCompiler == null)
                _hlslCompiler = LoadHlslCompiler();

            if (_hlslCompiler == null)
            {
                _shared.Diagnostics.Add(
                    Severity.Error,
                    new SourceRange(),
                    "Could not load HLSL compiler from SparkCPP.dll");
                return new byte[] { };
            }

            string hlslErrors = null;
            var result = _hlslCompiler.Compile(
                Span.ToString(),
                "main",
                profile,
                out hlslErrors);

            if (!string.IsNullOrEmpty(hlslErrors))
            {
                FormatDiagnostics(hlslErrors, _shared.Diagnostics, profile);
            }

            return result;
        }

Usage Example

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