summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2010-05-25 16:02:49 -0700
committerEric Anholt <eric@anholt.net>2010-05-25 20:03:18 -0700
commit1805ba69f454a555163b2fa94cf70169b067fb71 (patch)
treeabbec267fb1df023c5dcfbb0068d10860e9296b9
parent53d635423bbbdb1fc1c38dbe1ad3072584abc07f (diff)
Add support for EXT_timer_query.
-rw-r--r--glass.c78
1 files changed, 75 insertions, 3 deletions
diff --git a/glass.c b/glass.c
index 14e1719..a670535 100644
--- a/glass.c
+++ b/glass.c
@@ -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;