use locum_capture::hash::key;
use locum_capture::writer;
use locum_d3d11::readback;
pub use locum_d3d11::readback::Readback;
use windows::Win32::Graphics::Direct3D11::*;
use crate::settings::settings;
pub const IN_FLIGHT: u64 = 512 << 20;
pub type Read = Result<(String, Vec<String>), String>;
pub unsafe fn issue(c: &ID3D11DeviceContext4, resource: &ID3D11Resource) -> Result<Readback, String> {
if super::tiled::special(resource) {
return Err("tiled resource/pool requires mapped-tile readback; whole-resource copies can touch unmapped tiles".into());
}
unsafe { readback::issue(c, resource) }
}
pub unsafe fn read(immediate: &ID3D11DeviceContext4, rb: &Readback) -> Read {
let bytes = unsafe { rb.read(immediate) }?;
let hashes = locum_capture::layout::subresources(&rb.subs)
.iter()
.map(|s| key(&bytes[s.offset as usize..(s.offset + s.size) as usize]))
.collect();
let k = key(&bytes);
let blobs = &settings().blobs;
writer::blob(blobs, k.clone(), bytes, true);
Ok((k, hashes))
}
pub unsafe fn read_all(
immediate: &ID3D11DeviceContext4,
copies: Vec<(u64, Result<Readback, String>)>,
) -> Vec<(u64, Read)> {
copies
.into_iter()
.map(|(id, rb)| (id, rb.and_then(|rb| unsafe { read(immediate, &rb) })))
.collect()
}