]> git.cworth.org Git - fips/commitdiff
Don't print a frame-time report for the first frame after glXMakeCurrent
authorCarl Worth <cworth@cworth.org>
Tue, 12 Nov 2013 22:03:40 +0000 (14:03 -0800)
committerCarl Worth <cworth@cworth.org>
Tue, 12 Nov 2013 22:03:40 +0000 (14:03 -0800)
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.

metrics.c

index 7b2a558985d525d554c89b23047d4aee550cbb8a..8f961331707569e0759bb635e3826af94bb1697a 100644 (file)
--- a/metrics.c
+++ b/metrics.c
@@ -74,6 +74,9 @@ typedef struct op_metrics
 
 struct metrics
 {
 
 struct metrics
 {
+       /* 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;
@@ -144,6 +147,8 @@ metrics_create (metrics_info_t *info)
 
        metrics->info = info;
 
 
        metrics->info = info;
 
+       metrics->first_frame = true;
+
        metrics->op = 0;
 
        metrics->timer_begun_id = 0;
        metrics->op = 0;
 
        metrics->timer_begun_id = 0;
@@ -852,10 +857,12 @@ metrics_end_frame_pre_swap (metrics_t *metrics)
 
        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 (frames == 0) {
+       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,