From eefa4804bc18c5537a2efe4bff8499a626011066 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sat, 6 Jan 2024 19:22:41 -0500 Subject: [PATCH] wayland: Hook up default dmabuf feedback Keep the dmabuf formats from the default feedback events around in the display, instead of just printing out debug spew. The formats will be used in the future. --- gdk/wayland/gdkdisplay-wayland.c | 115 ++++++------------------------- gdk/wayland/gdkdisplay-wayland.h | 6 +- 2 files changed, 24 insertions(+), 97 deletions(-) diff --git a/gdk/wayland/gdkdisplay-wayland.c b/gdk/wayland/gdkdisplay-wayland.c index 34925d2041..c6abe1309d 100644 --- a/gdk/wayland/gdkdisplay-wayland.c +++ b/gdk/wayland/gdkdisplay-wayland.c @@ -284,93 +284,6 @@ static const struct wl_shm_listener wl_shm_listener = { wl_shm_format }; -static void -linux_dmabuf_done (void *data, - struct zwp_linux_dmabuf_feedback_v1 *zwp_linux_dmabuf_feedback_v1) -{ - GDK_DEBUG (MISC, "dmabuf feedback done"); -} - -static void -linux_dmabuf_format_table (void *data, - struct zwp_linux_dmabuf_feedback_v1 *zwp_linux_dmabuf_feedback_v1, - int32_t fd, - uint32_t size) -{ - GdkWaylandDisplay *display_wayland = data; - - display_wayland->linux_dmabuf_n_formats = size / 16; - display_wayland->linux_dmabuf_formats = mmap (NULL, size, PROT_READ, MAP_PRIVATE, fd, 0); - - GDK_DEBUG (MISC, "got dmabuf format table (%lu entries)", display_wayland->linux_dmabuf_n_formats); -} - -static void -linux_dmabuf_main_device (void *data, - struct zwp_linux_dmabuf_feedback_v1 *zwp_linux_dmabuf_feedback_v1, - struct wl_array *device) -{ - dev_t dev G_GNUC_UNUSED = *(dev_t *)device->data; - - GDK_DEBUG (MISC, "got dmabuf main device: %u %u", major (dev), minor (dev)); -} - -static void -linux_dmabuf_tranche_done (void *data, - struct zwp_linux_dmabuf_feedback_v1 *zwp_linux_dmabuf_feedback_v1) -{ - GDK_DEBUG (MISC, "dmabuf feedback tranche done"); -} - -static void -linux_dmabuf_tranche_target_device (void *data, - struct zwp_linux_dmabuf_feedback_v1 *zwp_linux_dmabuf_feedback_v1, - struct wl_array *device) -{ - dev_t dev G_GNUC_UNUSED = *(dev_t *)device->data; - - GDK_DEBUG (MISC, "got dmabuf tranche target device: %u %u", major (dev), minor (dev)); -} - -static void -linux_dmabuf_tranche_formats (void *data, - struct zwp_linux_dmabuf_feedback_v1 *zwp_linux_dmabuf_feedback_v1, - struct wl_array *indices) -{ - GdkWaylandDisplay *display_wayland = data; - - GDK_DEBUG (MISC, "got dmabuf tranche formats (%lu entries):", indices->size / sizeof (guint16)); - guint16 *pos; - - wl_array_for_each (pos, indices) - { - LinuxDmabufFormat *fmt G_GNUC_UNUSED = &display_wayland->linux_dmabuf_formats[*pos]; - uint32_t f G_GNUC_UNUSED = fmt->fourcc; - uint64_t m G_GNUC_UNUSED = fmt->modifier; - GDK_DEBUG (MISC, " %.4s:%#" G_GINT64_MODIFIER "x", (char *) &f, m); - } -} - -static void -linux_dmabuf_tranche_flags (void *data, - struct zwp_linux_dmabuf_feedback_v1 *zwp_linux_dmabuf_feedback_v1, - uint32_t flags) -{ - GDK_DEBUG (MISC, - "got dmabuf tranche flags: %s", - flags & ZWP_LINUX_DMABUF_FEEDBACK_V1_TRANCHE_FLAGS_SCANOUT ? "scanout" : ""); -} - -static const struct zwp_linux_dmabuf_feedback_v1_listener linux_dmabuf_feedback_listener = { - linux_dmabuf_done, - linux_dmabuf_format_table, - linux_dmabuf_main_device, - linux_dmabuf_tranche_done, - linux_dmabuf_tranche_target_device, - linux_dmabuf_tranche_formats, - linux_dmabuf_tranche_flags, -}; - static void server_decoration_manager_default_mode (void *data, struct org_kde_kwin_server_decoration_manager *manager, @@ -421,6 +334,16 @@ static void gdk_wayland_display_remove_output (GdkWaylandDisplay *display_wa static void gdk_wayland_display_init_xdg_output (GdkWaylandDisplay *display_wayland); static void gdk_wayland_display_get_xdg_output (GdkWaylandMonitor *monitor); +static void +dmabuf_formats_callback (gpointer data, + DmabufFormatsInfo *info) +{ + GdkWaylandDisplay *display_wayland = GDK_WAYLAND_DISPLAY (data); + + g_clear_pointer (&display_wayland->wayland_dmabuf_formats, gdk_dmabuf_formats_unref); + display_wayland->wayland_dmabuf_formats = gdk_dmabuf_formats_ref (info->formats); +} + static void gdk_registry_handle_global (void *data, struct wl_registry *registry, @@ -447,12 +370,17 @@ gdk_registry_handle_global (void *data, } else if (strcmp (interface, "zwp_linux_dmabuf_v1") == 0 && version >= 4) { + struct zwp_linux_dmabuf_feedback_v1 *feedback; + display_wayland->linux_dmabuf = wl_registry_bind (display_wayland->wl_registry, id, &zwp_linux_dmabuf_v1_interface, version); - display_wayland->linux_dmabuf_feedback = - zwp_linux_dmabuf_v1_get_default_feedback (display_wayland->linux_dmabuf); - zwp_linux_dmabuf_feedback_v1_add_listener (display_wayland->linux_dmabuf_feedback, - &linux_dmabuf_feedback_listener, display_wayland); + + feedback = zwp_linux_dmabuf_v1_get_default_feedback (display_wayland->linux_dmabuf); + display_wayland->dmabuf_formats_info = dmabuf_formats_info_new ("default", + NULL, + feedback, + dmabuf_formats_callback, + display_wayland); _gdk_wayland_display_async_roundtrip (display_wayland); } else if (strcmp (interface, "xdg_wm_base") == 0) @@ -800,9 +728,8 @@ gdk_wayland_display_dispose (GObject *object) g_clear_pointer (&display_wayland->fractional_scale, wp_fractional_scale_manager_v1_destroy); g_clear_pointer (&display_wayland->viewporter, wp_viewporter_destroy); g_clear_pointer (&display_wayland->linux_dmabuf, zwp_linux_dmabuf_v1_destroy); - g_clear_pointer (&display_wayland->linux_dmabuf_feedback, zwp_linux_dmabuf_feedback_v1_destroy); - if (display_wayland->linux_dmabuf_formats) - munmap (display_wayland->linux_dmabuf_formats, display_wayland->linux_dmabuf_n_formats * 16); + g_clear_pointer (&display_wayland->dmabuf_formats_info, dmabuf_formats_info_free); + g_clear_pointer (&display_wayland->wayland_dmabuf_formats, gdk_dmabuf_formats_unref); g_clear_pointer (&display_wayland->shm, wl_shm_destroy); g_clear_pointer (&display_wayland->wl_registry, wl_registry_destroy); diff --git a/gdk/wayland/gdkdisplay-wayland.h b/gdk/wayland/gdkdisplay-wayland.h index b7566b2066..bdcf69fcb3 100644 --- a/gdk/wayland/gdkdisplay-wayland.h +++ b/gdk/wayland/gdkdisplay-wayland.h @@ -47,6 +47,7 @@ #include "gdkdisplayprivate.h" #include "gdkwaylanddevice.h" +#include "gdkdmabuf-wayland-private.h" #include "cursor/wayland-cursor.h" #include @@ -103,9 +104,8 @@ struct _GdkWaylandDisplay struct wl_compositor *compositor; struct wl_shm *shm; struct zwp_linux_dmabuf_v1 *linux_dmabuf; - struct zwp_linux_dmabuf_feedback_v1 *linux_dmabuf_feedback; - gsize linux_dmabuf_n_formats; - LinuxDmabufFormat *linux_dmabuf_formats; + DmabufFormatsInfo *dmabuf_formats_info; + GdkDmabufFormats *wayland_dmabuf_formats; struct xdg_wm_base *xdg_wm_base; struct zxdg_shell_v6 *zxdg_shell_v6; struct gtk_shell1 *gtk_shell;