ShaderMake is a frond-end tool for batch multi-threaded shader compilation developed by NVIDIA DevTech. It is compatible with Microsoft FXC and DXC compilers by calling them via API functions or executing them through command line.
Features:
- Generates DXBC, DXIL and SPIR-V code.
- Outputs results in 3 formats: native binary, header file, and a binary blob containing all permutations for a given shader.
- Minimizes the number of re-compilation tasks by tracking file modification times and include trees.
During project deployment, the CMake script automatically searches for fxc and dxc and sets these variables:
FXC_PATH-fxcfrom Windows SDKDXC_PATH-dxcfrom Windows SDKDXC_SPIRV_PATH-dxcwith enabled SPIRV generation from Vulkan SDK
Usage:
ShaderMake.exe -p {DXBC|DXIL|SPIRV} --binary [--header --blob] -c "path/to/config"
-o "path/to/output" --compiler "path/to/compiler" [other options]
-D DEF1 -D DEF2=1 ... -I "path1" -I "path2" ...
-h, --help show this help message and exit
Required options:
-p, --platform=<str>- DXBC, DXIL or SPIRV-c, --config=<str>- Configuration file with the list of shaders to compile-o, --out=<str>- Output directory-b, --binary- Output binary files-h, --header- Output header files-B, --binaryBlob- Output binary blob files-H, --headerBlob- Output header blob files--compiler=<str>- Path to a FXC/DXC compiler
Compiler settings:
-m, --shaderModel=<str>- Shader model for DXIL/SPIRV (always SM 5.0 for DXBC)-O, --optimization=<int>- Optimization level 0-3 (default = 3, disabled = 0)--WX- Maps to '-WX' DXC/FXC option: warnings are errors--allResourcesBound- Maps to-all_resources_boundDXC/FXC option: all resources bound--PDB- Output PDB files inout/PDB/folder--stripReflection- Maps to-Qstrip_reflectDXC/FXC option: strip reflection information from a shader binary--matrixRowMajor- Maps to-ZprDXC/FXC option: pack matrices in row-major order--hlsl2021- Maps to-HV 2021DXC option: enable HLSL 2021 standard
Defines & include directories:
-I, --include=<str>- Include directory(s)-D, --define=<str>- Macro definition(s) in forms 'M=value' or 'M'
Other options:
-f, --force- Treat all source files as modified--sourceDir=<str>- Source code directory--relaxedInclude=<str>- Include file(s) not invoking re-compilation--outputExt=<str>- Extension for output files, default is one of.dxbc,.dxil,.spirv--serial- Disable multi-threading--flatten- Flatten source directory structure in the output directory--continue- Continue compilation if an error is occured--useAPI- Use FXC (d3dcompiler) or DXC (dxcompiler) API explicitly (Windows only)--colorize- Colorize console output--verbose- Print commands before they are executed
SPIRV options:
--vulkanVersion=<str>- Vulkan environment version, maps to-fspv-target-env(default = 1.3)--spirvExt=<str>- Maps to-fspv-extensionoption: add SPIR-V extension permitted to use--sRegShift=<int>- SPIRV: register shift for sampler (s#) resources--tRegShift=<int>- SPIRV: register shift for texture (t#) resources--bRegShift=<int>- SPIRV: register shift for constant (b#) resources--uRegShift=<int>- SPIRV: register shift for UAV (u#) resources
A config file consists of several lines, where each line has the following structure:
path/to/shader -T profile [-O3 -o "output/subdirectory" -E entry -D DEF1={0,1} -D DEF2={0,1,2} -D DEF3]
where:
path/to/shader- shader source file-T- shader profile, can be:vs- vertexps- pixelgs- geometryhs- hullds- domaincs- computems- meshas- amplification
-E- (optional) entry point (mainby default)-D- (optional) adds a macro definition to the list, optional range of possible values can be provided in{}-O- (optional) optimization level (global setting used by default)-o- (optional) output directory override
Additionally, the config file parser supports:
- One line comments starting with
// #ifdef D, whereDis a macro definition name (the statement resolves totrueifDis defined in the command line)#if 1and#if 0#else#endif
When the --blob command line argument is specified, ShaderMake will package multiple permutations for the same shader into a single "blob" file. These files use a custom format that is somewhat similar to regular TAR.
ShaderMake provides a small library with parsing functions to use these blob files in applications. This library can be statically linked with an application by including ShaderMake as a git submodule and linking the ShaderMakeBlob target to your application:
target_link_libraries(my_target PRIVATE ShaderMakeBlob)
Then include <ShaderMake/ShaderBlob.h> and use the ShaderMake::FindPermutationInBlob to locate a specific shader version in a blob. If that is unsuccessful, the ShaderMake::EnumeratePermutationsInBlob and/or ShaderMake::FormatShaderNotFoundMessage functions can help you provide a helpful error message to the user.