From 851d05230af70b4a2f1f5754607d13f84d371887 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Mon, 11 Nov 2013 18:31:02 -0800 Subject: [PATCH] Do something sensible for timestamp wrapping. Before we had this result in our frame timings (with the after/before counters printed): 0x0000000fffa65090 0x0000000ffea7f9a0 frame: 99 16.6684 16.4952 0.0195919 0 0x0000000000a540a0 0x0000000fffa65090 frame: 100 1.84467e+13 1.84467e+13 1.7174e-14 0 0x0000000001a2fd30 0x0000000000a540a0 frame: 101 16.6289 16.4461 0.0216595 0 And now we get: 0x0000000fff3ab690 0x0000000ffe3c4f10 frame: 2387 16.6726 16.609 0.0173506 0 0x000000000038b420 0x0000000fff3ab690 frame: 2388 16.6455 16.5858 0.0169653 0 0x000000000137b4c0 0x000000000038b420 frame: 2389 16.7118 16.6509 0.0168314 0 --- metrics.c | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/metrics.c b/metrics.c index 36ef90b..c52bf2e 100644 --- a/metrics.c +++ b/metrics.c @@ -113,6 +113,28 @@ struct metrics struct timespec cpu_time_ts; }; +/* Return (a - b) while accounting for the fact that between a and b, + * the counter may have wrapped around (with a maximum number of bits + * in the counter of GL_QUERY_COUNTER_BITS). */ +static uint64_t +subtract_timestamp (uint64_t a, uint64_t b) +{ + GLint timestamp_bits; + + glGetQueryiv (GL_TIMESTAMP, GL_QUERY_COUNTER_BITS, ×tamp_bits); + + /* Note: "<<" isn't defined for the number of bits in the + * type, and the compiler will punish you. + */ + if (timestamp_bits == 64) + return a - b; + + if (b > a) + return (1ull << timestamp_bits) + a - b; + else + return a - b; +} + metrics_t * metrics_create (metrics_info_t *info) { @@ -836,9 +858,11 @@ metrics_end_frame_pre_swap (metrics_t *metrics) printf ("# frame: Frame_Number Frame_Time_milliseconds Frame_latency_milliseconds CPU_load GPU_load\n"); } else { /* Subtract previous frame's times to get frame times. */ - frame_time_ns = swap_end_timestamp - metrics->previous_swap_end_timestamp; + frame_time_ns = subtract_timestamp (swap_end_timestamp, + metrics->previous_swap_end_timestamp); - latency_ns = swap_end_timestamp - metrics->swap_begin_timestamp; + latency_ns = subtract_timestamp (swap_end_timestamp, + metrics->swap_begin_timestamp); cpu_time = TIMESPEC_DIFF (metrics->previous_cpu_time_ts, metrics->cpu_time_ts); -- 2.43.0