1*4882a593SmuzhiyunFrom 1c0baf5e1507fbccab3bd3e523ae61df461d7bfc Mon Sep 17 00:00:00 2001 2*4882a593SmuzhiyunFrom: Jeffy Chen <jeffy.chen@rock-chips.com> 3*4882a593SmuzhiyunDate: Fri, 3 Jul 2020 10:20:40 +0800 4*4882a593SmuzhiyunSubject: [PATCH 27/93] Support holding display for the first app 5*4882a593Smuzhiyun 6*4882a593SmuzhiyunUse '-w' or '--warm-up' to enable it. 7*4882a593Smuzhiyun 8*4882a593SmuzhiyunSigned-off-by: Jeffy Chen <jeffy.chen@rock-chips.com> 9*4882a593Smuzhiyun--- 10*4882a593Smuzhiyun compositor/main.c | 5 +++++ 11*4882a593Smuzhiyun include/libweston/libweston.h | 2 ++ 12*4882a593Smuzhiyun libweston/compositor.c | 30 ++++++++++++++++++++++++++++++ 13*4882a593Smuzhiyun 3 files changed, 37 insertions(+) 14*4882a593Smuzhiyun 15*4882a593Smuzhiyundiff --git a/compositor/main.c b/compositor/main.c 16*4882a593Smuzhiyunindex d65f8aa..987c8f9 100644 17*4882a593Smuzhiyun--- a/compositor/main.c 18*4882a593Smuzhiyun+++ b/compositor/main.c 19*4882a593Smuzhiyun@@ -677,6 +677,7 @@ usage(int error_code) 20*4882a593Smuzhiyun " -f, --flight-rec-scopes=SCOPE\n\t\t\tSpecify log scopes to " 21*4882a593Smuzhiyun "subscribe to.\n\t\t\tCan specify multiple scopes, " 22*4882a593Smuzhiyun "each followed by comma\n" 23*4882a593Smuzhiyun+ " -w, --warm-up\t\tHold display for the first app\n" 24*4882a593Smuzhiyun " -h, --help\t\tThis help message\n\n"); 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun #if defined(BUILD_DRM_COMPOSITOR) 27*4882a593Smuzhiyun@@ -3581,6 +3582,8 @@ wet_main(int argc, char *argv[], const struct weston_testsuite_data *test_data) 28*4882a593Smuzhiyun bool wait_for_debugger = false; 29*4882a593Smuzhiyun struct wl_protocol_logger *protologger = NULL; 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun+ bool warm_up = false; 32*4882a593Smuzhiyun+ 33*4882a593Smuzhiyun const struct weston_option core_options[] = { 34*4882a593Smuzhiyun { WESTON_OPTION_STRING, "backend", 'B', &backend }, 35*4882a593Smuzhiyun { WESTON_OPTION_STRING, "shell", 0, &shell }, 36*4882a593Smuzhiyun@@ -3599,6 +3602,7 @@ wet_main(int argc, char *argv[], const struct weston_testsuite_data *test_data) 37*4882a593Smuzhiyun { WESTON_OPTION_BOOLEAN, "debug", 0, &debug_protocol }, 38*4882a593Smuzhiyun { WESTON_OPTION_STRING, "logger-scopes", 'l', &log_scopes }, 39*4882a593Smuzhiyun { WESTON_OPTION_STRING, "flight-rec-scopes", 'f', &flight_rec_scopes }, 40*4882a593Smuzhiyun+ { WESTON_OPTION_BOOLEAN, "warm-up", 'w', &warm_up }, 41*4882a593Smuzhiyun }; 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun wl_list_init(&wet.layoutput_list); 44*4882a593Smuzhiyun@@ -3785,6 +3789,7 @@ wet_main(int argc, char *argv[], const struct weston_testsuite_data *test_data) 45*4882a593Smuzhiyun wet.compositor->idle_time = idle_time; 46*4882a593Smuzhiyun wet.compositor->default_pointer_grab = NULL; 47*4882a593Smuzhiyun wet.compositor->exit = handle_exit; 48*4882a593Smuzhiyun+ wet.compositor->warm_up = warm_up; 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun weston_compositor_log_capabilities(wet.compositor); 51*4882a593Smuzhiyun 52*4882a593Smuzhiyundiff --git a/include/libweston/libweston.h b/include/libweston/libweston.h 53*4882a593Smuzhiyunindex a41ffba..bf8e20a 100644 54*4882a593Smuzhiyun--- a/include/libweston/libweston.h 55*4882a593Smuzhiyun+++ b/include/libweston/libweston.h 56*4882a593Smuzhiyun@@ -1340,6 +1340,8 @@ struct weston_compositor { 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun enum weston_output_flow output_flow; 59*4882a593Smuzhiyun struct weston_output *prefer_output; 60*4882a593Smuzhiyun+ 61*4882a593Smuzhiyun+ bool warm_up; 62*4882a593Smuzhiyun }; 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun struct weston_solid_buffer_values { 65*4882a593Smuzhiyundiff --git a/libweston/compositor.c b/libweston/compositor.c 66*4882a593Smuzhiyunindex 3da5f18..8ca0c27 100644 67*4882a593Smuzhiyun--- a/libweston/compositor.c 68*4882a593Smuzhiyun+++ b/libweston/compositor.c 69*4882a593Smuzhiyun@@ -179,6 +179,24 @@ weston_compositor_is_static_layer(struct weston_layer *layer) 70*4882a593Smuzhiyun } 71*4882a593Smuzhiyun } 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun+static bool 74*4882a593Smuzhiyun+weston_compositor_is_system_layer(struct weston_layer *layer) 75*4882a593Smuzhiyun+{ 76*4882a593Smuzhiyun+ if (!layer) 77*4882a593Smuzhiyun+ return false; 78*4882a593Smuzhiyun+ 79*4882a593Smuzhiyun+ switch (layer->position) { 80*4882a593Smuzhiyun+ case WESTON_LAYER_POSITION_BACKGROUND: 81*4882a593Smuzhiyun+ case WESTON_LAYER_POSITION_UI: 82*4882a593Smuzhiyun+ case WESTON_LAYER_POSITION_LOCK: 83*4882a593Smuzhiyun+ case WESTON_LAYER_POSITION_CURSOR: 84*4882a593Smuzhiyun+ case WESTON_LAYER_POSITION_FADE: 85*4882a593Smuzhiyun+ return true; 86*4882a593Smuzhiyun+ default: 87*4882a593Smuzhiyun+ return false; 88*4882a593Smuzhiyun+ } 89*4882a593Smuzhiyun+} 90*4882a593Smuzhiyun+ 91*4882a593Smuzhiyun /** Send wl_output events for mode and scale changes 92*4882a593Smuzhiyun * 93*4882a593Smuzhiyun * \param head Send on all resources bound to this head. 94*4882a593Smuzhiyun@@ -3234,7 +3252,14 @@ weston_compositor_build_view_list(struct weston_compositor *compositor, 95*4882a593Smuzhiyun wl_list_init(&compositor->view_list); 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun wl_list_for_each(layer, &compositor->layer_list, link) { 98*4882a593Smuzhiyun+ bool system_layer = weston_compositor_is_system_layer(layer); 99*4882a593Smuzhiyun+ 100*4882a593Smuzhiyun wl_list_for_each(view, &layer->view_list.link, layer_link.link) { 101*4882a593Smuzhiyun+ if (compositor->warm_up && !system_layer) { 102*4882a593Smuzhiyun+ weston_log("seeing the first app\n"); 103*4882a593Smuzhiyun+ compositor->warm_up = false; 104*4882a593Smuzhiyun+ } 105*4882a593Smuzhiyun+ 106*4882a593Smuzhiyun view_list_add(compositor, view, output); 107*4882a593Smuzhiyun } 108*4882a593Smuzhiyun } 109*4882a593Smuzhiyun@@ -3290,6 +3315,11 @@ weston_output_repaint(struct weston_output *output) 110*4882a593Smuzhiyun /* Rebuild the surface list and update surface transforms up front. */ 111*4882a593Smuzhiyun weston_compositor_build_view_list(ec, output); 112*4882a593Smuzhiyun 113*4882a593Smuzhiyun+ if (ec->warm_up) { 114*4882a593Smuzhiyun+ weston_log("holding display for the first app...\n"); 115*4882a593Smuzhiyun+ return -1; 116*4882a593Smuzhiyun+ } 117*4882a593Smuzhiyun+ 118*4882a593Smuzhiyun /* Find the highest protection desired for an output */ 119*4882a593Smuzhiyun wl_list_for_each(pnode, &output->paint_node_z_order_list, 120*4882a593Smuzhiyun z_order_link) { 121*4882a593Smuzhiyun-- 122*4882a593Smuzhiyun2.20.1 123*4882a593Smuzhiyun 124