1 #include <msp/io/print.h>
2 #include <msp/time/units.h>
3 #include <msp/time/utils.h>
9 decoder(gldecoder_new(this, 0)),
12 decoder->glDrawArrays = glDrawArrays;
13 decoder->glDrawElements = glDrawElements;
14 decoder->glDrawRangeElements = glDrawRangeElements;
15 decoder->glXSwapBuffers = glXSwapBuffers;
18 void Profiler::enable()
25 start = Msp::Time::now();
28 void Profiler::disable()
33 int Profiler::decode(const char *data, unsigned len)
36 return gldecoder_decode(decoder, data, len);
41 void Profiler::glDrawArrays(void *user_data, GLenum mode, int, int count)
43 glDrawElements(user_data, mode, count, 0, 0);
46 void Profiler::glDrawElements(void *user_data, GLenum mode, int count, GLenum, const void *)
48 Profiler *self = reinterpret_cast<Profiler *>(user_data);
51 self->vertices += count;
56 self->triangles += count/3;
58 case GL_TRIANGLE_STRIP:
61 self->triangles += count-2;
64 self->triangles += count/4;
68 self->triangles += count/2-1;
73 void Profiler::glDrawRangeElements(void *user_data, GLenum mode, unsigned, unsigned, int count, GLenum type, const void *data)
75 glDrawElements(user_data, mode, count, type, data);
78 void Profiler::glXSwapBuffers(void *user_data, Display *, GLXDrawable)
80 Profiler *self = reinterpret_cast<Profiler *>(user_data);
82 IO::print("%d draw calls, %d vertices, %d triangles\n", self->draw_calls, self->vertices, self->triangles);
88 Msp::Time::TimeStamp t = Msp::Time::now();
89 Msp::Time::TimeDelta dt = t-self->start;
92 Msp::IO::print("%d frames in %s seconds\n", self->frames, dt);