fn plane_bytes_2d(format: wgpu::TextureFormat, w: u64, h: u64) -> u64 {
match format {
wgpu::TextureFormat::NV12 => w * h + w.div_ceil(2) * h.div_ceil(2) * 2,
wgpu::TextureFormat::P010 => w * h * 2 + w.div_ceil(2) * h.div_ceil(2) * 4,
other => {
let (bw, bh) = other.block_dimensions();
let bs = other.block_copy_size(None).unwrap_or(4) as u64;
w.div_ceil(bw as u64) * h.div_ceil(bh as u64) * bs
}
}
}
pub fn estimate_texture_bytes(
format: wgpu::TextureFormat,
width: u32,
height: u32,
depth_or_array_layers: u32,
sample_count: u32,
mip_level_count: u32,
) -> u64 {
let layers = depth_or_array_layers.max(1) as u64;
let samples = sample_count.max(1) as u64;
let levels = mip_level_count.max(1);
let mut total: u64 = 0;
for level in 0..levels {
let w = (width >> level).max(1) as u64;
let h = (height >> level).max(1) as u64;
let plane = plane_bytes_2d(format, w, h);
let level_bytes = plane.saturating_mul(layers);
let level_bytes = if level == 0 { level_bytes.saturating_mul(samples) } else { level_bytes };
total = total.saturating_add(level_bytes);
}
total
}
pub fn estimate_descriptor_bytes(d: &wgpu::TextureDescriptor<'_>) -> u64 {
estimate_texture_bytes(
d.format,
d.size.width,
d.size.height,
d.size.depth_or_array_layers,
d.sample_count,
d.mip_level_count,
)
}