Lines Matching +full:0 +full:- +full:987

2 From: Jeffy Chen <jeffy.chen@rock-chips.com>
4 Subject: [PATCH 31/95] backend-drm: Add dummy output when no screens connected
8 Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
9 ---
11 desktop-shell/shell.c | 7 +-
12 libweston/backend-drm/drm-internal.h | 6 +
13 libweston/backend-drm/drm.c | 210 ++++++++++++++++++++++++++-
14 libweston/backend-drm/kms.c | 2 +-
16 6 files changed, 224 insertions(+), 7 deletions(-)
18 diff --git a/compositor/main.c b/compositor/main.c
19 index 987c8f9..f151a77 100644
20 --- a/compositor/main.c
22 @@ -2595,6 +2595,9 @@ drm_heads_changed(struct wl_listener *listener, void *arg)
32 diff --git a/desktop-shell/shell.c b/desktop-shell/shell.c
34 --- a/desktop-shell/shell.c
35 +++ b/desktop-shell/shell.c
36 @@ -4317,10 +4317,6 @@ shell_reposition_view_on_output_change(struct weston_view *view)
37 shsurf = get_shell_surface(view->surface);
40 -
41 - shsurf->saved_position_valid = false;
42 - set_maximized(shsurf, false);
43 - set_fullscreen(shsurf, false, NULL);
47 @@ -4447,6 +4443,9 @@ handle_output_resized(struct wl_listener *listener, void *data)
54 if (shell->lock_surface)
55 shell->lock_surface->committed(shell->lock_surface, 0, 0);
57 diff --git a/libweston/backend-drm/drm-internal.h b/libweston/backend-drm/drm-internal.h
59 --- a/libweston/backend-drm/drm-internal.h
60 +++ b/libweston/backend-drm/drm-internal.h
61 @@ -370,6 +370,9 @@ struct drm_backend {
71 @@ -667,6 +670,8 @@ void
80 @@ -675,6 +680,7 @@ to_drm_output(struct weston_output *base)
82 base->destroy != drm_virtual_output_destroy &&
84 + base->destroy != drm_dummy_output_destroy &&
85 base->destroy != drm_output_destroy)
88 diff --git a/libweston/backend-drm/drm.c b/libweston/backend-drm/drm.c
90 --- a/libweston/backend-drm/drm.c
91 +++ b/libweston/backend-drm/drm.c
92 @@ -213,8 +213,14 @@ drm_backend_update_outputs(struct drm_backend *b)
96 - if (!b->primary_head)
97 + if (!b->primary_head) {
98 + if (!b->dummy_output->enabled)
99 + weston_output_enable(b->dummy_output);
102 + if (b->dummy_output->enabled)
103 + weston_output_disable(b->dummy_output);
106 primary = b->primary_head->base.output;
108 @@ -1275,6 +1281,10 @@ drm_output_find_special_plane(struct drm_device *device,
112 + /* Ignore non-real planes */
113 + if (!plane->plane_id)
116 if (plane->type != type)
119 @@ -2710,11 +2720,15 @@ drm_head_destroy(struct weston_head *base)
121 weston_head_release(&head->base);
123 + if (!head->connector.connector_id)
126 drm_connector_fini(&head->connector);
128 if (head->backlight)
129 backlight_destroy(head->backlight);
135 @@ -2951,8 +2965,9 @@ drm_backend_update_connectors(struct drm_device *device,
137 &b->compositor->head_list, compositor_link) {
139 - if (!head)
140 + if (!head || !head->connector.connector_id)
143 connector_id = head->connector.connector_id;
145 if (head->connector.device != device)
146 @@ -3000,6 +3015,9 @@ drm_backend_update_connectors(struct drm_device *device,
150 + if (!head || !head->connector.connector_id)
153 conn = head->connector.conn;
155 if (conn->connection != DRM_MODE_CONNECTED ||
156 @@ -3029,6 +3047,8 @@ drm_backend_update_connectors(struct drm_device *device,
160 + weston_head_set_connection_status(&b->dummy_head->base,
161 + !b->primary_head);
164 weston_compositor_read_presentation_clock(b->compositor, &now);
165 @@ -3204,6 +3224,11 @@ drm_destroy(struct weston_compositor *ec)
169 + weston_output_destroy(b->dummy_output);
171 + if (b->dummy_head)
172 + drm_head_destroy(&b->dummy_head->base);
174 udev_input_destroy(&b->input);
176 wl_event_source_remove(b->config_timer);
177 @@ -3906,6 +3931,182 @@ config_timer_handler(void *data)
178 return 0;
187 + return 0;
194 + struct drm_backend *b = to_drm_backend(output_base->compositor);
196 + wl_signal_emit(&output_base->frame_signal, damage);
198 + if (b->use_pixman)
199 + return -1;
202 + output_base->compositor->renderer->repaint_output(output_base, damage);
203 + return -1;
209 + struct drm_backend *b = to_drm_backend(output_base->compositor);
212 + if (b->use_pixman)
213 + return 0;
221 + struct drm_backend *b = to_drm_backend(output_base->compositor);
224 + if (!b->use_pixman)
227 + return 0;
234 + struct drm_plane *plane = output->scanout_plane;
237 + if (output->base.enabled)
238 + drm_dummy_output_disable(&output->base);
240 + wl_list_for_each_safe(mode, next, &output_base->mode_list, link) {
241 + wl_list_remove(&mode->link);
245 + drm_plane_state_free(plane->state_cur, true);
246 + weston_plane_release(&plane->base);
247 + wl_list_remove(&plane->link);
248 + weston_drm_format_array_fini(&plane->formats);
258 + struct drm_backend *b = device->backend;
267 + output->device = device;
268 + output->crtc = NULL;
271 + output->gbm_bo_flags = GBM_BO_USE_LINEAR | GBM_BO_USE_RENDERING;
272 + output->gbm_format = DRM_FORMAT_XRGB8888;
275 + weston_output_init(&output->base, b->compositor, "DUMMY");
277 + output->base.enable = drm_dummy_output_enable;
278 + output->base.destroy = drm_dummy_output_destroy;
279 + output->base.disable = drm_dummy_output_disable;
281 + output->base.start_repaint_loop = drm_dummy_output_start_repaint_loop;
282 + output->base.repaint = drm_dummy_output_repaint;
283 + output->base.unavailable = true;
285 + weston_compositor_add_pending_output(&output->base, b->compositor);
289 + weston_output_release(&output->base);
294 + plane->type = WDRM_PLANE_TYPE_PRIMARY;
295 + plane->device = device;
296 + plane->state_cur = drm_plane_state_alloc(NULL, plane);
297 + plane->state_cur->complete = true;
299 + weston_drm_format_array_init(&plane->formats);
300 + fmt = weston_drm_format_array_add_format(&plane->formats,
301 + output->gbm_format);
304 + weston_plane_init(&plane->base, b->compositor, 0, 0);
305 + wl_list_insert(&device->plane_list, &plane->link);
307 + output->scanout_plane = plane;
309 + return &output->base;
316 + b->dummy_output = drm_dummy_output_create(b->drm);
317 + if (!b->dummy_output)
318 + return -1;
324 + mode->flags = WL_OUTPUT_MODE_CURRENT;
325 + mode->width = 1920;
326 + mode->height = 1080;
327 + mode->refresh = 60 * 1000LL;
329 + wl_list_insert(b->dummy_output->mode_list.prev, &mode->link);
331 + b->dummy_output->current_mode = mode;
333 + weston_output_set_scale(b->dummy_output, 1);
334 + weston_output_set_transform(b->dummy_output,
337 + b->dummy_head = zalloc(sizeof *b->dummy_head);
338 + if (!b->dummy_head)
341 + weston_head_init(&b->dummy_head->base, "DUMMY");
343 + b->dummy_head->base.backend_id = drm_head_destroy;
345 + weston_head_set_monitor_strings(&b->dummy_head->base,
347 + weston_compositor_add_head(b->compositor, &b->dummy_head->base);
348 + weston_output_attach_head(b->dummy_output, &b->dummy_head->base);
350 + return 0;
352 + drm_dummy_output_destroy(b->dummy_output);
353 + b->dummy_output = NULL;
354 + return -1;
360 @@ -4143,6 +4344,11 @@ drm_backend_create(struct weston_compositor *compositor,
364 + if (drm_backend_init_dummy(b) < 0) {
369 wl_list_init(&b->drm->writeback_connector_list);
370 if (drm_backend_update_connectors(b->drm, drm_device) < 0) {
371 weston_log("Failed to create heads for %s\n", b->drm->drm.filename);
372 diff --git a/libweston/backend-drm/kms.c b/libweston/backend-drm/kms.c
374 --- a/libweston/backend-drm/kms.c
375 +++ b/libweston/backend-drm/kms.c
376 @@ -1196,7 +1196,7 @@ drm_pending_state_apply_atomic(struct drm_pending_state *pending_state,
377 &b->compositor->head_list, compositor_link) {
380 - if (!head)
381 + if (!head || head == b->dummy_head)
385 diff --git a/libweston/compositor.c b/libweston/compositor.c
387 --- a/libweston/compositor.c
389 @@ -6932,6 +6932,9 @@ weston_output_set_color_outcome(struct weston_output *output)
390 struct weston_color_manager *cm = output->compositor->color_manager;
396 colorout = cm->create_output_color_outcome(cm, output);
399 --