Skip to main content

code

Function code 

Source
pub fn code(bytes: &[u8]) -> Result<Vec<u32>>
Expand description

The program’s token stream (its SHEX or SHDR part) as 32-bit little-endian words, for decode().

Examples found in repository?
examples/inspect_dxbc.rs (line 6)
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
Hide additional 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}