pub fn decode(words: &[u32]) -> Result<Decoded>Expand description
Decode a complete token stream: version token, length, then declarations and instructions to its end.
Examples found in repository?
examples/inspect_dxbc.rs (line 7)
3fn main() -> Result<(), Box<dyn std::error::Error>> {
4 let path = std::env::args().nth(1).ok_or("usage: inspect <shader.dxbc>")?;
5 let container = std::fs::read(path)?;
6 let code = dxbc_reader::code(&container)?; // the SHDR/SHEX part as 32-bit words
7 let program = dxbc_reader::decode(&code)?;
8 println!(
9 "{} with {} instructions",
10 program.target(),
11 program.instructions.len()
12 );
13
14 // Reflection and signatures straight from the container:
15 if let Some(rdef) = dxbc_reader::rdef(&container)? {
16 for binding in &rdef.bindings {
17 println!("{} at register {}", binding.name, binding.register);
18 }
19 }
20 let (stage, inputs, outputs) = dxbc_reader::signature_elements(&container)?;
21 println!("{stage:?}: {} inputs, {} outputs", inputs.len(), outputs.len());
22 Ok(())
23}More examples
examples/pairs_dxbc.rs (line 47)
33fn main() -> Result<(), Box<dyn std::error::Error>> {
34 let mut paths = Vec::new();
35 for argument in std::env::args().skip(1) {
36 files(Path::new(&argument), &mut paths)?;
37 }
38 let (mut programs, mut skipped) = (0_usize, 0_usize);
39 for path in &paths {
40 let bytes = std::fs::read(path)?;
41 let has_code = dxbc_reader::parts(&bytes)
42 .is_ok_and(|parts| parts.iter().any(|c| matches!(&c.kind, b"SHDR" | b"SHEX")));
43 if !has_code {
44 skipped += 1;
45 continue;
46 }
47 let program = match dxbc_reader::code(&bytes).and_then(|code| dxbc_reader::decode(&code)) {
48 Ok(program) => program,
49 Err(e) => {
50 eprintln!("{}: {e}", path.display());
51 continue;
52 }
53 };
54 programs += 1;
55 let hash = fnv1a64(&bytes);
56 let mut pairs = Pairs::new();
57 for read in dxbc_reader::texture_reads(&program) {
58 let texture = if read.texture_indexed {
59 format!("t[{}+]", read.texture)
60 } else {
61 format!("t{}", read.texture)
62 };
63 let sampler = match (read.sampler, read.sampler_indexed) {
64 (None, _) => "-".to_owned(),
65 (Some(slot), true) => format!("s[{slot}+]"),
66 (Some(slot), false) => format!("s{slot}"),
67 };
68 let mode = read
69 .sampler_mode
70 .map_or_else(|| "-".to_owned(), |m| m.to_string());
71 let entry = pairs
72 .entry((texture, sampler, read.comparison, mode))
73 .or_default();
74 entry.0 += 1;
75 *entry.1.entry(dxbc_reader::opcode_name(read.opcode)).or_default() += 1;
76 }
77 for ((texture, sampler, comparison, mode), (count, names)) in pairs {
78 let names: Vec<String> = names.iter().map(|(n, c)| format!("{n}x{c}")).collect();
79 println!(
80 "{hash:016x}\t{}\t{}\t{texture}\t{sampler}\t{}\t{mode}\t{count}\t{}",
81 path.display(),
82 program.kind.name(),
83 u8::from(comparison),
84 names.join(",")
85 );
86 }
87 }
88 eprintln!("{programs} programs, {skipped} files skipped");
89 Ok(())
90}