diff --git a/libweston/backend-drm/drm.c b/libweston/backend-drm/drm.c index 33ccbeb3..6e1169c6 100644 --- a/libweston/backend-drm/drm.c +++ b/libweston/backend-drm/drm.c @@ -2958,6 +2958,9 @@ drm_backend_create(struct weston_compositor *compositor, if (linux_dmabuf_setup(compositor) < 0) weston_log("Error: initializing dmabuf " "support failed.\n"); + if (weston_direct_display_setup(compositor) < 0) + weston_log("Error: initializing direct-display " + "support failed.\n"); } if (compositor->capabilities & WESTON_CAP_EXPLICIT_SYNC) { diff --git a/libweston/linux-dmabuf.h b/libweston/linux-dmabuf.h index dbeda660..926dd9e0 100644 --- a/libweston/linux-dmabuf.h +++ b/libweston/linux-dmabuf.h @@ -75,11 +75,17 @@ struct linux_dmabuf_buffer { * feasible to scan it out directly. This would improve the * possibilities to successfully scan out, avoiding compositing. */ + + /**< marked as scan-out capable, avoids any composition */ + bool direct_display; }; int linux_dmabuf_setup(struct weston_compositor *compositor); +int +weston_direct_display_setup(struct weston_compositor *compositor); + struct linux_dmabuf_buffer * linux_dmabuf_buffer_get(struct wl_resource *resource); diff --git a/libweston/meson.build b/libweston/meson.build index 8dbb625d..08d23ecd 100644 --- a/libweston/meson.build +++ b/libweston/meson.build @@ -31,6 +31,7 @@ srcs_libweston = [ 'weston-log-file.c', 'weston-log-flight-rec.c', 'weston-log.c', + 'weston-direct-display.c', 'zoom.c', linux_dmabuf_unstable_v1_protocol_c, linux_dmabuf_unstable_v1_server_protocol_h, @@ -62,6 +63,8 @@ srcs_libweston = [ xdg_output_unstable_v1_server_protocol_h, weston_debug_protocol_c, weston_debug_server_protocol_h, + weston_direct_display_protocol_c, + weston_direct_display_server_protocol_h, ] if get_option('renderer-gl') diff --git a/libweston/weston-direct-display.c b/libweston/weston-direct-display.c new file mode 100644 index 00000000..bf25b5a3 --- /dev/null +++ b/libweston/weston-direct-display.c @@ -0,0 +1,92 @@ +/* + * Copyright © 2019 Collabora, Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "config.h" + +#include +#include +#include +#include + +#include +#include "linux-dmabuf.h" +#include "weston-direct-display-server-protocol.h" +#include "libweston-internal.h" + +static void +direct_display_enable(struct wl_client *client, + struct wl_resource *resource, + struct wl_resource *dmabuf_res) +{ + struct linux_dmabuf_buffer *dmabuf; + + dmabuf = wl_resource_get_user_data(dmabuf_res); + assert(dmabuf); + dmabuf->direct_display = true; +} + +static void +direct_display_destroy(struct wl_client *client, + struct wl_resource *global_resource) +{ + wl_resource_destroy(global_resource); +} + +static const struct weston_direct_display_v1_interface + weston_direct_display_interface_v1 = { + direct_display_enable, + direct_display_destroy, +}; + +static void +bind_direct_display(struct wl_client *client, void *data, + uint32_t version, uint32_t id) +{ + struct wl_resource *resource; + struct weston_compositor *ec = data; + + resource = wl_resource_create(client, + &weston_direct_display_v1_interface, + version, id); + if (!resource) { + wl_client_post_no_memory(client); + return; + } + + wl_resource_set_implementation(resource, + &weston_direct_display_interface_v1, + ec, NULL); +} + +WL_EXPORT int +weston_direct_display_setup(struct weston_compositor *ec) +{ + if (!wl_global_create(ec->wl_display, + &weston_direct_display_v1_interface, 1, + ec, bind_direct_display)) + return -1; + + return 0; +}