diff options
author | Eric Anholt <eric@anholt.net> | 2010-05-25 16:02:49 -0700 |
---|---|---|
committer | Eric Anholt <eric@anholt.net> | 2010-05-25 20:03:18 -0700 |
commit | 1805ba69f454a555163b2fa94cf70169b067fb71 (patch) | |
tree | abbec267fb1df023c5dcfbb0068d10860e9296b9 /glass.c | |
parent | 53d635423bbbdb1fc1c38dbe1ad3072584abc07f (diff) |
Add support for EXT_timer_query.
Diffstat (limited to 'glass.c')
-rw-r--r-- | glass.c | 78 |
1 files changed, 75 insertions, 3 deletions
@@ -103,8 +103,15 @@ GLUmat4 ring_obj_to_world[NUM_RINGS]; static time_t start_tv_sec = 0; static float start_time, cur_time, last_fps_time = 0; -int no_multi_draw_arrays = 0, benchmark = 0; static int frames = 0, last_fps_frames = 0; + +/* Timer queries */ +static GLboolean timers = GL_FALSE; +static float clear_time = 0, shadow_generate_time = 0; +static float rings_draw_time = 0, ground_draw_time = 0; +static GLuint timer_query; + +int no_multi_draw_arrays = 0, benchmark = 0; static SDL_Surface *sdl_surf = NULL; static GLboolean done = GL_FALSE; @@ -250,12 +257,60 @@ draw_shadow_map(void) } static void +start_timer_query(void) +{ + if (!timers) + return; + + if (!timer_query) + glGenQueries(1, &timer_query); + + glBeginQuery(GL_TIME_ELAPSED_EXT, timer_query); +} + +static void +end_timer_query(float *time) +{ + GLint passed; + + if (!timers) + return; + + glEndQuery(GL_TIME_ELAPSED_EXT); + glGetQueryObjectiv(timer_query, GL_QUERY_RESULT, &passed); + + *time += passed / 1000000000.0; +} + +static void +report_timers(void) +{ + if (!timers) + return; + + printf(" clear time: %.2f secs\n" + " shadow time: %.2f secs\n" + " rings time: %.2f secs\n" + " ground time: %.2f secs\n", + clear_time, + shadow_generate_time, + rings_draw_time, + ground_draw_time); + clear_time = 0; + shadow_generate_time = 0; + rings_draw_time = 0; + ground_draw_time = 0; +} + +static void draw(void) { int instance; + start_timer_query(); glClearColor(0.0, 0.0, 0.8, 0.0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + end_timer_query(&clear_time); glEnable(GL_CULL_FACE); glEnable(GL_DEPTH_TEST); @@ -264,15 +319,22 @@ draw(void) for (instance = 0; instance < NUM_RINGS; instance++) calc_new_ring_transforms(instance); + start_timer_query(); generate_rings_shadowmap(); + end_timer_query(&shadow_generate_time); glViewport(0, 0, win_width, win_height); if (display_shadow_map) { draw_shadow_map(); } else { + start_timer_query(); draw_rings(); + end_timer_query(&rings_draw_time); + + start_timer_query(); draw_ground(); + end_timer_query(&ground_draw_time); } SDL_GL_SwapBuffers(); @@ -288,6 +350,7 @@ draw(void) frames, total_time, frames / total_time) ; + report_timers(); done = GL_TRUE; } } @@ -521,6 +584,7 @@ idle(void) (cur_time - last_fps_time)); last_fps_time = cur_time; last_fps_frames = frames; + report_timers(); } } } @@ -548,7 +612,8 @@ key(SDLKey sym) static void usage(char *program) { - fprintf(stderr, "usage: %s [-nomultidraw] [-benchmark]\n", program); + fprintf(stderr, "usage: %s [-nomultidraw] [-benchmark] [-timers]\n", + program); exit(1); } @@ -613,6 +678,7 @@ int main(int argc, char **argv) int i; start_time = get_time_in_secs(); + last_fps_time = start_time; if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) < 0) errx(1, "sdl init fail"); @@ -623,7 +689,9 @@ int main(int argc, char **argv) for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-nomultidraw") == 0) no_multi_draw_arrays = 1; - if (strcmp(argv[i], "-benchmark") == 0) + else if (strcmp(argv[i], "-timers") == 0) + timers = 1; + else if (strcmp(argv[i], "-benchmark") == 0) benchmark = 1; else usage(argv[0]); @@ -631,6 +699,10 @@ int main(int argc, char **argv) init(); + if (timers && !GLEW_EXT_timer_query) { + errx(1, "Requires EXT_timer_query\n"); + } + while (!done) { SDL_Event event; |