SPIR-V Debugging ================ SPIR-V is a binary shader intermediate representation used extensively by Vulkan applications. Mesa translates SPIR-V shaders into its internal NIR representation using the `spirv_to_nir` function. .. _spirv_capture: SPIR-V Shader Capture ~~~~~~~~~~~~~~~~~~~~~ Set the environment variable `MESA_SPIRV_DUMP_PATH` to a directory where the SPIR-V shaders will be captured. This is useful for debugging purposes, allowing developers to inspect the SPIR-V shaders provided by applications. Shader capture filenames are a hexadecimal representation of the shader's BLAKE3 hash. The file extension corresponds to the shader stage, e.g. `.vert` for vertex shaders or `.frag` for fragment shaders. It is usually necessary to disable the shader cache to activate the dump logic. This can be done by setting the `MESA_SHADER_CACHE_DISABLE` environment variable to `1`. .. code-block:: sh MESA_SPIRV_DUMP_PATH=$(pwd) MESA_SHADER_CACHE_DISABLE=1 vkcube .. _spirv_replacement: SPIR-V Shader Replacement ~~~~~~~~~~~~~~~~~~~~~~~~~ SPIR-V shaders can be replaced with alternative SPIR-V shaders during runtime. This is useful for debugging or testing purposes, allowing developers to swap out shaders without modifying the application. To enable shader replacement, set the environment variable `MESA_SPIRV_READ_PATH` to the directory containing the replacement SPIR-V shaders. The filenames of the replacement shaders must match the original shader's BLAKE3 hash and the extensions must match the original shader stages (e.g., `.vert`, `.frag`). It is usually necessary to disable the shader cache to ensure that the replacement shaders are used. This can be done by setting the `MESA_SHADER_CACHE_DISABLE` environment variable to `1`. When a shader is replaced, Mesa will log the replacement action, including the original shader's BLAKE3 hash and the filename of the replacement shader. Set `MESA_SPIRV_LOG_LEVEL=info` to see these log messages printed to `stderr`. .. code-block:: sh MESA_SPIRV_READ_PATH=$(pwd)/replace MESA_SPIRV_LOG_LEVEL=info MESA_SHADER_CACHE_DISABLE=1 vkcube To replace a shader with a modified version of a captured shader, you can convert the captured SPIR-V shader to GLSL, edit as needed, and then recompile it back to SPIR-V. .. code-block:: sh # Capture a SPIR-V shader MESA_SPIRV_DUMP_PATH=$(pwd) MESA_SHADER_CACHE_DISABLE=1 vkcube # Convert a captured SPIR-V shader to Vulkan-flavored GLSL # spriv-cross is bundled with the Vulkan SDK and also generally available via package managers spirv-cross -V 0x36c56e0f736238.frag --output 0x36c56e0f736238.frag.glsl # # Recompile the GLSL shader to SPIR-V # Some shaders may require additional flags, such as "--auto-map-locations" glslang -V 0x36c56e0f736238.frag.glsl -o replace/0x36c56e0f736238.frag # run the application with the replacement shader MESA_SPIRV_READ_PATH=$(pwd)/replace MESA_SPIRV_LOG_LEVEL=info MESA_SHADER_CACHE_DISABLE=1 vkcube