diff --git a/src/backend/backend.c b/src/backend/backend.c index bacf29d..36f80cc 100644 --- a/src/backend/backend.c +++ b/src/backend/backend.c @@ -189,6 +189,7 @@ void paint_all_new(session_t *ps, struct managed_win *t) { ps->last_schedule_delay = now_us - ps->next_render; } } + ps->did_render = true; if (ps->backend_data->ops->prepare) { ps->backend_data->ops->prepare(ps->backend_data, ®_paint); diff --git a/src/common.h b/src/common.h index 65d0e7b..e183a1e 100644 --- a/src/common.h +++ b/src/common.h @@ -255,6 +255,9 @@ typedef struct session { uint64_t last_schedule_delay; /// When do we want our next frame to start rendering. uint64_t next_render; + /// Did we actually render the last frame. Sometimes redraw will be scheduled only + /// to find out nothing has changed. In which case this will be set to false. + bool did_render; /// Whether we can perform frame pacing. bool frame_pacing; diff --git a/src/picom.c b/src/picom.c index 8bb22d7..36c8a34 100644 --- a/src/picom.c +++ b/src/picom.c @@ -240,12 +240,15 @@ void schedule_render(session_t *ps, bool triggered_by_vblank) { (int)(render_time.tv_sec * 1000000L + render_time.tv_nsec / 1000L); if (ps->target_msc == ps->last_msc) { // The frame has just been displayed, record its render time; - log_trace("Last render call took: %d (gpu) + %d (cpu) us, " - "last_msc: %" PRIu64, - render_time_us, (int)ps->last_schedule_delay, ps->last_msc); - render_statistics_add_render_time_sample( - &ps->render_stats, render_time_us + (int)ps->last_schedule_delay); + if (ps->did_render) { + log_trace("Last render call took: %d (gpu) + %d (cpu) us, " + "last_msc: %" PRIu64, + render_time_us, (int)ps->last_schedule_delay, ps->last_msc); + render_statistics_add_render_time_sample( + &ps->render_stats, render_time_us + (int)ps->last_schedule_delay); + } ps->target_msc = 0; + ps->did_render = false; ps->last_schedule_delay = 0; }