9 Profiler::Profiler(GlDbg &dbg):
10 decoder(gldecoder_new(this, 0)),
13 dbg.get_command_interpreter().register_command("profile", this, &Profiler::cmd_profile)
14 .set_help("Profiles GL usage and performance",
16 " Enables or disables profiling\n");
18 decoder->glDrawArrays = glDrawArrays;
19 decoder->glDrawElements = glDrawElements;
20 decoder->glDrawRangeElements = glDrawRangeElements;
21 decoder->glXSwapBuffers = glXSwapBuffers;
26 gldecoder_delete(decoder);
29 void Profiler::decode(const char *data, unsigned len)
32 gldecoder_decode(decoder, data, len);
35 void Profiler::cmd_profile(const string &args)
37 if(args.empty() || args=="on")
49 throw runtime_error("Invalid argument");
52 void Profiler::glDrawArrays(void *user_data, GLenum mode, int, int count)
54 glDrawElements(user_data, mode, count, 0, 0);
57 void Profiler::glDrawElements(void *user_data, GLenum mode, int count, GLenum, const void *)
59 Profiler *self = reinterpret_cast<Profiler *>(user_data);
62 self->vertices += count;
67 self->triangles += count/3;
69 case GL_TRIANGLE_STRIP:
72 self->triangles += count-2;
75 self->triangles += count/4;
79 self->triangles += count/2-1;
84 void Profiler::glDrawRangeElements(void *user_data, GLenum mode, unsigned, unsigned, int count, GLenum type, const void *data)
86 glDrawElements(user_data, mode, count, type, data);
89 void Profiler::glXSwapBuffers(void *user_data, Display *, GLXDrawable)
91 Profiler *self = reinterpret_cast<Profiler *>(user_data);
93 printf("%d draw calls, %d vertices, %d triangles\n", self->draw_calls, self->vertices, self->triangles);
100 float dt = (t-self->start)/1e6;
103 printf("%d frames in %.2f seconds\n", self->frames, dt);
109 Profiler::Time Profiler::get_time()
112 clock_gettime(CLOCK_REALTIME, &ts);
113 return ts.tv_sec*1000000+ts.tv_nsec/1000;