summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLoïc Molinari <loic.molinari@collabora.com>2023-10-16 10:27:47 +0200
committerDerek Foreman <derek.foreman@collabora.com>2024-03-12 18:35:57 +0000
commitf4c69abc577f36e33da2f2bfe81c51efcac2ff01 (patch)
treeac93c419d19c5ef68f82a7442453ed0dde4a6e4c
parent1eae99b2eefe1f7fad5dcf1a4180f801be71326d (diff)
libweston: Let multiple backends register the Windowed Output API
The windowed output API is implemented by the Wayland, the X11 and the headless backends. It's currently not possible to create a secondary headless backend when the primary backend is Wayland or X11 because the windowed output API would be registered twice. This commit suffixes the windowed output API names with the backend name in order to avoid clashes: "weston_windowed_output_api_<backend>_v2". A use case for Wayland or X11 as primary backend and headless as secondary is for instance to request output captures on the headless backend to avoid read backs on the primary backend's render buffers. Signed-off-by: Loïc Molinari <loic.molinari@collabora.com>
-rw-r--r--frontend/main.c20
-rw-r--r--include/libweston/windowed-output-api.h27
-rw-r--r--libweston/backend-headless/headless.c3
-rw-r--r--libweston/backend-wayland/wayland.c3
-rw-r--r--libweston/backend-x11/x11.c3
5 files changed, 39 insertions, 17 deletions
diff --git a/frontend/main.c b/frontend/main.c
index 752440ff..16a73a7f 100644
--- a/frontend/main.c
+++ b/frontend/main.c
@@ -1669,10 +1669,11 @@ parse_simple_mode(struct weston_output *output,
static int
wet_configure_windowed_output_from_config(struct weston_output *output,
- struct wet_output_config *defaults)
+ struct wet_output_config *defaults,
+ enum weston_windowed_output_type type)
{
const struct weston_windowed_output_api *api =
- weston_windowed_output_get_api(output->compositor);
+ weston_windowed_output_get_api(output->compositor, type);
struct weston_config *wc = wet_get_config(output->compositor);
struct weston_config_section *section = NULL;
@@ -3132,7 +3133,8 @@ headless_backend_output_configure(struct weston_output *output)
if (wet_output_set_color_characteristics(output, wc, section) < 0)
return -1;
- return wet_configure_windowed_output_from_config(output, &defaults);
+ return wet_configure_windowed_output_from_config(output, &defaults,
+ WESTON_WINDOWED_OUTPUT_HEADLESS);
}
static int
@@ -3207,7 +3209,7 @@ load_headless_backend(struct weston_compositor *c,
return -1;
if (!no_outputs) {
- api = weston_windowed_output_get_api(c);
+ api = weston_windowed_output_get_api(c, WESTON_WINDOWED_OUTPUT_HEADLESS);
if (!api) {
weston_log("Cannot use weston_windowed_output_api.\n");
@@ -3596,7 +3598,8 @@ x11_backend_output_configure(struct weston_output *output)
.transform = WL_OUTPUT_TRANSFORM_NORMAL
};
- return wet_configure_windowed_output_from_config(output, &defaults);
+ return wet_configure_windowed_output_from_config(output, &defaults,
+ WESTON_WINDOWED_OUTPUT_X11);
}
static int
@@ -3655,7 +3658,7 @@ load_x11_backend(struct weston_compositor *c,
if (!wb)
return -1;
- api = weston_windowed_output_get_api(c);
+ api = weston_windowed_output_get_api(c, WESTON_WINDOWED_OUTPUT_X11);
if (!api) {
weston_log("Cannot use weston_windowed_output_api.\n");
@@ -3715,7 +3718,8 @@ wayland_backend_output_configure(struct weston_output *output)
.transform = WL_OUTPUT_TRANSFORM_NORMAL
};
- return wet_configure_windowed_output_from_config(output, &defaults);
+ return wet_configure_windowed_output_from_config(output, &defaults,
+ WESTON_WINDOWED_OUTPUT_WAYLAND);
}
static int
@@ -3787,7 +3791,7 @@ load_wayland_backend(struct weston_compositor *c,
if (!wb)
return -1;
- api = weston_windowed_output_get_api(c);
+ api = weston_windowed_output_get_api(c, WESTON_WINDOWED_OUTPUT_WAYLAND);
if (api == NULL) {
/* We will just assume if load_backend() finished cleanly and
diff --git a/include/libweston/windowed-output-api.h b/include/libweston/windowed-output-api.h
index 0f1bc0d7..840cd2b5 100644
--- a/include/libweston/windowed-output-api.h
+++ b/include/libweston/windowed-output-api.h
@@ -35,7 +35,15 @@ extern "C" {
struct weston_compositor;
struct weston_output;
-#define WESTON_WINDOWED_OUTPUT_API_NAME "weston_windowed_output_api_v2"
+#define WESTON_WINDOWED_OUTPUT_API_NAME_X11 "weston_windowed_output_api_x11_v2"
+#define WESTON_WINDOWED_OUTPUT_API_NAME_WAYLAND "weston_windowed_output_api_wayland_v2"
+#define WESTON_WINDOWED_OUTPUT_API_NAME_HEADLESS "weston_windowed_output_api_headless_v2"
+
+enum weston_windowed_output_type {
+ WESTON_WINDOWED_OUTPUT_X11 = 0,
+ WESTON_WINDOWED_OUTPUT_WAYLAND,
+ WESTON_WINDOWED_OUTPUT_HEADLESS,
+};
struct weston_windowed_output_api {
/** Assign a given width and height to an output.
@@ -79,13 +87,20 @@ struct weston_windowed_output_api {
};
static inline const struct weston_windowed_output_api *
-weston_windowed_output_get_api(struct weston_compositor *compositor)
+weston_windowed_output_get_api(struct weston_compositor *compositor,
+ enum weston_windowed_output_type type)
{
- const void *api;
- api = weston_plugin_api_get(compositor, WESTON_WINDOWED_OUTPUT_API_NAME,
- sizeof(struct weston_windowed_output_api));
+ const char *api_names[] = {
+ WESTON_WINDOWED_OUTPUT_API_NAME_X11,
+ WESTON_WINDOWED_OUTPUT_API_NAME_WAYLAND,
+ WESTON_WINDOWED_OUTPUT_API_NAME_HEADLESS,
+ };
+
+ if (type >= ARRAY_LENGTH(api_names))
+ return NULL;
- return (const struct weston_windowed_output_api *)api;
+ return weston_plugin_api_get(compositor, api_names[type],
+ sizeof(struct weston_windowed_output_api));
}
#ifdef __cplusplus
diff --git a/libweston/backend-headless/headless.c b/libweston/backend-headless/headless.c
index 107ef3f5..d5652d2c 100644
--- a/libweston/backend-headless/headless.c
+++ b/libweston/backend-headless/headless.c
@@ -638,7 +638,8 @@ headless_backend_create(struct weston_compositor *compositor,
goto err_input;
}
- ret = weston_plugin_api_register(compositor, WESTON_WINDOWED_OUTPUT_API_NAME,
+ ret = weston_plugin_api_register(compositor,
+ WESTON_WINDOWED_OUTPUT_API_NAME_HEADLESS,
&api, sizeof(api));
if (ret < 0) {
diff --git a/libweston/backend-wayland/wayland.c b/libweston/backend-wayland/wayland.c
index 892c5b0c..c2ba3476 100644
--- a/libweston/backend-wayland/wayland.c
+++ b/libweston/backend-wayland/wayland.c
@@ -3082,7 +3082,8 @@ weston_backend_init(struct weston_compositor *compositor,
return 0;
}
- ret = weston_plugin_api_register(compositor, WESTON_WINDOWED_OUTPUT_API_NAME,
+ ret = weston_plugin_api_register(compositor,
+ WESTON_WINDOWED_OUTPUT_API_NAME_WAYLAND,
&windowed_api, sizeof(windowed_api));
if (ret < 0) {
diff --git a/libweston/backend-x11/x11.c b/libweston/backend-x11/x11.c
index 4cc3127d..eb9a82c5 100644
--- a/libweston/backend-x11/x11.c
+++ b/libweston/backend-x11/x11.c
@@ -1986,7 +1986,8 @@ x11_backend_create(struct weston_compositor *compositor,
" synchronization support failed.\n");
}
- ret = weston_plugin_api_register(compositor, WESTON_WINDOWED_OUTPUT_API_NAME,
+ ret = weston_plugin_api_register(compositor,
+ WESTON_WINDOWED_OUTPUT_API_NAME_X11,
&api, sizeof(api));
if (ret < 0) {