diff options
author | Olivier Fourdan <ofourdan@redhat.com> | 2023-03-27 11:20:12 +0200 |
---|---|---|
committer | Olivier Fourdan <ofourdan@redhat.com> | 2023-04-03 11:46:15 +0200 |
commit | 1a0cc25d488dee3c5972d9f0828d5eadfcdbe713 (patch) | |
tree | e48cdc7b22d34a6ab170d4a75c622c5f974143b3 | |
parent | 26ef545b3502f61ca722a7a3373507e88ef64110 (diff) | |
download | xserver-1a0cc25d488dee3c5972d9f0828d5eadfcdbe713.tar.gz |
xwayland: Use a dedicated feedback callback for windows
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 <ofourdan@redhat.com>
Reviewed-by: Michel Dänzer <mdaenzer@redhat.com>
-rw-r--r-- | hw/xwayland/xwayland-glamor.c | 114 |
1 files 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 @@ -660,24 +660,6 @@ static const struct zwp_linux_dmabuf_feedback_v1_listener xwl_dmabuf_feedback_li }; 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, |