From 5beca735b022ddb247cb0b39ed928874354fd4c9 Mon Sep 17 00:00:00 2001 From: Marius Vlad Date: Thu, 27 Feb 2025 17:59:40 +0200 Subject: [PATCH] backend-drm: Explicitly arm/disarm the page flip timer counter when drm-backend debug scope is set. This follows-up with the surface counter timer but because this is buried in the drm-backend we make use the drm-backend scope if there's a subscription to it and enable and arm the counter as well when that happens. Signed-off-by: Marius Vlad --- libweston/backend-drm/drm-internal.h | 1 + libweston/backend-drm/drm.c | 57 +++++++++++++++++++++++++--- 2 files changed, 53 insertions(+), 5 deletions(-) diff --git a/libweston/backend-drm/drm-internal.h b/libweston/backend-drm/drm-internal.h index be4955405..442f0c027 100644 --- a/libweston/backend-drm/drm-internal.h +++ b/libweston/backend-drm/drm-internal.h @@ -276,6 +276,7 @@ struct drm_backend { struct { uint32_t frame_counter_interval; struct wl_event_source *pageflip_timer_counter; + bool timer_armed; } perf_page_flips_stats; }; diff --git a/libweston/backend-drm/drm.c b/libweston/backend-drm/drm.c index 795b24954..af9a04775 100644 --- a/libweston/backend-drm/drm.c +++ b/libweston/backend-drm/drm.c @@ -222,7 +222,7 @@ pageflip_timer_counter_handler(void *data) } static int -drm_backend_pageflip_timer_create(struct drm_backend *b, uint32_t interval) +drm_backend_pageflip_counter_timer_create(struct drm_backend *b, uint32_t interval) { struct wl_event_loop *loop = NULL; struct weston_compositor *ec = b->compositor; @@ -241,11 +241,53 @@ drm_backend_pageflip_timer_create(struct drm_backend *b, uint32_t interval) b->perf_page_flips_stats.frame_counter_interval = interval; - /* arm it w/ interval */ + return 0; +} + +static void +drm_backend_pageflip_counter_timer_arm(struct drm_backend *b) +{ + if (!b->perf_page_flips_stats.pageflip_timer_counter) + return; + wl_event_source_timer_update(b->perf_page_flips_stats.pageflip_timer_counter, 1000 * b->perf_page_flips_stats.frame_counter_interval); - return 0; + b->perf_page_flips_stats.timer_armed = true; +} + +static void +drm_backend_pageflip_counter_timer_disarm(struct drm_backend *b) +{ + if (!b->perf_page_flips_stats.pageflip_timer_counter) + return; + + /* do not disarm the timer if there are subscriptions to this log scope */ + if (weston_log_scope_is_enabled(b->debug)) + return; + + wl_event_source_timer_update(b->perf_page_flips_stats.pageflip_timer_counter, 0); + + b->perf_page_flips_stats.timer_armed = false; +} + + +static void +drm_backend_pageflip_counter_timer_disable_cb(struct weston_log_subscription *sub, void *data) +{ + struct drm_backend *b = data; + assert(b->perf_page_flips_stats.timer_armed); + + drm_backend_pageflip_counter_timer_disarm(b); +} + +static void +drm_backend_pageflip_counter_timer_arm_cb(struct weston_log_subscription *sub, void *data) +{ + struct drm_backend *b = data; + + if (!b->perf_page_flips_stats.timer_armed) + drm_backend_pageflip_counter_timer_arm(b); } /** @@ -4128,7 +4170,9 @@ drm_backend_create(struct weston_compositor *compositor, b->debug = weston_compositor_add_log_scope(compositor, "drm-backend", "Debug messages from DRM/KMS backend\n", - NULL, NULL, NULL); + drm_backend_pageflip_counter_timer_arm_cb, + drm_backend_pageflip_counter_timer_disable_cb, + b); wl_list_insert(&compositor->backend_list, &b->base.link); @@ -4327,7 +4371,10 @@ drm_backend_create(struct weston_compositor *compositor, goto err_udev_monitor; } - drm_backend_pageflip_timer_create(b, DEFAULT_FRAME_RATE_INTERVAL); + drm_backend_pageflip_counter_timer_create(b, DEFAULT_FRAME_RATE_INTERVAL); + + if (weston_log_scope_is_enabled(b->debug)) + drm_backend_pageflip_counter_timer_arm(b); return b;