#[cfg(feature = "counters")]
use std::sync::atomic::{AtomicIsize, Ordering};
pub struct InternalCounter {
#[cfg(feature = "counters")]
value: AtomicIsize,
}
impl InternalCounter {
#[inline]
pub const fn new() -> Self {
InternalCounter {
#[cfg(feature = "counters")]
value: AtomicIsize::new(0),
}
}
#[cfg(feature = "counters")]
#[inline]
pub fn read(&self) -> isize {
self.value.load(Ordering::Relaxed)
}
#[cfg(not(feature = "counters"))]
#[inline]
pub fn read(&self) -> isize {
0
}
#[cfg(feature = "counters")]
#[inline]
pub fn take(&self) -> isize {
self.value.swap(0, Ordering::Relaxed)
}
#[cfg(not(feature = "counters"))]
#[inline]
pub fn take(&self) -> isize {
0
}
#[inline]
pub fn add(&self, _val: isize) {
#[cfg(feature = "counters")]
self.value.fetch_add(_val, Ordering::Relaxed);
}
#[inline]
pub fn sub(&self, _val: isize) {
#[cfg(feature = "counters")]
self.value.fetch_add(-_val, Ordering::Relaxed);
}
#[inline]
pub fn set(&self, _val: isize) {
#[cfg(feature = "counters")]
self.value.store(_val, Ordering::Relaxed);
}
}
impl Clone for InternalCounter {
fn clone(&self) -> Self {
InternalCounter {
#[cfg(feature = "counters")]
value: AtomicIsize::new(self.read()),
}
}
}
impl Default for InternalCounter {
fn default() -> Self {
Self::new()
}
}
impl std::fmt::Debug for InternalCounter {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
self.read().fmt(f)
}
}
#[allow(missing_docs)]
#[derive(Clone, Default)]
pub struct HalCounters {
pub buffers: InternalCounter,
pub textures: InternalCounter,
pub texture_views: InternalCounter,
pub bind_groups: InternalCounter,
pub bind_group_layouts: InternalCounter,
pub render_pipelines: InternalCounter,
pub compute_pipelines: InternalCounter,
pub pipeline_layouts: InternalCounter,
pub samplers: InternalCounter,
pub command_encoders: InternalCounter,
pub shader_modules: InternalCounter,
pub query_sets: InternalCounter,
pub fences: InternalCounter,
pub buffer_memory: InternalCounter,
pub texture_memory: InternalCounter,
pub memory_allocations: InternalCounter,
}
#[derive(Clone, Default)]
pub struct CoreCounters {
}
#[derive(Clone, Default)]
pub struct InternalCounters {
pub core: CoreCounters,
pub hal: HalCounters,
}