Example #1
0
 public static extern int D3D10CompileEffectFromMemory([NativeTypeName("void *")] void *pData, [NativeTypeName("SIZE_T")] nuint DataLength, [NativeTypeName("LPCSTR")] sbyte *pSrcFileName, [NativeTypeName("const D3D10_SHADER_MACRO *")] D3D_SHADER_MACRO *pDefines, [NativeTypeName("ID3D10Include *")] ID3DInclude *pInclude, [NativeTypeName("UINT")] uint HLSLFlags, [NativeTypeName("UINT")] uint FXFlags, [NativeTypeName("ID3D10Blob **")] ID3DBlob **ppCompiledEffect, [NativeTypeName("ID3D10Blob **")] ID3DBlob **ppErrors);
 public static extern int D3D10CompileShader([NativeTypeName("LPCSTR")] sbyte *pSrcData, [NativeTypeName("SIZE_T")] nuint SrcDataSize, [NativeTypeName("LPCSTR")] sbyte *pFileName, [NativeTypeName("const D3D10_SHADER_MACRO *")] D3D_SHADER_MACRO *pDefines, [NativeTypeName("LPD3D10INCLUDE")] ID3DInclude *pInclude, [NativeTypeName("LPCSTR")] sbyte *pFunctionName, [NativeTypeName("LPCSTR")] sbyte *pProfile, [NativeTypeName("UINT")] uint Flags, [NativeTypeName("ID3D10Blob **")] ID3DBlob **ppShader, [NativeTypeName("ID3D10Blob **")] ID3DBlob **ppErrorMsgs);
 public static extern int D3D10PreprocessShader([NativeTypeName("LPCSTR")] sbyte *pSrcData, [NativeTypeName("SIZE_T")] nuint SrcDataSize, [NativeTypeName("LPCSTR")] sbyte *pFileName, [NativeTypeName("const D3D10_SHADER_MACRO *")] D3D_SHADER_MACRO *pDefines, [NativeTypeName("LPD3D10INCLUDE")] ID3DInclude *pInclude, [NativeTypeName("ID3D10Blob **")] ID3DBlob **ppShaderText, [NativeTypeName("ID3D10Blob **")] ID3DBlob **ppErrorMsgs);
Example #4
0
 public static extern HRESULT D3DCompile([NativeTypeName("LPCVOID")] void *pSrcData, [NativeTypeName("SIZE_T")] nuint SrcDataSize, [NativeTypeName("LPCSTR")] sbyte *pSourceName, [NativeTypeName("const D3D_SHADER_MACRO *")] D3D_SHADER_MACRO *pDefines, [NativeTypeName("const ID3DInclude *")] void *pInclude, [NativeTypeName("LPCSTR")] sbyte *pEntrypoint, [NativeTypeName("LPCSTR")] sbyte *pTarget, uint Flags1, uint Flags2, ID3DBlob **ppCode, ID3DBlob **ppErrorMsgs);
Example #5
0
 public static extern int D3DPreprocess([NativeTypeName("LPCVOID")] void *pSrcData, [NativeTypeName("SIZE_T")] nuint SrcDataSize, [NativeTypeName("LPCSTR")] sbyte *pSourceName, [NativeTypeName("const D3D_SHADER_MACRO *")] D3D_SHADER_MACRO *pDefines, ID3DInclude *pInclude, ID3DBlob **ppCodeText, ID3DBlob **ppErrorMsgs);
Example #6
0
 public static extern int D3DCompileFromFile([NativeTypeName("LPCWSTR")] ushort *pFileName, [NativeTypeName("const D3D_SHADER_MACRO *")] D3D_SHADER_MACRO *pDefines, ID3DInclude *pInclude, [NativeTypeName("LPCSTR")] sbyte *pEntrypoint, [NativeTypeName("LPCSTR")] sbyte *pTarget, [NativeTypeName("UINT")] uint Flags1, [NativeTypeName("UINT")] uint Flags2, ID3DBlob **ppCode, ID3DBlob **ppErrorMsgs);
