From 746a03068e7cf9841059bdad366ba661f7c8f5f5 Mon Sep 17 00:00:00 2001
From: Philipp Zabel
Date: Thu, 11 Mar 2021 13:26:45 +0100
Subject: [PATCH] libweston, backends: store backend pointer in struct
weston_head
Compositor code can use opaque pointer comparison to determine whether
a head belongs to a given backend. Store a backend pointer in struct
weston_head to enable the compositor to select the correct backend
specific output configuration code.
This also allows to use the backend pointer instead of the opaque
backend_id pointer to check whether a head belongs to a backend, so
replace the checks in all to_xyz_head() functions and drop backend_id.
Signed-off-by: Philipp Zabel
---
include/libweston/libweston.h | 4 +---
libweston/backend-drm/drm-internal.h | 4 ++--
libweston/backend-drm/drm.c | 6 +++---
libweston/backend-headless/headless.c | 7 ++++---
libweston/backend-rdp/rdp.c | 7 ++++---
libweston/backend-rdp/rdp.h | 4 ++--
libweston/backend-vnc/vnc.c | 8 ++++++--
libweston/backend-wayland/wayland.c | 7 ++++---
libweston/backend-x11/x11.c | 7 ++++---
9 files changed, 30 insertions(+), 24 deletions(-)
diff --git a/include/libweston/libweston.h b/include/libweston/libweston.h
index 3e4c571e5..afc28c14a 100644
--- a/include/libweston/libweston.h
+++ b/include/libweston/libweston.h
@@ -375,6 +375,7 @@ struct weston_color_characteristics {
*/
struct weston_head {
struct weston_compositor *compositor; /**< owning compositor */
+ struct weston_backend *backend; /**< owning backend */
struct wl_list compositor_link; /**< in weston_compositor::head_list */
struct wl_signal destroy_signal; /**< destroy callbacks */
@@ -406,9 +407,6 @@ struct weston_head {
/** Current content protection status */
enum weston_hdcp_protection current_protection;
-
- /** Opaque pointer used by backends to identify heads as theirs */
- const void *backend_id;
};
/** Output properties derived from its color characteristics and profile
diff --git a/libweston/backend-drm/drm-internal.h b/libweston/backend-drm/drm-internal.h
index 3fcb8e160..ecd6477d1 100644
--- a/libweston/backend-drm/drm-internal.h
+++ b/libweston/backend-drm/drm-internal.h
@@ -601,12 +601,12 @@ struct drm_output {
};
void
-drm_head_destroy(struct weston_head *head_base);
+drm_destroy(struct weston_compositor *ec);
static inline struct drm_head *
to_drm_head(struct weston_head *base)
{
- if (base->backend_id != drm_head_destroy)
+ if (base->backend->destroy != drm_destroy)
return NULL;
return container_of(base, struct drm_head, base);
}
diff --git a/libweston/backend-drm/drm.c b/libweston/backend-drm/drm.c
index 92aeea988..878607037 100644
--- a/libweston/backend-drm/drm.c
+++ b/libweston/backend-drm/drm.c
@@ -2272,7 +2272,7 @@ drm_head_create(struct drm_device *device, drmModeConnector *conn,
weston_head_init(&head->base, name);
free(name);
- head->base.backend_id = drm_head_destroy;
+ head->base.backend = &backend->base;
ret = drm_head_update_info(head, conn);
if (ret < 0)
@@ -2303,7 +2303,7 @@ err:
return -1;
}
-void
+static void
drm_head_destroy(struct weston_head *base)
{
struct drm_head *head = to_drm_head(base);
@@ -2692,7 +2692,7 @@ udev_drm_event(int fd, uint32_t mask, void *data)
return 1;
}
-static void
+void
drm_destroy(struct weston_compositor *ec)
{
struct drm_backend *b = to_drm_backend(ec);
diff --git a/libweston/backend-headless/headless.c b/libweston/backend-headless/headless.c
index f353955d8..967b503d7 100644
--- a/libweston/backend-headless/headless.c
+++ b/libweston/backend-headless/headless.c
@@ -88,12 +88,12 @@ static const uint32_t headless_formats[] = {
};
static void
-headless_head_destroy(struct weston_head *base);
+headless_destroy(struct weston_compositor *ec);
static inline struct headless_head *
to_headless_head(struct weston_head *base)
{
- if (base->backend_id != headless_head_destroy)
+ if (base->backend->destroy != headless_destroy)
return NULL;
return container_of(base, struct headless_head, base);
}
@@ -505,6 +505,7 @@ static int
headless_head_create(struct weston_compositor *compositor,
const char *name)
{
+ struct headless_backend *backend = to_headless_backend(compositor);
struct headless_head *head;
/* name can't be NULL. */
@@ -516,7 +517,7 @@ headless_head_create(struct weston_compositor *compositor,
weston_head_init(&head->base, name);
- head->base.backend_id = headless_head_destroy;
+ head->base.backend = &backend->base;
weston_head_set_connection_status(&head->base, true);
weston_head_set_supported_eotf_mask(&head->base,
diff --git a/libweston/backend-rdp/rdp.c b/libweston/backend-rdp/rdp.c
index 9e52ea60a..9fd1a3caa 100644
--- a/libweston/backend-rdp/rdp.c
+++ b/libweston/backend-rdp/rdp.c
@@ -534,6 +534,7 @@ rdp_output_create(struct weston_compositor *compositor, const char *name)
static int
rdp_head_create(struct weston_compositor *compositor, const char *name)
{
+ struct rdp_backend *backend = to_rdp_backend(compositor);
struct rdp_head *head;
head = zalloc(sizeof *head);
@@ -542,7 +543,7 @@ rdp_head_create(struct weston_compositor *compositor, const char *name)
weston_head_init(&head->base, name);
- head->base.backend_id = rdp_head_destroy;
+ head->base.backend = &backend->base;
weston_head_set_connection_status(&head->base, true);
weston_compositor_add_head(compositor, &head->base);
@@ -550,7 +551,7 @@ rdp_head_create(struct weston_compositor *compositor, const char *name)
return 0;
}
-void
+static void
rdp_head_destroy(struct weston_head *base)
{
struct rdp_head *head = to_rdp_head(base);
@@ -561,7 +562,7 @@ rdp_head_destroy(struct weston_head *base)
free(head);
}
-static void
+void
rdp_destroy(struct weston_compositor *ec)
{
struct rdp_backend *b = to_rdp_backend(ec);
diff --git a/libweston/backend-rdp/rdp.h b/libweston/backend-rdp/rdp.h
index 210ddab4f..6a3f07797 100644
--- a/libweston/backend-rdp/rdp.h
+++ b/libweston/backend-rdp/rdp.h
@@ -233,12 +233,12 @@ void
rdp_clipboard_destroy(RdpPeerContext *peerCtx);
void
-rdp_head_destroy(struct weston_head *base);
+rdp_destroy(struct weston_compositor *ec);
static inline struct rdp_head *
to_rdp_head(struct weston_head *base)
{
- if (base->backend_id != rdp_head_destroy)
+ if (base->backend->destroy != rdp_destroy)
return NULL;
return container_of(base, struct rdp_head, base);
}
diff --git a/libweston/backend-vnc/vnc.c b/libweston/backend-vnc/vnc.c
index 679c2a324..5bf955f4a 100644
--- a/libweston/backend-vnc/vnc.c
+++ b/libweston/backend-vnc/vnc.c
@@ -122,10 +122,13 @@ to_vnc_output(struct weston_output *base)
static void
vnc_head_destroy(struct weston_head *base);
+static void
+vnc_destroy(struct weston_compositor *ec);
+
static inline struct vnc_head *
to_vnc_head(struct weston_head *base)
{
- if (base->backend_id != vnc_head_destroy)
+ if (base->backend->destroy != vnc_destroy)
return NULL;
return container_of(base, struct vnc_head, base);
}
@@ -723,6 +726,7 @@ vnc_destroy(struct weston_compositor *ec)
static void
vnc_head_create(struct weston_compositor *compositor, const char *name)
{
+ struct vnc_backend *backend = to_vnc_backend(compositor);
struct vnc_head *head;
head = xzalloc(sizeof *head);
@@ -731,7 +735,7 @@ vnc_head_create(struct weston_compositor *compositor, const char *name)
weston_head_set_monitor_strings(&head->base, "weston", "vnc", NULL);
weston_head_set_physical_size(&head->base, 0, 0);
- head->base.backend_id = vnc_head_destroy;
+ head->base.backend = &backend->base;
weston_head_set_connection_status(&head->base, true);
weston_compositor_add_head(compositor, &head->base);
diff --git a/libweston/backend-wayland/wayland.c b/libweston/backend-wayland/wayland.c
index 173e4541b..46c089ad7 100644
--- a/libweston/backend-wayland/wayland.c
+++ b/libweston/backend-wayland/wayland.c
@@ -231,12 +231,12 @@ struct wayland_input {
struct gl_renderer_interface *gl_renderer;
static void
-wayland_head_destroy(struct weston_head *base);
+wayland_destroy(struct weston_compositor *ec);
static inline struct wayland_head *
to_wayland_head(struct weston_head *base)
{
- if (base->backend_id != wayland_head_destroy)
+ if (base->backend->destroy != wayland_destroy)
return NULL;
return container_of(base, struct wayland_head, base);
}
@@ -1417,6 +1417,7 @@ wayland_output_create(struct weston_compositor *compositor, const char *name)
static struct wayland_head *
wayland_head_create(struct weston_compositor *compositor, const char *name)
{
+ struct wayland_backend *backend = to_wayland_backend(compositor);
struct wayland_head *head;
assert(name);
@@ -1427,7 +1428,7 @@ wayland_head_create(struct weston_compositor *compositor, const char *name)
weston_head_init(&head->base, name);
- head->base.backend_id = wayland_head_destroy;
+ head->base.backend = &backend->base;
weston_head_set_connection_status(&head->base, true);
weston_compositor_add_head(compositor, &head->base);
diff --git a/libweston/backend-x11/x11.c b/libweston/backend-x11/x11.c
index bd3a1c7f4..65a065410 100644
--- a/libweston/backend-x11/x11.c
+++ b/libweston/backend-x11/x11.c
@@ -152,12 +152,12 @@ struct window_delete_data {
struct gl_renderer_interface *gl_renderer;
static void
-x11_head_destroy(struct weston_head *base);
+x11_destroy(struct weston_compositor *ec);
static inline struct x11_head *
to_x11_head(struct weston_head *base)
{
- if (base->backend_id != x11_head_destroy)
+ if (base->backend->destroy != x11_destroy)
return NULL;
return container_of(base, struct x11_head, base);
}
@@ -1175,6 +1175,7 @@ x11_output_create(struct weston_compositor *compositor, const char *name)
static int
x11_head_create(struct weston_compositor *compositor, const char *name)
{
+ struct x11_backend *backend = to_x11_backend(compositor);
struct x11_head *head;
assert(name);
@@ -1185,7 +1186,7 @@ x11_head_create(struct weston_compositor *compositor, const char *name)
weston_head_init(&head->base, name);
- head->base.backend_id = x11_head_destroy;
+ head->base.backend = &backend->base;
weston_head_set_connection_status(&head->base, true);
weston_compositor_add_head(compositor, &head->base);