use std::time::Instant;
use super::LivePixelFormat;
use super::source::StateGuard;
pub use super::damage::{DamageRects, UploadPlan};
pub use super::meta::LiveMeta;
pub use super::mips::{mip_bytes, mip_footprint, mip_level_size, mip_levels};
pub use super::pass::{
BAND_BYTES, LivePass, LivePassMode, LiveTextureBackend, PARK_BUDGET, PARK_MAX_TEXTURE,
PassCounts, PassTimings, QuadDecision, STAGING_BUDGET, TextureOutOfMemory,
};
pub use super::siblings::DeviceTextures;
pub struct LiveImageRead<'a> {
guard: StateGuard<'a>,
}
pub(crate) enum ReadAttempt<'a> {
Locked(LiveImageRead<'a>),
Busy,
}
impl<'a> LiveImageRead<'a> {
pub(crate) fn new(guard: StateGuard<'a>) -> Self {
Self { guard }
}
pub fn size(&self) -> Option<(u32, u32)> {
self.guard.state().size
}
pub fn stride(&self) -> usize {
self.guard.state().stride
}
pub fn pixels(&self) -> &[u8] {
&self.guard.state().pixels
}
pub fn format(&self) -> LivePixelFormat {
self.guard.shared().format
}
pub fn generation(&self) -> u64 {
self.guard.state().generation
}
pub fn plan(&self, cursor: Option<u64>) -> UploadPlan {
let state = self.guard.state();
let (w, h) = state.size.unwrap_or((0, 0));
state.ring.plan(cursor, state.generation, w, h)
}
pub fn commit_instant(&self, generation: u64) -> Option<Instant> {
self.guard.state().ring.commit_instant(generation)
}
}
impl std::fmt::Debug for LiveImageRead<'_> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("LiveImageRead")
.field("size", &self.size())
.field("generation", &self.generation())
.finish_non_exhaustive()
}
}