X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=metrics.c;fp=metrics.c;h=c52bf2ee6c3557dd6b8b41dda820ac24bced4e5b;hb=851d05230af70b4a2f1f5754607d13f84d371887;hp=36ef90bf1c86b661204745b83aced491e675ed84;hpb=5894ec5a66b9131c06f6caefd8ec0b267ad9eea3;p=fips 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);