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;
24 void Profiler::decode(const char *data, unsigned len)
27 gldecoder_decode(decoder, data, len);
30 void Profiler::cmd_profile(const string &args)
32 if(args.empty() || args=="on")
44 throw runtime_error("Invalid argument");
47 void Profiler::glDrawArrays(void *user_data, GLenum mode, int, int count)
49 glDrawElements(user_data, mode, count, 0, 0);
52 void Profiler::glDrawElements(void *user_data, GLenum mode, int count, GLenum, const void *)
54 Profiler *self = reinterpret_cast<Profiler *>(user_data);
57 self->vertices += count;
62 self->triangles += count/3;
64 case GL_TRIANGLE_STRIP:
67 self->triangles += count-2;
70 self->triangles += count/4;
74 self->triangles += count/2-1;
79 void Profiler::glDrawRangeElements(void *user_data, GLenum mode, unsigned, unsigned, int count, GLenum type, const void *data)
81 glDrawElements(user_data, mode, count, type, data);
84 void Profiler::glXSwapBuffers(void *user_data, Display *, GLXDrawable)
86 Profiler *self = reinterpret_cast<Profiler *>(user_data);
88 printf("%d draw calls, %d vertices, %d triangles\n", self->draw_calls, self->vertices, self->triangles);
95 float dt = (t-self->start)/1e6;
98 printf("%d frames in %.2f seconds\n", self->frames, dt);
104 Profiler::Time Profiler::get_time()
107 clock_gettime(CLOCK_REALTIME, &ts);
108 return ts.tv_sec*1000000+ts.tv_nsec/1000;