From 281aa0a4d708ab6b2237865609da924fc1896245 Mon Sep 17 00:00:00 2001
From: Philipp Zabel
Date: Wed, 24 Mar 2021 13:38:27 +0100
Subject: [PATCH] backend-drm: enable multi-backend support
Insert the backend into the weston_compositor::backend_list instead
of setting weston_compositor::backend. The compositor uses this to
determine that the backend is capable of being loaded simultaneously
with other backends.
The DRM backend can only be loaded as primary backend.
Signed-off-by: Philipp Zabel
---
libweston/backend-drm/drm-internal.h | 9 ++++++++-
libweston/backend-drm/drm.c | 10 +++++++++-
2 files changed, 17 insertions(+), 2 deletions(-)
diff --git a/libweston/backend-drm/drm-internal.h b/libweston/backend-drm/drm-internal.h
index 7f427018a..ea0065f7c 100644
--- a/libweston/backend-drm/drm-internal.h
+++ b/libweston/backend-drm/drm-internal.h
@@ -739,7 +739,14 @@ to_drm_output(struct weston_output *base)
static inline struct drm_backend *
to_drm_backend(struct weston_compositor *base)
{
- return container_of(base->backend, struct drm_backend, base);
+ struct weston_backend *backend;
+
+ wl_list_for_each(backend, &base->backend_list, link) {
+ if (backend->destroy == drm_destroy)
+ return container_of(backend, struct drm_backend, base);
+ }
+
+ return NULL;
}
static inline struct drm_mode *
diff --git a/libweston/backend-drm/drm.c b/libweston/backend-drm/drm.c
index 53906416b..da87c933f 100644
--- a/libweston/backend-drm/drm.c
+++ b/libweston/backend-drm/drm.c
@@ -3263,6 +3263,8 @@ drm_destroy(struct weston_backend *backend)
struct drm_crtc *crtc, *crtc_tmp;
struct drm_writeback *writeback, *writeback_tmp;
+ wl_list_remove(&b->base.link);
+
wl_list_for_each_safe(crtc, crtc_tmp, &b->drm->crtc_list, link)
drm_crtc_destroy(crtc);
@@ -3802,7 +3804,7 @@ drm_backend_create(struct weston_compositor *compositor,
"Debug messages from DRM/KMS backend\n",
NULL, NULL, NULL);
- compositor->backend = &b->base;
+ wl_list_insert(&compositor->backend_list, &b->base.link);
if (parse_gbm_format(config->gbm_format,
pixel_format_get_info(DRM_FORMAT_XRGB8888),
@@ -4021,6 +4023,7 @@ err_udev:
err_launcher:
weston_launcher_destroy(compositor->launcher);
err_compositor:
+ wl_list_remove(&b->base.link);
#ifdef BUILD_DRM_GBM
if (b->gbm)
gbm_device_destroy(b->gbm);
@@ -4050,6 +4053,11 @@ weston_backend_init(struct weston_compositor *compositor,
return -1;
}
+ if (compositor->renderer) {
+ weston_log("drm backend must be the primary backend\n");
+ return -1;
+ }
+
config_init_to_defaults(&config);
memcpy(&config, config_base, config_base->struct_size);