compositor: stop creating outputs without head

To support heterogeneous outputs, the output must be created by the
same backend as the head(s) it is created for. Solve this by always
creating an output with a first head to attach that determines the
backend to use. Skip already attached first heads in drm_try_attach().

See: https://gitlab.freedesktop.org/wayland/weston/-/issues/268

Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
dev
Philipp Zabel 4 years ago committed by Pekka Paalanen
parent c6e47d177a
commit 4938f8f6e5
  1. 13
      compositor/main.c

@ -2152,7 +2152,9 @@ wet_output_handle_destroy(struct wl_listener *listener, void *data)
} }
static struct wet_output * static struct wet_output *
wet_layoutput_create_output(struct wet_layoutput *lo, const char *name) wet_layoutput_create_output_with_head(struct wet_layoutput *lo,
const char *name,
struct weston_head *head)
{ {
struct wet_output *output; struct wet_output *output;
@ -2162,7 +2164,7 @@ wet_layoutput_create_output(struct wet_layoutput *lo, const char *name)
output->output = output->output =
weston_compositor_create_output(lo->compositor->compositor, weston_compositor_create_output(lo->compositor->compositor,
NULL, name); head, name);
if (!output->output) { if (!output->output) {
free(output); free(output);
return NULL; return NULL;
@ -2315,8 +2317,8 @@ drm_try_attach(struct weston_output *output,
{ {
unsigned i; unsigned i;
/* try to attach all heads, this probably succeeds */ /* try to attach remaining heads, this probably succeeds */
for (i = 0; i < add->n; i++) { for (i = 1; i < add->n; i++) {
if (!add->heads[i]) if (!add->heads[i])
continue; continue;
@ -2432,7 +2434,8 @@ drm_process_layoutput(struct wet_compositor *wet, struct wet_layoutput *lo)
if (ret < 0) if (ret < 0)
return -1; return -1;
} }
output = wet_layoutput_create_output(lo, name); output = wet_layoutput_create_output_with_head(lo, name,
lo->add.heads[0]);
free(name); free(name);
name = NULL; name = NULL;

Loading…
Cancel
Save