#spirv #vulkan #opengl #glsl #hlsl

app shader-reflect

SPIR-V/GLSL/HLSL shader interface reflection to JSON. (CLI)

3 releases

new 0.2.2 Jan 31, 2023
0.2.1 Jan 19, 2023
0.2.0 Oct 3, 2022

#275 in Graphics APIs

Download history 2/week @ 2022-10-14 2/week @ 2022-10-21 2/week @ 2022-11-11 3/week @ 2022-11-18 1/week @ 2022-11-25 1/week @ 2022-12-02 1/week @ 2022-12-09 2/week @ 2022-12-16 1/week @ 2022-12-23 1/week @ 2022-12-30 1/week @ 2023-01-06 17/week @ 2023-01-13 10/week @ 2023-01-20 33/week @ 2023-01-27

61 downloads per month

MIT/Apache

175KB
4K SLoC

Shader Reflect

Crate

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

~30MB
~665K SLoC