1*4882a593SmuzhiyunFrom 4ef522b7ff6679bc41cb799b77c209770d1b8067 Mon Sep 17 00:00:00 2001 2*4882a593SmuzhiyunFrom: Jeffy Chen <jeffy.chen@rock-chips.com> 3*4882a593SmuzhiyunDate: Tue, 18 Jul 2023 09:42:32 +0800 4*4882a593SmuzhiyunSubject: [PATCH 95/95] compositor: Delay DPMS-ON to finsih_frame() 5*4882a593Smuzhiyun 6*4882a593SmuzhiyunTo make sure that the new frame is ready when turning on outputs. 7*4882a593Smuzhiyun 8*4882a593SmuzhiyunSigned-off-by: Jeffy Chen <jeffy.chen@rock-chips.com> 9*4882a593Smuzhiyun--- 10*4882a593Smuzhiyun include/libweston/libweston.h | 1 + 11*4882a593Smuzhiyun libweston/backend-drm/drm.c | 4 +--- 12*4882a593Smuzhiyun libweston/compositor.c | 21 ++++++++++++++++++++- 13*4882a593Smuzhiyun 3 files changed, 22 insertions(+), 4 deletions(-) 14*4882a593Smuzhiyun 15*4882a593Smuzhiyundiff --git a/include/libweston/libweston.h b/include/libweston/libweston.h 16*4882a593Smuzhiyunindex 06a9ab9..2fda659 100644 17*4882a593Smuzhiyun--- a/include/libweston/libweston.h 18*4882a593Smuzhiyun+++ b/include/libweston/libweston.h 19*4882a593Smuzhiyun@@ -574,6 +574,7 @@ struct weston_output { 20*4882a593Smuzhiyun void (*detach_head)(struct weston_output *output, 21*4882a593Smuzhiyun struct weston_head *head); 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun+ bool pending_active; 24*4882a593Smuzhiyun bool unavailable; 25*4882a593Smuzhiyun bool freezing; 26*4882a593Smuzhiyun 27*4882a593Smuzhiyundiff --git a/libweston/backend-drm/drm.c b/libweston/backend-drm/drm.c 28*4882a593Smuzhiyunindex 658e2c3..e410fe9 100644 29*4882a593Smuzhiyun--- a/libweston/backend-drm/drm.c 30*4882a593Smuzhiyun+++ b/libweston/backend-drm/drm.c 31*4882a593Smuzhiyun@@ -3862,9 +3862,7 @@ config_handle_output(struct drm_backend *b, const char *name, 32*4882a593Smuzhiyun continue; 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun output->base.freezing = false; 35*4882a593Smuzhiyun- 36*4882a593Smuzhiyun- if (!output->virtual) 37*4882a593Smuzhiyun- drm_set_dpms(&output->base, WESTON_DPMS_ON); 38*4882a593Smuzhiyun+ output->base.pending_active = 1; 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun weston_output_damage(&output->base); 41*4882a593Smuzhiyun } else if (!strncmp(config, "down-scale=", 42*4882a593Smuzhiyundiff --git a/libweston/compositor.c b/libweston/compositor.c 43*4882a593Smuzhiyunindex 24f4f36..24099c5 100644 44*4882a593Smuzhiyun--- a/libweston/compositor.c 45*4882a593Smuzhiyun+++ b/libweston/compositor.c 46*4882a593Smuzhiyun@@ -3659,6 +3659,13 @@ weston_output_finish_frame(struct weston_output *output, 47*4882a593Smuzhiyun struct timespec vblank_monotonic; 48*4882a593Smuzhiyun int64_t msec_rel; 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun+ /* Delayed DPMS-ON to avoid showing old frame */ 51*4882a593Smuzhiyun+ if (output->pending_active) { 52*4882a593Smuzhiyun+ output->pending_active = false; 53*4882a593Smuzhiyun+ if (output->set_dpms) 54*4882a593Smuzhiyun+ output->set_dpms(output, WESTON_DPMS_ON); 55*4882a593Smuzhiyun+ } 56*4882a593Smuzhiyun+ 57*4882a593Smuzhiyun /* 58*4882a593Smuzhiyun * If timestamp of latest vblank is given, it must always go forwards. 59*4882a593Smuzhiyun * If not given, INVALID flag must be set. 60*4882a593Smuzhiyun@@ -5546,9 +5553,21 @@ weston_compositor_dpms(struct weston_compositor *compositor, 61*4882a593Smuzhiyun { 62*4882a593Smuzhiyun struct weston_output *output; 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun- wl_list_for_each(output, &compositor->output_list, link) 65*4882a593Smuzhiyun+ wl_list_for_each(output, &compositor->output_list, link) { 66*4882a593Smuzhiyun+ /** 67*4882a593Smuzhiyun+ * Delay to weston_output_finish_frame() to avoid showing 68*4882a593Smuzhiyun+ * old frame 69*4882a593Smuzhiyun+ */ 70*4882a593Smuzhiyun+ if (state == WESTON_DPMS_ON) { 71*4882a593Smuzhiyun+ output->pending_active = true; 72*4882a593Smuzhiyun+ weston_output_damage(output); 73*4882a593Smuzhiyun+ continue; 74*4882a593Smuzhiyun+ } 75*4882a593Smuzhiyun+ output->pending_active = false; 76*4882a593Smuzhiyun+ 77*4882a593Smuzhiyun if (output->set_dpms) 78*4882a593Smuzhiyun output->set_dpms(output, state); 79*4882a593Smuzhiyun+ } 80*4882a593Smuzhiyun } 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun /** Restores the compositor to active status 83*4882a593Smuzhiyun-- 84*4882a593Smuzhiyun2.20.1 85*4882a593Smuzhiyun 86