#![allow(clippy::unwrap_used)]
use dxbc_reader::{decode, opcode_name, texture_reads};
type Read = (&'static str, u32, Option<u32>, bool, Option<u32>);
fn reads(name: &str) -> Vec<Read> {
let path = std::path::Path::new(env!("CARGO_MANIFEST_DIR"))
.join("tests/fixtures")
.join(name);
let bytes = std::fs::read(path).unwrap();
let program = decode(&dxbc_reader::code(&bytes).unwrap()).unwrap();
texture_reads(&program)
.into_iter()
.map(|r| {
assert!(!r.texture_indexed && !r.sampler_indexed);
(
opcode_name(r.opcode),
r.texture,
r.sampler,
r.comparison,
r.sampler_mode,
)
})
.collect()
}
#[test]
fn each_texture_read_names_the_texture_and_sampler_registers_the_listing_prints() {
assert_eq!(
reads("sampling.dxbc"),
[
("sample", 3, Some(1), false, Some(0)),
("sample_l", 4, Some(2), false, Some(0)),
("sample_b", 5, Some(1), false, Some(0)),
("sample_c", 6, Some(4), true, Some(1)),
("sample_c_lz", 6, Some(4), true, Some(1)),
("gather4", 3, Some(2), false, Some(0)),
("gather4_c", 6, Some(4), true, Some(1)),
("sample_d", 9, Some(1), false, Some(0)),
("ld", 20, None, false, None),
("ld", 21, None, false, None),
("ld_raw", 22, None, false, None),
("lod", 3, Some(2), false, Some(0)),
]
);
}
#[test]
fn a_program_without_texture_reads_lists_none() {
assert!(reads("compute_basic.dxbc").is_empty());
}
#[test]
fn a_comparison_instruction_names_a_comparison_sampler() {
for (name, _, sampler, comparison, mode) in reads("sampling.dxbc") {
if sampler.is_some() {
assert_eq!(comparison, mode == Some(1), "{name}");
}
}
}
#[test]
fn the_three_shader_models_of_one_source_read_alike() {
for name in [
"reflection_sm4.ps40.dxbc",
"reflection_sm4.ps41.dxbc",
"reflection_sm4.ps50.dxbc",
] {
assert_eq!(
reads(name),
[
("sample_c_lz", 0, Some(4), true, Some(1)),
("sample", 3, Some(0), false, Some(0)),
("sample", 0, Some(0), false, Some(0)),
],
"{name}"
);
}
}