diff --git a/Cargo.toml b/Cargo.toml index 926d3bd53..f450153b9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -82,7 +82,11 @@ bincode = "1" bit-set = { version = "0.8", default-features = false } bit-vec = { version = "0.8", default-features = false } bitflags = "2.7" -bytemuck = { version = "1.21", features = ["derive", "min_const_generics"] } +bytemuck = { version = "1.21", features = [ + "derive", + "extern_crate_alloc", + "min_const_generics", +] } cfg_aliases = "0.2.1" cfg-if = "1" criterion = "0.5" diff --git a/benches/benches/shader.rs b/benches/benches/shader.rs index f1a949412..d7d8c5fc5 100644 --- a/benches/benches/shader.rs +++ b/benches/benches/shader.rs @@ -1,5 +1,5 @@ use criterion::*; -use std::{fs, path::PathBuf}; +use std::{fs, path::PathBuf, process::Command}; struct Input { filename: String, @@ -122,10 +122,22 @@ fn parse_glsl(stage: naga::ShaderStage, inputs: &Inputs) { } } +fn get_wgsl_inputs() -> Inputs { + let mut inputs = Inputs::from_dir("../naga/tests/in", "wgsl"); + + // remove "large-source" tests, they skew the results + inputs + .inner + .retain(|input| !input.filename.contains("large-source")); + + inputs +} + fn frontends(c: &mut Criterion) { let mut group = c.benchmark_group("front"); - let mut inputs_wgsl = Inputs::from_dir("../naga/tests/in", "wgsl"); + let mut inputs_wgsl = get_wgsl_inputs(); + group.throughput(Throughput::Bytes(inputs_wgsl.bytes())); group.bench_function("shader: naga module bincode decode", |b| { inputs_wgsl.parse(); @@ -154,16 +166,40 @@ fn frontends(c: &mut Criterion) { }); }); - let mut inputs_spirv = Inputs::from_dir("../naga/tests/in/spv", "spv"); - group.throughput(Throughput::Bytes(inputs_spirv.bytes())); - group.bench_function("shader: spv-in", |b| { - inputs_spirv.load(); + let inputs_spirv = Inputs::from_dir("../naga/tests/in/spv", "spvasm"); + // Assemble all the SPIR-V assembly. + let mut assembled_spirv = Vec::<Vec<u32>>::new(); + for input in &inputs_spirv.inner { + let output = Command::new("spirv-as") + .arg(&input.filename) + .arg("-o") + .arg("-") + .output() + .expect( + "Failed to execute spirv-as. It can be installed \ + q by installing the Vulkan SDK and adding it to your path.", + ); + + if !output.status.success() { + panic!( + "spirv-as failed: {}\n{}", + String::from_utf8_lossy(&output.stdout), + String::from_utf8_lossy(&output.stderr) + ); + } + + assembled_spirv.push(bytemuck::pod_collect_to_vec(&output.stdout)); + } + + let total_bytes = assembled_spirv.iter().map(|spv| spv.len() as u64).sum(); + + group.throughput(Throughput::Bytes(total_bytes)); + group.bench_function("shader: spv-in", |b| { b.iter(|| { let options = naga::front::spv::Options::default(); - for input in &inputs_spirv.inner { - let spv = bytemuck::cast_slice(&input.data); - let parser = naga::front::spv::Frontend::new(spv.iter().cloned(), &options); + for input in &assembled_spirv { + let parser = naga::front::spv::Frontend::new(input.iter().cloned(), &options); parser.parse().unwrap(); } }); @@ -189,7 +225,7 @@ fn frontends(c: &mut Criterion) { } fn validation(c: &mut Criterion) { - let mut inputs = Inputs::from_dir("../naga/tests/in", "wgsl"); + let mut inputs = get_wgsl_inputs(); let mut group = c.benchmark_group("validate"); group.throughput(Throughput::Bytes(inputs.bytes())); @@ -215,7 +251,7 @@ fn validation(c: &mut Criterion) { } fn backends(c: &mut Criterion) { - let mut inputs = Inputs::from_dir("../naga/tests/in", "wgsl"); + let mut inputs = get_wgsl_inputs(); let mut group = c.benchmark_group("back"); // While normally this would be done inside the bench_function callback, we need to diff --git a/examples/features/Cargo.toml b/examples/features/Cargo.toml index 21416e740..3165f2af2 100644 --- a/examples/features/Cargo.toml +++ b/examples/features/Cargo.toml @@ -18,6 +18,7 @@ ignored = ["wasm_bindgen_test"] [lib] path = "src/lib.rs" harness = false +bench = false [[bin]] name = "wgpu-examples"