-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathspv_webgpu_transform.rs
More file actions
68 lines (56 loc) · 2.33 KB
/
spv_webgpu_transform.rs
File metadata and controls
68 lines (56 loc) · 2.33 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
use std::{env, fs, process};
fn main() {
let args: Vec<String> = env::args().collect();
if args.len() != 4 {
eprintln!(
"Usage: spv_webgpu_transform <combimg|dref|isnanisinf|storagecube|pruneunuseddref|immediates|bindingarray> <input.spv> <output.spv>"
);
process::exit(1);
}
let mode = &args[1];
let input_path = &args[2];
let output_path = &args[3];
let spv_bytes = fs::read(input_path).unwrap();
// ------
let spv = spirv_webgpu_transform::u8_slice_to_u32_vec(&spv_bytes);
let mut out_correction_map = None;
let out_spv = match mode.as_str() {
"combimg" => {
spirv_webgpu_transform::combimgsampsplitter(&spv, &mut out_correction_map).unwrap()
}
"dref" => spirv_webgpu_transform::drefsplitter(&spv, &mut out_correction_map).unwrap(),
"isnanisinf" => spirv_webgpu_transform::isnanisinfpatch(&spv).unwrap(),
"storagecube" => {
spirv_webgpu_transform::storagecubepatch(&spv, &mut out_correction_map).unwrap()
}
"pruneunuseddref" => spirv_webgpu_transform::pruneunuseddref(&spv).unwrap(),
"immediates" => spirv_webgpu_transform::immediatespatch(&spv).unwrap(),
"bindingarray" => {
spirv_webgpu_transform::splitbindingarray(&spv, &mut out_correction_map).unwrap()
}
mode => {
eprintln!("unknown mode {:?}", mode);
process::exit(1)
}
};
let out_spv_bytes = spirv_webgpu_transform::u32_slice_to_u8_vec(&out_spv);
// ------
eprintln!("Writing patched result to {}", output_path);
fs::write(output_path, out_spv_bytes).unwrap();
// Remember to sort your hash maps!
if let Some(correction_map) = out_correction_map {
eprintln!("Finished, patch summary: \n");
let mut sets = correction_map.sets.iter().collect::<Vec<_>>();
sets.sort_by_key(|(k, _)| **k);
for (set_num, set) in sets {
println!("Set {}:", set_num);
let mut bindings = set.bindings.iter().collect::<Vec<_>>();
bindings.sort_by_key(|(k, _)| **k);
for (binding_num, binding) in bindings {
println!("\tBinding {} <- {:?}", binding_num, binding.corrections);
}
}
} else {
eprintln!("Finished, no correction output map.");
}
}