3 This file is part of gldbg
4 Copyright © 2010-2011 Mikko Rasa, Mikkosoft Productions
5 Distributed under the GPL
16 Profiler::Profiler(GlDbg &dbg):
17 decoder(gldecoder_new(this, 0)),
20 dbg.get_command_interpreter().register_command("profile", this, &Profiler::cmd_profile)
21 .set_help("Profiles GL usage and performance",
23 " Enables or disables profiling\n");
25 decoder->glDrawArrays = glDrawArrays;
26 decoder->glDrawElements = glDrawElements;
27 decoder->glDrawRangeElements = glDrawRangeElements;
28 decoder->glXSwapBuffers = glXSwapBuffers;
31 void Profiler::decode(const char *data, unsigned len)
34 gldecoder_decode(decoder, data, len);
37 void Profiler::cmd_profile(const string &args)
39 if(args.empty() || args=="on")
51 throw runtime_error("Invalid argument");
54 void Profiler::glDrawArrays(void *user_data, GLenum mode, int, int count)
56 glDrawElements(user_data, mode, count, 0, 0);
59 void Profiler::glDrawElements(void *user_data, GLenum mode, int count, GLenum, const void *)
61 Profiler *self = reinterpret_cast<Profiler *>(user_data);
64 self->vertices += count;
69 self->triangles += count/3;
71 case GL_TRIANGLE_STRIP:
74 self->triangles += count-2;
77 self->triangles += count/4;
81 self->triangles += count/2-1;
86 void Profiler::glDrawRangeElements(void *user_data, GLenum mode, unsigned, unsigned, int count, GLenum type, const void *data)
88 glDrawElements(user_data, mode, count, type, data);
91 void Profiler::glXSwapBuffers(void *user_data, Display *, GLXDrawable)
93 Profiler *self = reinterpret_cast<Profiler *>(user_data);
95 printf("%d draw calls, %d vertices, %d triangles\n", self->draw_calls, self->vertices, self->triangles);
102 float dt = (t-self->start)/1e6;
105 printf("%d frames in %.2f seconds\n", self->frames, dt);
111 Profiler::Time Profiler::get_time()
114 clock_gettime(CLOCK_REALTIME, &ts);
115 return ts.tv_sec*1000000+ts.tv_nsec/1000;