summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOlivier Fourdan <ofourdan@redhat.com>2023-03-27 11:20:12 +0200
committerOlivier Fourdan <ofourdan@redhat.com>2023-04-03 11:46:15 +0200
commit1a0cc25d488dee3c5972d9f0828d5eadfcdbe713 (patch)
treee48cdc7b22d34a6ab170d4a75c622c5f974143b3
parent26ef545b3502f61ca722a7a3373507e88ef64110 (diff)
downloadxserver-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.c114
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,