2020-02-24 14:56:51 +00:00
# Naga
2020-03-06 02:14:58 +00:00
[![Matrix ](https://img.shields.io/badge/Matrix-%23naga%3Amatrix.org-blueviolet.svg )](https://matrix.to/#/#naga:matrix.org)
2020-02-27 04:28:18 +00:00
[![Crates.io ](https://img.shields.io/crates/v/naga.svg?label=naga )](https://crates.io/crates/naga)
[![Docs.rs ](https://docs.rs/naga/badge.svg )](https://docs.rs/naga)
2020-06-25 04:34:02 +00:00
[![Build Status ](https://github.com/gfx-rs/naga/workflows/pipeline/badge.svg )](https://github.com/gfx-rs/naga/actions)
2024-07-20 19:20:05 +00:00
![MSRV ](https://img.shields.io/badge/rustc-1.76+-blue.svg )
2021-05-06 16:24:57 +00:00
[![codecov.io ](https://codecov.io/gh/gfx-rs/naga/branch/master/graph/badge.svg?token=9VOKYO8BM2 )](https://codecov.io/gh/gfx-rs/naga)
2020-02-24 14:56:51 +00:00
2022-05-01 09:03:50 +00:00
The shader translation library for the needs of [wgpu ](https://github.com/gfx-rs/wgpu ).
2020-02-24 14:56:51 +00:00
## Supported end-points
2021-03-02 06:28:32 +00:00
Front-end | Status | Feature | Notes |
--------------- | ------------------ | ------- | ----- |
SPIR-V (binary) | :white_check_mark: | spv-in | |
2021-05-06 05:02:36 +00:00
WGSL | :white_check_mark: | wgsl-in | Fully validated |
2022-05-29 23:50:30 +00:00
GLSL | :ok: | glsl-in | GLSL 440+ and Vulkan semantics only |
2021-03-02 06:28:32 +00:00
Back-end | Status | Feature | Notes |
--------------- | ------------------ | -------- | ----- |
SPIR-V | :white_check_mark: | spv-out | |
2021-06-17 13:08:17 +00:00
WGSL | :ok: | wgsl-out | |
2021-03-02 06:28:32 +00:00
Metal | :white_check_mark: | msl-out | |
2022-04-15 11:21:34 +00:00
HLSL | :white_check_mark: | hlsl-out | Shader Model 5.0+ (DirectX 11+) |
2021-12-06 11:56:41 +00:00
GLSL | :ok: | glsl-out | GLSL 330+ and GLSL ES 300+ |
2021-03-02 06:28:32 +00:00
AIR | | | |
DXIL/DXIR | | | |
DXBC | | | |
DOT (GraphViz) | :ok: | dot-out | Not a shading language |
2020-09-23 04:48:31 +00:00
2021-01-30 21:52:40 +00:00
:white_check_mark: = Primary support — :ok: = Secondary support — :construction: = Unsupported, but support in progress
2021-02-05 17:22:24 +00:00
2021-02-24 15:49:27 +00:00
## Conversion tool
2023-12-01 19:02:00 +00:00
Naga can be used as a CLI, which allows testing the conversion of different code paths.
2022-05-03 03:45:25 +00:00
First, install `naga-cli` from crates.io or directly from GitHub.
```bash
# release version
cargo install naga-cli
# development version
2024-04-02 10:54:27 +00:00
cargo install naga-cli --git https://github.com/gfx-rs/wgpu.git
2022-05-03 03:45:25 +00:00
```
Then, you can run `naga` command.
2021-02-24 15:49:27 +00:00
```bash
2022-05-03 03:45:25 +00:00
naga my_shader.wgsl # validate only
naga my_shader.spv my_shader.txt # dump the IR module into a file
naga my_shader.spv my_shader.metal --flow-dir flow-dir # convert the SPV to Metal, also dump the SPIR-V flow graph to `flow-dir`
naga my_shader.wgsl my_shader.vert --profile es310 # convert the WGSL to GLSL vertex stage under ES 3.20 profile
2021-02-24 15:49:27 +00:00
```
2023-12-01 19:02:00 +00:00
As naga includes a default binary target, you can also use `cargo run` without installation. This is useful when you develop naga itself or investigate the behavior of naga at a specific commit (e.g. [wgpu ](https://github.com/gfx-rs/wgpu ) might pin a different version of naga than the `HEAD` of this repository).
2022-05-04 02:11:07 +00:00
```bash
cargo run my_shader.wgsl
```
2021-02-05 17:22:24 +00:00
## Development workflow
2021-06-13 12:38:40 +00:00
The main instrument aiding the development is the good old `cargo test --all-features --workspace` ,
2023-12-01 19:02:00 +00:00
which will run the unit tests and also update all the snapshots. You'll see these
2021-04-14 18:20:48 +00:00
changes in git before committing the code.
2021-02-05 17:22:24 +00:00
If working on a particular front-end or back-end, it may be convenient to
enable the relevant features in `Cargo.toml` , e.g.
```toml
default = ["spv-out"] #TEMP !
```
2023-12-01 19:02:00 +00:00
This allows IDE basic checks to report errors there unless your IDE is sufficiently configurable already.
2021-02-05 17:22:24 +00:00
Finally, when changes to the snapshots are made, we should verify that the produced shaders
2023-07-08 10:37:41 +00:00
are indeed valid for the target platforms they are compiled for:
2021-02-05 17:22:24 +00:00
```bash
2023-07-08 10:37:41 +00:00
cargo xtask validate spv # for Vulkan shaders, requires SPIRV-Tools installed
cargo xtask validate msl # for Metal shaders, requires XCode command-line tools installed
cargo xtask validate glsl # for OpenGL shaders, requires GLSLang installed
cargo xtask validate dot # for dot files, requires GraphViz installed
cargo xtask validate wgsl # for WGSL shaders
cargo xtask validate hlsl dxc # for HLSL shaders via DXC
cargo xtask validate hlsl fxc # for HLSL shaders via FXC
2021-02-05 17:22:24 +00:00
```