1use crate::framebuffer::DrawCallStatistics;
25use std::fmt::{Display, Formatter};
26
27#[derive(Debug, Default, Copy, Clone)]
29pub struct PipelineStatistics {
30 pub texture_binding_changes: usize,
32 pub vbo_binding_changes: usize,
34 pub vao_binding_changes: usize,
36 pub blend_state_changes: usize,
38 pub framebuffer_binding_changes: usize,
40 pub program_binding_changes: usize,
42}
43
44impl std::ops::AddAssign for PipelineStatistics {
45 fn add_assign(&mut self, rhs: Self) {
46 self.texture_binding_changes += rhs.texture_binding_changes;
47 self.vbo_binding_changes += rhs.vbo_binding_changes;
48 self.vao_binding_changes += rhs.vao_binding_changes;
49 self.blend_state_changes += rhs.blend_state_changes;
50 self.framebuffer_binding_changes += rhs.framebuffer_binding_changes;
51 self.program_binding_changes += rhs.program_binding_changes;
52 }
53}
54
55impl std::ops::Sub for PipelineStatistics {
56 type Output = PipelineStatistics;
57
58 fn sub(self, rhs: Self) -> Self::Output {
59 Self {
60 texture_binding_changes: self.texture_binding_changes - rhs.texture_binding_changes,
61 vbo_binding_changes: self.vbo_binding_changes - rhs.vbo_binding_changes,
62 vao_binding_changes: self.vao_binding_changes - rhs.vao_binding_changes,
63 blend_state_changes: self.blend_state_changes - rhs.blend_state_changes,
64 framebuffer_binding_changes: self.framebuffer_binding_changes
65 - rhs.framebuffer_binding_changes,
66 program_binding_changes: self.program_binding_changes - rhs.program_binding_changes,
67 }
68 }
69}
70
71impl Display for PipelineStatistics {
72 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
73 write!(
74 f,
75 "Pipeline state changes:\n\
76 \tTextures: {},\n\
77 \tVBO: {},\n\
78 \tVAO: {},\n\
79 \tFBO: {},\n\
80 \tShaders: {},\n\
81 \tBlend: {}",
82 self.texture_binding_changes,
83 self.vbo_binding_changes,
84 self.vao_binding_changes,
85 self.framebuffer_binding_changes,
86 self.program_binding_changes,
87 self.blend_state_changes
88 )
89 }
90}
91
92#[derive(Debug, Copy, Clone, Default)]
94pub struct RenderPassStatistics {
95 pub draw_calls: usize,
97 pub triangles_rendered: usize,
99}
100
101impl Display for RenderPassStatistics {
102 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
103 write!(
104 f,
105 "Draw Calls: {}\n\
106 Triangles Rendered: {}",
107 self.draw_calls, self.triangles_rendered
108 )
109 }
110}
111
112impl std::ops::AddAssign for RenderPassStatistics {
113 fn add_assign(&mut self, rhs: Self) {
114 self.draw_calls += rhs.draw_calls;
115 self.triangles_rendered += rhs.triangles_rendered;
116 }
117}
118
119impl std::ops::AddAssign<DrawCallStatistics> for RenderPassStatistics {
120 fn add_assign(&mut self, rhs: DrawCallStatistics) {
121 self.draw_calls += 1;
122 self.triangles_rendered += rhs.triangles;
123 }
124}