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 <marius.vlad@collabora.com>
This commit is contained in:
Marius Vlad 2025-02-27 17:59:40 +02:00
parent cda8de1089
commit 5beca735b0
2 changed files with 53 additions and 5 deletions

View file

@ -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;
};

View file

@ -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;