use crate::framebuffer::DrawCallStatistics;
use std::fmt::{Display, Formatter};
#[derive(Debug, Default, Copy, Clone)]
pub struct PipelineStatistics {
pub texture_binding_changes: usize,
pub vbo_binding_changes: usize,
pub vao_binding_changes: usize,
pub blend_state_changes: usize,
pub framebuffer_binding_changes: usize,
pub program_binding_changes: usize,
}
impl std::ops::AddAssign for PipelineStatistics {
fn add_assign(&mut self, rhs: Self) {
self.texture_binding_changes += rhs.texture_binding_changes;
self.vbo_binding_changes += rhs.vbo_binding_changes;
self.vao_binding_changes += rhs.vao_binding_changes;
self.blend_state_changes += rhs.blend_state_changes;
self.framebuffer_binding_changes += rhs.framebuffer_binding_changes;
self.program_binding_changes += rhs.program_binding_changes;
}
}
impl std::ops::Sub for PipelineStatistics {
type Output = PipelineStatistics;
fn sub(self, rhs: Self) -> Self::Output {
Self {
texture_binding_changes: self.texture_binding_changes - rhs.texture_binding_changes,
vbo_binding_changes: self.vbo_binding_changes - rhs.vbo_binding_changes,
vao_binding_changes: self.vao_binding_changes - rhs.vao_binding_changes,
blend_state_changes: self.blend_state_changes - rhs.blend_state_changes,
framebuffer_binding_changes: self.framebuffer_binding_changes
- rhs.framebuffer_binding_changes,
program_binding_changes: self.program_binding_changes - rhs.program_binding_changes,
}
}
}
impl Display for PipelineStatistics {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
write!(
f,
"Pipeline state changes:\n\
\tTextures: {},\n\
\tVBO: {},\n\
\tVAO: {},\n\
\tFBO: {},\n\
\tShaders: {},\n\
\tBlend: {}",
self.texture_binding_changes,
self.vbo_binding_changes,
self.vao_binding_changes,
self.framebuffer_binding_changes,
self.program_binding_changes,
self.blend_state_changes
)
}
}
#[derive(Debug, Copy, Clone, Default)]
pub struct RenderPassStatistics {
pub draw_calls: usize,
pub triangles_rendered: usize,
}
impl Display for RenderPassStatistics {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
write!(
f,
"Draw Calls: {}\n\
Triangles Rendered: {}",
self.draw_calls, self.triangles_rendered
)
}
}
impl std::ops::AddAssign for RenderPassStatistics {
fn add_assign(&mut self, rhs: Self) {
self.draw_calls += rhs.draw_calls;
self.triangles_rendered += rhs.triangles_rendered;
}
}
impl std::ops::AddAssign<DrawCallStatistics> for RenderPassStatistics {
fn add_assign(&mut self, rhs: DrawCallStatistics) {
self.draw_calls += 1;
self.triangles_rendered += rhs.triangles;
}
}