Example #7
0
 public static extern int D3DCompile2([NativeTypeName("LPCVOID")] void *pSrcData, [NativeTypeName("SIZE_T")] nuint SrcDataSize, [NativeTypeName("LPCSTR")] sbyte *pSourceName, [NativeTypeName("const D3D_SHADER_MACRO *")] D3D_SHADER_MACRO *pDefines, [NativeTypeName("ID3DInclude *")] ID3DInclude *pInclude, [NativeTypeName("LPCSTR")] sbyte *pEntrypoint, [NativeTypeName("LPCSTR")] sbyte *pTarget, [NativeTypeName("UINT")] uint Flags1, [NativeTypeName("UINT")] uint Flags2, [NativeTypeName("UINT")] uint SecondaryDataFlags, [NativeTypeName("LPCVOID")] void *pSecondaryData, [NativeTypeName("SIZE_T")] nuint SecondaryDataSize, [NativeTypeName("ID3DBlob **")] ID3DBlob **ppCode, [NativeTypeName("ID3DBlob **")] ID3DBlob **ppErrorMsgs);
    /// <summary>
    /// Compiles a D2D1 pixel shader with <c>D2D_FULL_SHADER</c>.
    /// </summary>
    /// <param name="source">The HLSL source code to compile.</param>
    /// <param name="shaderProfile">The shader profile to use to compile the shader.</param>
    /// <returns>The bytecode for the compiled shader.</returns>
    private static ComPtr <ID3DBlob> CompileD2DFullShader(ReadOnlySpan <char> source, D2D1ShaderProfile shaderProfile)
    {
        // Encode the HLSL source to ASCII
        int maxLength = Encoding.ASCII.GetMaxByteCount(source.Length);

        byte[] buffer = ArrayPool <byte> .Shared.Rent(maxLength);

        int writtenBytes = Encoding.ASCII.GetBytes(source, buffer);

        using ComPtr <ID3DBlob> d3DBlobBytecode = default;
        using ComPtr <ID3DBlob> d3DBlobErrors   = default;

        int hResult;

        fixed(byte *bufferPtr = buffer)
        {
            // Prepare the macros for full shader compilation:
            //
            // -D D2D_FULL_SHADER
            // -D D2D_ENTRY=Execute
            D3D_SHADER_MACRO *macros = stackalloc D3D_SHADER_MACRO[]
            {
                new()
                {
                    Name       = (sbyte *)Unsafe.AsPointer(ref MemoryMarshal.GetReference(ASCII.D2D_FULL_SHADER)),
                    Definition = (sbyte *)Unsafe.AsPointer(ref MemoryMarshal.GetReference(ASCII.NullTerminator))
                },
                new()
                {
                    Name       = (sbyte *)Unsafe.AsPointer(ref MemoryMarshal.GetReference(ASCII.D2D_ENTRY)),
                    Definition = (sbyte *)Unsafe.AsPointer(ref MemoryMarshal.GetReference(ASCII.Execute))
                },
                new()
            };

            // Compile the shader with -ps_5_0 -O3 -We -Zpr
            hResult = DirectX.D3DCompile(
                pSrcData: bufferPtr,
                SrcDataSize: (nuint)writtenBytes,
                pSourceName: null,
                pDefines: macros,
                pInclude: D3DIncludeForD2D1EffectHelpers,
                pEntrypoint: (sbyte *)Unsafe.AsPointer(ref MemoryMarshal.GetReference(ASCII.Execute)),
                pTarget: (sbyte *)Unsafe.AsPointer(ref MemoryMarshal.GetReference(ASCII.GetPixelShaderProfile(shaderProfile))),
                Flags1: D3DCOMPILE.D3DCOMPILE_OPTIMIZATION_LEVEL3 | D3DCOMPILE.D3DCOMPILE_WARNINGS_ARE_ERRORS | D3DCOMPILE.D3DCOMPILE_PACK_MATRIX_ROW_MAJOR,
                Flags2: 0,
                ppCode: d3DBlobBytecode.GetAddressOf(),
                ppErrorMsgs: d3DBlobErrors.GetAddressOf());
        }

        ArrayPool <byte> .Shared.Return(buffer);

        // Throw if an error was retrieved, then also double check the HRESULT
        if (d3DBlobErrors.Get() is not null)
        {
            ThrowHslsCompilationException(d3DBlobErrors.Get());
        }

        hResult.Assert();

        return(d3DBlobBytecode.Move());
    }