From 4ef522b7ff6679bc41cb799b77c209770d1b8067 Mon Sep 17 00:00:00 2001 From: Jeffy Chen Date: Tue, 18 Jul 2023 09:42:32 +0800 Subject: [PATCH 95/95] compositor: Delay DPMS-ON to finsih_frame() To make sure that the new frame is ready when turning on outputs. Signed-off-by: Jeffy Chen --- include/libweston/libweston.h | 1 + libweston/backend-drm/drm.c | 4 +--- libweston/compositor.c | 21 ++++++++++++++++++++- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/include/libweston/libweston.h b/include/libweston/libweston.h index 06a9ab9..2fda659 100644 --- a/include/libweston/libweston.h +++ b/include/libweston/libweston.h @@ -574,6 +574,7 @@ struct weston_output { void (*detach_head)(struct weston_output *output, struct weston_head *head); + bool pending_active; bool unavailable; bool freezing; diff --git a/libweston/backend-drm/drm.c b/libweston/backend-drm/drm.c index 658e2c3..e410fe9 100644 --- a/libweston/backend-drm/drm.c +++ b/libweston/backend-drm/drm.c @@ -3862,9 +3862,7 @@ config_handle_output(struct drm_backend *b, const char *name, continue; output->base.freezing = false; - - if (!output->virtual) - drm_set_dpms(&output->base, WESTON_DPMS_ON); + output->base.pending_active = 1; weston_output_damage(&output->base); } else if (!strncmp(config, "down-scale=", diff --git a/libweston/compositor.c b/libweston/compositor.c index 24f4f36..24099c5 100644 --- a/libweston/compositor.c +++ b/libweston/compositor.c @@ -3659,6 +3659,13 @@ weston_output_finish_frame(struct weston_output *output, struct timespec vblank_monotonic; int64_t msec_rel; + /* Delayed DPMS-ON to avoid showing old frame */ + if (output->pending_active) { + output->pending_active = false; + if (output->set_dpms) + output->set_dpms(output, WESTON_DPMS_ON); + } + /* * If timestamp of latest vblank is given, it must always go forwards. * If not given, INVALID flag must be set. @@ -5546,9 +5553,21 @@ weston_compositor_dpms(struct weston_compositor *compositor, { struct weston_output *output; - wl_list_for_each(output, &compositor->output_list, link) + wl_list_for_each(output, &compositor->output_list, link) { + /** + * Delay to weston_output_finish_frame() to avoid showing + * old frame + */ + if (state == WESTON_DPMS_ON) { + output->pending_active = true; + weston_output_damage(output); + continue; + } + output->pending_active = false; + if (output->set_dpms) output->set_dpms(output, state); + } } /** Restores the compositor to active status -- 2.20.1