Fips was already dropping the first frame's report (waiting for
another frame to go by to ensure that all the queries are available in
order to compute deltas).
But we were getting wildly out-of-range frame timings for later frames
when the application switched contexts, (since fips was subtracting
query values obtained in one context frome value obtained in another
context). We fix this by dropping one frame-time report at every
context change.
We may very well want to use a different time source to obtain frame
times, since (for DOTA 2 at least) the reports from the dropped frames
would be particularly interesting to see (such as large frames
compiling many shaders or uploading a lot of texture data).
At least we're no longer getting the wild numbers that throw off the
graph scale so badly.
+ /* Flag to indicate first frame is being processed. */
+ bool first_frame;
+
/* Description of all available peformance counters, counter
* groups, their names and IDs, etc. */
metrics_info_t *info;
/* Description of all available peformance counters, counter
* groups, their names and IDs, etc. */
metrics_info_t *info;
+ metrics->first_frame = true;
+
metrics->op = 0;
metrics->timer_begun_id = 0;
metrics->op = 0;
metrics->timer_begun_id = 0;
glGetQueryObjectui64v (metrics->swap_end_timestamp_id,
GL_QUERY_RESULT, &swap_end_timestamp);
glGetQueryObjectui64v (metrics->swap_end_timestamp_id,
GL_QUERY_RESULT, &swap_end_timestamp);
+
+ if (metrics->first_frame) {
/* Print header */
printf ("# frame: Frame_Number Frame_Time_milliseconds Frame_latency_milliseconds CPU_load GPU_load\n");
/* Print header */
printf ("# frame: Frame_Number Frame_Time_milliseconds Frame_latency_milliseconds CPU_load GPU_load\n");
+
+ metrics->first_frame = false;
} else {
/* Subtract previous frame's times to get frame times. */
frame_time_ns = subtract_timestamp (swap_end_timestamp,
} else {
/* Subtract previous frame's times to get frame times. */
frame_time_ns = subtract_timestamp (swap_end_timestamp,