use wgslender::{Error, MinifyOptions, minify_and_reflect};
const SHADER: &str = "\
struct Params {
resolution: vec2f,
time: f32,
frame: u32,
}
@group(0) @binding(0) var<uniform> params: Params;
@group(0) @binding(1) var<storage, read_write> positions: array<vec4f>;
fn wrap(value: f32, limit: f32) -> f32 {
return value - limit * floor(value / limit);
}
@compute @workgroup_size(64)
fn main(@builtin(global_invocation_id) id: vec3u) {
let index = id.x;
let position = positions[index];
let speed = 40.0 + f32(index % 8u) * 5.0;
let x = wrap(position.x + speed * params.time, params.resolution.x);
let y = wrap(position.y + speed * 0.5 * params.time, params.resolution.y);
positions[index] = vec4f(x, y, position.z, position.w);
}
";
fn main() -> Result<(), Error> {
let shader = minify_and_reflect(SHADER, &MinifyOptions::default())?;
let saved = shader.original_size - shader.minified_size;
println!(
"{} bytes -> {} bytes ({saved} saved, {}%)\n",
shader.original_size,
shader.minified_size,
saved * 100 / shader.original_size,
);
println!("{}\n", shader.code);
println!("bindings, as declared -> as emitted:");
for binding in &shader.reflection.bindings {
println!(
" @group({}) @binding({}) {} -> {}",
binding.group, binding.binding, binding.name, binding.name_mapped,
);
}
Ok(())
}