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;