diff --git a/Cargo.toml b/Cargo.toml index 382075918c..fb5a164439 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,3 +18,5 @@ spirv = { package = "spirv_headers", version = "1" } [dev-dependencies] env_logger = "0.6" +ron = "0.5" +serde = { version = "1", features = ["serde_derive"] } diff --git a/Makefile b/Makefile new file mode 100644 index 0000000000..d1240c235d --- /dev/null +++ b/Makefile @@ -0,0 +1,15 @@ +.PHONY: all clean + +all: boids.metallib + +clean: + rm *.metal *.air *.metallib + +%.metal: test-data/%.wgsl $(wildcard src/*.rs src/**/*.rs examples/*.rs) + cargo run --example convert -- $< $@ + +%.air: %.metal + xcrun -sdk macosx metal -c $< -mmacosx-version-min=10.11 + +%.metallib: %.air + xcrun -sdk macosx metallib $< -o $@ diff --git a/examples/convert.rs b/examples/convert.rs index aa266e8892..f9aacd29b4 100644 --- a/examples/convert.rs +++ b/examples/convert.rs @@ -1,5 +1,24 @@ +use serde::{Serialize, Deserialize}; use std::{env, fs}; +#[derive(Hash, PartialEq, Eq, Serialize, Deserialize)] +struct BindSource { + set: u32, + binding: u32, +} + +#[derive(Serialize, Deserialize)] +struct BindTarget { + buffer: Option, + texture: Option, + sampler: Option, +} + +#[derive(Default, Serialize, Deserialize)] +struct Parameters { + metal_bindings: naga::FastHashMap, +} + fn main() { env_logger::init(); @@ -20,17 +39,32 @@ fn main() { if args.len() <= 2 { println!("{:#?}", module); - } else if args[2].ends_with(".metal") { + return; + } + + let param_path = std::path::PathBuf::from(&args[1]) + .with_extension("ron"); + let params = match fs::read_to_string(param_path) { + Ok(string) => ron::de::from_str(&string).unwrap(), + Err(_) => Parameters::default(), + }; + + if args[2].ends_with(".metal") { use naga::back::msl; let mut binding_map = msl::BindingMap::default(); - binding_map.insert( - msl::BindSource { set: 0, binding: 0 }, - msl::BindTarget { buffer: None, texture: Some(1), sampler: None }, - ); - binding_map.insert( - msl::BindSource { set: 0, binding: 1 }, - msl::BindTarget { buffer: None, texture: None, sampler: Some(1) }, - ); + for (key, value) in params.metal_bindings { + binding_map.insert( + msl::BindSource { + set: key.set, + binding: key.binding, + }, + msl::BindTarget { + buffer: value.buffer, + texture: value.texture, + sampler: value.sampler, + }, + ); + } let options = msl::Options { binding_map: &binding_map, }; diff --git a/src/lib.rs b/src/lib.rs index 85f4fb7873..c1cf027b54 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -13,8 +13,8 @@ use std::{ }; -type FastHashMap = HashMap>; -type FastHashSet = HashSet>; +pub type FastHashMap = HashMap>; +pub type FastHashSet = HashSet>; #[derive(Clone, Debug)] pub struct Header { diff --git a/test-data/boids.ron b/test-data/boids.ron new file mode 100644 index 0000000000..1bf180ed2c --- /dev/null +++ b/test-data/boids.ron @@ -0,0 +1,7 @@ +( + metal_bindings: { + (set: 0, binding: 0): (buffer: Some(0), texture: None, sampler: None), + (set: 0, binding: 1): (buffer: Some(1), texture: None, sampler: None), + (set: 0, binding: 2): (buffer: Some(2), texture: None, sampler: None), + } +) \ No newline at end of file diff --git a/tests/convert.rs b/tests/convert.rs index 9740e41549..fe86a7034f 100644 --- a/tests/convert.rs +++ b/tests/convert.rs @@ -30,7 +30,19 @@ fn convert_boids() { let module = load_wgsl("boids"); { use naga::back::msl; - let binding_map = msl::BindingMap::default(); + let mut binding_map = msl::BindingMap::default(); + binding_map.insert( + msl::BindSource { set: 0, binding: 0 }, + msl::BindTarget { buffer: Some(0), texture: None, sampler: None }, + ); + binding_map.insert( + msl::BindSource { set: 0, binding: 1 }, + msl::BindTarget { buffer: Some(1), texture: None, sampler: Some(1) }, + ); + binding_map.insert( + msl::BindSource { set: 0, binding: 2 }, + msl::BindTarget { buffer: Some(2), texture: None, sampler: Some(1) }, + ); let options = msl::Options { binding_map: &binding_map, };