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