#[derive(Clone, Copy, Debug, Default)]
pub struct PoolReport {
pub count: u32,
pub bytes: u64,
}
#[derive(Clone, Copy, Debug, Default)]
pub struct AtlasReport {
pub pages: u32,
pub bytes: u64,
pub entries: u32,
}
#[derive(Clone, Copy, Debug, Default)]
pub struct WgpuCounters {
pub enabled: bool,
pub buffers: i64,
pub textures: i64,
pub bind_groups: i64,
pub buffer_memory: i64,
pub texture_memory: i64,
}
#[derive(Clone, Copy, Debug, Default)]
pub struct MemoryReport {
pub images: PoolReport,
pub atlas: [AtlasReport; 2],
pub targets: PoolReport,
pub host_buffer: PoolReport,
pub contours: PoolReport,
pub glyph_paths: PoolReport,
pub ramps: PoolReport,
pub raster_cache: PoolReport,
pub wgpu: WgpuCounters,
}
impl MemoryReport {
pub fn total_bytes(&self) -> u64 {
self.images.bytes
+ self.atlas.iter().map(|a| a.bytes).sum::<u64>()
+ self.targets.bytes
+ self.raster_cache.bytes
+ self.host_buffer.bytes
+ self.contours.bytes
+ self.glyph_paths.bytes
+ self.ramps.bytes
}
}
pub(crate) fn wgpu_counters(device: &wgpu::Device) -> WgpuCounters {
let hal = device.get_internal_counters().hal;
WgpuCounters {
enabled: cfg!(feature = "counters"),
buffers: hal.buffers.read() as i64,
textures: hal.textures.read() as i64,
bind_groups: hal.bind_groups.read() as i64,
buffer_memory: hal.buffer_memory.read() as i64,
texture_memory: hal.texture_memory.read() as i64,
}
}
#[cfg(test)]
mod tests {
use super::{AtlasReport, MemoryReport, PoolReport, WgpuCounters};
#[test]
fn total_bytes_includes_every_valo_pool() {
let report = MemoryReport {
images: pool(1),
atlas: [atlas(2), atlas(3)],
targets: pool(4),
host_buffer: pool(5),
contours: pool(6),
glyph_paths: pool(7),
ramps: pool(8),
raster_cache: pool(9),
wgpu: WgpuCounters {
buffer_memory: 1_000,
texture_memory: 2_000,
..Default::default()
},
};
assert_eq!(report.total_bytes(), 45);
}
fn pool(bytes: u64) -> PoolReport {
PoolReport { count: 1, bytes }
}
fn atlas(bytes: u64) -> AtlasReport {
AtlasReport {
pages: 1,
bytes,
entries: 1,
}
}
}