shader-reflect
is a CLI frontend of the shader reflection library spirq
. It generates reflection JSONs from SPIR-V shader binaries. You can install shader-reflect
with:
bash
cargo install shader-reflect
Run the following command to reflect a GLSL/HLSL shader source or a SPIR-V binary to conclude a JSON report:
```bash
shader-reflect assets/spirv-spec.frag
shader-reflect assets/spirv-spec.frag.spv ```
or the following if you want all declared resources to be reflected even when they are never used by the shader.
bash
shader-reflect assets/spirv-spec.frag.spv --reference-all-resources
Please run shader-reflect -h
to get a detailed description of all the available command-line options.
``` Light weight SPIR-V query utility for graphics. (CLI)
Usage: shader-reflect [OPTIONS]
Arguments:
Options:
-o, --out-path #include <...>
) in compilation of GLSL or HLSL shader sources.
-D
shader-reflect
supports all shader types available in Vulkan including ray-tracing shaders and mesh shaders. Compiling from shader sources, the shader type is inferred from the extension names. The extension name follows the convention of glslangValidator
.
|Extension|Shader Stage|
|-|-|
|.vert
|Vertex shader|
|.tesc
|Tessellation control shader (or hull shader)|
|.tese
|Tessellation evaluation shader (or domain shader)|
|.geom
|Geometry shader|
|.frag
|Fragment shader|
|.comp
|Compute shader|
|.mesh
|Mesh shader|
|.task
|Task shader|
|.rgen
|Ray-generation shader|
|.rint
|Intersection shader|
|.rahit
|Any-hit shader|
|.rchit
|Closest-hit shader|
|.rmiss
|Miss shader|
|.rcall
|Callable shader|
A suffix of .glsl
or .hlsl
can be appended to explicitly specify the shading lanugages. shader-reflect
assumes GLSL if not given. For example, foo.vert
and bar.frag.glsl
are considered GLSL shaders; baz.comp.hlsl
is considered a HLSL shader.
The spirv-spec.frag.spv
binary in the spirq
repository gives the following output:
json
{
"EntryPoint": "main",
"ExecutionModel": "Fragment",
"Variables": {
"Inputs": [
{
"Name": "_42",
"Location": 2,
"Component": 0,
"Type": "vec4<f32>"
},
{
"Name": "_57",
"Location": 1,
"Component": 0,
"Type": "vec4<f32>"
},
{
"Name": "_33",
"Location": 0,
"Component": 0,
"Type": "vec4<f32>"
}
],
"Outputs": [
{
"Name": "_31",
"Location": 0,
"Component": 0,
"Type": "vec4<f32>"
}
],
"Descriptors": [
{
"Name": "_20",
"Set": 0,
"Binding": 0,
"DescriptorType": "UniformBuffer",
"Type": {
"Kind": "Struct",
"Members": [
{
"Name": "_18_0",
"Offset": 0,
"MemberType": {
"Kind": "Struct",
"Members": [
{
"Name": "_17_0",
"Offset": 0,
"MemberType": "u32"
},
{
"Name": "_17_1",
"Offset": 16,
"MemberType": {
"Kind": "Array",
"ElementType": "vec4<f32>",
"Count": 5,
"Stride": 16
}
},
{
"Name": "_17_2",
"Offset": 96,
"MemberType": "i32"
}
]
}
},
{
"Name": "_18_1",
"Offset": 112,
"MemberType": "u32"
}
]
},
"Count": 1
}
],
"PushConstants": [],
"SpecConstants": []
}
}