From b6e7ea5639154078b136b263d7a28a250359b30b Mon Sep 17 00:00:00 2001 From: Yuxuan Shui Date: Sat, 10 Jun 2023 14:11:30 +0100 Subject: [PATCH] core: don't update render statistics if we didn't actually render Sometimes a scheduled render can end up doing nothing, e.g. if the damage region is empty. In that case we don't have valid data to collect and thus shouldn't update the statistics. Signed-off-by: Yuxuan Shui --- src/backend/backend.c | 1 + src/common.h | 3 +++ src/picom.c | 13 ++++++++----- 3 files changed, 12 insertions(+), 5 deletions(-) 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; }