Skip to main content

inspect_rsx/
inspect_rsx.rs

1//! `cargo run -p rsx-reader --example inspect_rsx -- texture.bin shader.fpo`: read a 24-byte `CellGcmTexture` descriptor and
2//! a fragment `CgBinaryProgram`, and print the program's disassembly. The README's example is this file's body.
3use rsx_reader::{cgbinary, fragment, gcm};
4
5fn main() -> Result<(), Box<dyn std::error::Error>> {
6    let mut args = std::env::args().skip(1);
7    let (Some(texture_path), Some(shader_path)) = (args.next(), args.next()) else {
8        return Err("usage: inspect <texture.bin> <shader.fpo>".into());
9    };
10    let texture = gcm::CellGcmTexture::parse(&std::fs::read(texture_path)?)?; // exactly 24 bytes
11    println!(
12        "{}x{}, {} mips, linear: {}",
13        texture.width,
14        texture.height,
15        texture.mipmap,
16        texture.linear()
17    );
18
19    let shader = std::fs::read(shader_path)?;
20    let program = cgbinary::parse(&shader)?;
21    if let cgbinary::Stage::Fragment(_) = program.stage {
22        let code = fragment::decode(program.microcode)?;
23        print!("{}", code.disassemble());
24    }
25    Ok(())
26}