https://github.com/penguinliong/inline-spirv-rs
Compile GLSL/HLSL/WGSL and inline SPIR-V right inside your crate.
https://github.com/penguinliong/inline-spirv-rs
glsl hlsl rust spirv wgsl
Last synced: 6 months ago
JSON representation
Compile GLSL/HLSL/WGSL and inline SPIR-V right inside your crate.
- Host: GitHub
- URL: https://github.com/penguinliong/inline-spirv-rs
- Owner: PENGUINLIONG
- License: apache-2.0
- Created: 2020-08-17T14:24:46.000Z (about 5 years ago)
- Default Branch: master
- Last Pushed: 2024-08-02T19:07:26.000Z (about 1 year ago)
- Last Synced: 2025-01-28T18:09:49.374Z (8 months ago)
- Topics: glsl, hlsl, rust, spirv, wgsl
- Language: Rust
- Homepage:
- Size: 49.8 KB
- Stars: 34
- Watchers: 3
- Forks: 7
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE-APACHE
Awesome Lists containing this project
README
# Inline SPIR-V & JIT SPIR-V
[](https://crates.io/crates/inline-spirv)
[](https://docs.rs/inline-spirv)`inline-spirv` and `jit-spirv` ease the way you write shaders. Although as game developers, we usually compile a permutation of shader stages for different objects and materials at runtime for the best flexibility; sometimes we *do* want to try out some new ideas and start up dirty. This crate helps you compile GLSL/HLSL shader in your Rust code, or in external files, into SPIR-V; and embed them right inside the binary, so you are freed from all the compilation hassle.
## How to Use
To inline shader source:
```rust
use inline_spirv::include_spirv;let spv: &'static [u32] = inline_spirv!(r#"
#version 450 core
void main() { gl_Position = vec4(0, 0, 0, 1); }
"#, vert);
```To include a external shader source file:
```rust
use inline_spirv::include_spirv;let spv: &'static [u32] = include_spirv!("assets/vert.hlsl", vert, hlsl, entry="Main");
```> Note: File paths consumed by `inline-spirv` are relative to the crate, i.e., the container directory of the project `Cargo.toml`.
To compile a runtime shader source just-in-time:
```rust
use jit_spirv::{jit_spirv, CompilationFeedback};let feedback: CompilationFeedback = jit_spirv!(r#"
#version 450
layout(binding=0) writeonly buffer _0 { float data[]; };
void main() {
data[gl_GlobalInvocationID.x] = 1.0;
}
"#, comp).unwrap();
let spv: &[u32] = &feedback.spv;
```To include a precompiled SPIR-V binary:
```rust
use inline_spirv::include_spirv;let spv: &'static [u32] = include_spirv!("assets/vert.spv");
```For the full list of options please refer to the [documentation](https://docs.rs/inline-spirv).
## Tips
The macro can be verbose especially you have a bunch of `#include`s, so please be aware of that you can alias and define a more customized macro for yourself:
```rust
use inline_spirv::include_spirv as include_spirv_raw;macro_rules! include_spirv {
($path:expr, $stage:ident) => {
include_spirv_raw!(
$path,
$stage, hlsl,
entry="my_entry_pt",
D VERBOSE_DEFINITION,
D ANOTHER_VERBOSE_DEFINITION="verbose definition substitution",
I "long/path/to/include/directory",
)
}
}// ...
let vert: &[u32] = include_spirv!("examples/demo/assets/demo.hlsl", vert);
```## License
This project is licensed under either of
* Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0)
* MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)at your option.