8 releases
0.2.9 | Jul 6, 2024 |
---|---|
0.2.7 | Mar 23, 2024 |
0.2.4 | Dec 26, 2023 |
0.2.3 | Jun 1, 2023 |
0.2.0 | Oct 3, 2022 |
#558 in Graphics APIs
120KB
3K
SLoC
Shader Reflect
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:
cargo install shader-reflect
Usage
Run the following command to reflect a GLSL/HLSL shader source or a SPIR-V binary to conclude a JSON report:
# GLSL Shader source.
shader-reflect assets/spirv-spec.frag
# SPIR-V binary.
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.
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] <IN_PATH>
Arguments:
<IN_PATH> Input SPIR-V file paths.
Options:
-o, --out-path <OUT_PATH> Output JSON file path. The output is printed to stdout if this path is not given.
--reference-all-resources Reference all resources even they are never used by the entry points. By default, only the referenced resources are reflected.
--combine-image-samplers Combine separate sampled image and sampler at a same descriptor set and binding. By default, they are listed as separate objects.
--generate-unique-names Generate unique names for every resource variable, structure types, and type members. By default, the names are assigned with debug annotations in the input SPIR-V.
-I <INCLUDE_DIRECTORIES> The base directories of standard includes (`#include <...>`) in compilation of GLSL or HLSL shader sources.
-D <DEFINITIONS> Compiler definitions in compilation of GLSL or HLSL shader sources.
-e, --entry-point <ENTRY_POINT> Shader entry point function name in compilation of GLSL or HLSL shader.
-h, --help Print help information
-V, --version Print version information
Supported Shader Types
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.
Example Output
The spirv-spec.frag.spv
binary in the spirq
repository gives the following output:
{
"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": []
}
}
Dependencies
~33MB
~724K SLoC