From 1a0cc25d488dee3c5972d9f0828d5eadfcdbe713 Mon Sep 17 00:00:00 2001 From: Olivier Fourdan Date: Mon, 27 Mar 2023 11:20:12 +0200 Subject: xwayland: Use a dedicated feedback callback for windows MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Separate the callbacks for the default's feedback from the one for regular windows. This is preparation work to recreate the window buffer of feedback updates, no functional change. Signed-off-by: Olivier Fourdan Reviewed-by: Michel Dänzer --- hw/xwayland/xwayland-glamor.c | 114 +++++++++++++++++++++++++++++++++++------- 1 file changed, 96 insertions(+), 18 deletions(-) diff --git a/hw/xwayland/xwayland-glamor.c b/hw/xwayland/xwayland-glamor.c index edb028978..1552834a7 100644 --- a/hw/xwayland/xwayland-glamor.c +++ b/hw/xwayland/xwayland-glamor.c @@ -659,24 +659,6 @@ static const struct zwp_linux_dmabuf_feedback_v1_listener xwl_dmabuf_feedback_li .tranche_flags = xwl_dmabuf_feedback_tranche_flags, }; -Bool -xwl_dmabuf_setup_feedback_for_window(struct xwl_window *xwl_window) -{ - struct xwl_screen *xwl_screen = xwl_window->xwl_screen; - - xwl_window->feedback.dmabuf_feedback = - zwp_linux_dmabuf_v1_get_surface_feedback(xwl_screen->dmabuf, xwl_window->surface); - - if (!xwl_window->feedback.dmabuf_feedback) - return FALSE; - - zwp_linux_dmabuf_feedback_v1_add_listener(xwl_window->feedback.dmabuf_feedback, - &xwl_dmabuf_feedback_listener, - &xwl_window->feedback); - - return TRUE; -} - Bool xwl_screen_set_dmabuf_interface(struct xwl_screen *xwl_screen, uint32_t id, uint32_t version) @@ -707,6 +689,102 @@ xwl_screen_set_dmabuf_interface(struct xwl_screen *xwl_screen, return TRUE; } +static void +xwl_window_dmabuf_feedback_main_device(void *data, + struct zwp_linux_dmabuf_feedback_v1 *dmabuf_feedback, + struct wl_array *dev) +{ + struct xwl_window *xwl_window = data; + + xwl_dmabuf_feedback_main_device(&xwl_window->feedback, dmabuf_feedback, dev); +} + +static void +xwl_window_dmabuf_feedback_tranche_target_device(void *data, + struct zwp_linux_dmabuf_feedback_v1 *dmabuf_feedback, + struct wl_array *dev) +{ + struct xwl_window *xwl_window = data; + + xwl_dmabuf_feedback_tranche_target_device(&xwl_window->feedback, dmabuf_feedback, dev); +} + +static void +xwl_window_dmabuf_feedback_tranche_flags(void *data, + struct zwp_linux_dmabuf_feedback_v1 *dmabuf_feedback, + uint32_t flags) +{ + struct xwl_window *xwl_window = data; + + xwl_dmabuf_feedback_tranche_flags(&xwl_window->feedback, dmabuf_feedback, flags); +} + +static void +xwl_window_dmabuf_feedback_tranche_formats(void *data, + struct zwp_linux_dmabuf_feedback_v1 *dmabuf_feedback, + struct wl_array *indices) +{ + struct xwl_window *xwl_window = data; + + xwl_dmabuf_feedback_tranche_formats(&xwl_window->feedback, dmabuf_feedback, indices); +} + +static void +xwl_window_dmabuf_feedback_tranche_done(void *data, + struct zwp_linux_dmabuf_feedback_v1 *dmabuf_feedback) +{ + struct xwl_window *xwl_window = data; + + xwl_dmabuf_feedback_tranche_done(&xwl_window->feedback, dmabuf_feedback); +} + +static void +xwl_window_dmabuf_feedback_done(void *data, + struct zwp_linux_dmabuf_feedback_v1 *dmabuf_feedback) +{ + struct xwl_window *xwl_window = data; + + xwl_dmabuf_feedback_done(&xwl_window->feedback, dmabuf_feedback); +} + +static void +xwl_window_dmabuf_feedback_format_table(void *data, + struct zwp_linux_dmabuf_feedback_v1 *dmabuf_feedback, + int32_t fd, uint32_t size) +{ + struct xwl_window *xwl_window = data; + + xwl_dmabuf_feedback_format_table(&xwl_window->feedback, dmabuf_feedback, fd, size); +} + +static const struct zwp_linux_dmabuf_feedback_v1_listener xwl_window_dmabuf_feedback_listener = { + .done = xwl_window_dmabuf_feedback_done, + .format_table = xwl_window_dmabuf_feedback_format_table, + .main_device = xwl_window_dmabuf_feedback_main_device, + .tranche_done = xwl_window_dmabuf_feedback_tranche_done, + .tranche_target_device = xwl_window_dmabuf_feedback_tranche_target_device, + .tranche_formats = xwl_window_dmabuf_feedback_tranche_formats, + .tranche_flags = xwl_window_dmabuf_feedback_tranche_flags, +}; + +Bool +xwl_dmabuf_setup_feedback_for_window(struct xwl_window *xwl_window) +{ + struct xwl_screen *xwl_screen = xwl_window->xwl_screen; + + xwl_window->feedback.dmabuf_feedback = + zwp_linux_dmabuf_v1_get_surface_feedback(xwl_screen->dmabuf, xwl_window->surface); + + if (!xwl_window->feedback.dmabuf_feedback) + return FALSE; + + zwp_linux_dmabuf_feedback_v1_add_listener(xwl_window->feedback.dmabuf_feedback, + &xwl_window_dmabuf_feedback_listener, + xwl_window); + + return TRUE; +} + void xwl_glamor_init_wl_registry(struct xwl_screen *xwl_screen, struct wl_registry *registry, -- cgit v1.2.1