Crates.io | naga-to-tokenstream |
lib.rs | naga-to-tokenstream |
version | 0.7.1 |
source | src |
created_at | 2023-08-06 09:39:57.282215 |
updated_at | 2024-09-04 21:21:17.596361 |
description | Creates a TokenStream describing parts of a Naga module. |
homepage | https://github.com/LucentFlux/naga-to-tokenstream |
repository | https://github.com/LucentFlux/naga-to-tokenstream |
max_upload_size | |
id | 937017 |
size | 37,705 |
This library takes a Naga module and produces a proc_macro::TokenStream
giving information about the module. It is intended for use in other libraries which process a shader at compile time, for example in a proc macro or build script, to expose a large collection of useful information to the Rust compiler (and hence programmer) about items in the module.
This module generates the following items:
const
with a type representable in Rust.
glam
is enabled, then Glam types will be used to represent vectors and matrices.struct
for each WGSL struct
with types representable in Rust.
encase
is enabled, these structs will derive from encase::ShaderType
.naga
is enabled, these modules will also contain naga::AddressSpace
information.As an example, take the following shader, written in wgsl:
const ELEMENTS_LENGTH: u32 = 128u;
struct Foo {
a: i32,
b: vec4<u32>,
c: vec4<u32>,
}
struct Bar {
size: u32,
elements: array<vec2<bool>, ELEMENTS_LENGTH>,
foos: array<Foo>
}
@group(0) @binding(0) var<storage> bar: Bar;
@compute
@workgroup_size(256,1,1)
fn main() {
...
}
Then this crate would generate something like the following:
/// Equivalent Rust definitions of the constants defined in this module
pub mod constants {
pub mod ELEMENTS_LENGTH {
pub const NAME: &'static str = "ELEMENTS_LENGTH";
pub const VALUE: u32 = 128;
}
}
/// Equivalent Rust definitions of the types defined in this module
pub mod types {
// `encase::ShaderType` is only derived if the `encase` feature is enabled.
#[derive(Debug, PartialEq, Clone, encase::ShaderType)]
pub struct Foo {
a: i32,
// `glam` objects are only generated if the `glam` feature is enabled.
b: glam::u32::UVec4,
c: glam::u32::UVec4,
}
#[derive(Debug, PartialEq, Clone, encase::ShaderType)]
pub struct Bar {
size: u32,
elements: [glam::bool::BVec2; 128],
#[size(runtime)] // Only added if the `encase` feature is enabled.
foos: Vec<Foo>,
}
}
pub mod globals {
/// Information about the `bar` global variable within the shader module.
pub mod bar {
pub const NAME: &'static str = "bar";
pub type Ty = types::Bar;
pub const SPACE: naga::AddressSpace = naga::AddressSpace::Storage {
access: naga::StorageAccess::LOAD,
}
pub mod binding {
pub const GROUP: u32 = 0u32;
pub const BINDING: u32 = 0u32;
}
}
}
/// Information about the entry points within the module.
pub mod entry_points {
pub mod main {
pub const NAME: &'static str = "main";
/// The sourcecode for the shader, as a constant string, excluding any other entry points.
/// This is useful when the `minify` feature is enabled for this crate, as it allows more aggressive
/// minification to be performed with the knowledge of the specific entry point that will be used.
pub const EXCLUSIVE_SOURCE: &'static str = "...";
}
}
/// The sourcecode for the shader, as a constant string.
pub const SOURCE: &'static str = "...";