From: Varad Gautam <varad.gau...@collabora.com> implement 'modifier' event to communicate available formats and modifiers to the client and support zwp_linux_dmabuf_v1 interface version 3.
v2: handle zero modifiers case, deprecate 'format' event. Signed-off-by: Varad Gautam <varad.gau...@collabora.com> --- Although DRM_FORMAT_MOD_NONE better articulates the no-modifier case, since it is shared with DRM_FORMAT_MOD_LINEAR, we end up using DRM_FORMAT_MOD_INVALID here. protocol: https://patchwork.freedesktop.org/patch/133970/ tree: git://git.collabora.com/git/user/varad/weston.git dmabuf-modifiers-v2 libweston/linux-dmabuf.c | 39 +++++++++++++++++++++++++++++++++++---- libweston/linux-dmabuf.h | 3 +++ 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/libweston/linux-dmabuf.c b/libweston/linux-dmabuf.c index 9121e59..4f153b1 100644 --- a/libweston/linux-dmabuf.c +++ b/libweston/linux-dmabuf.c @@ -467,6 +467,11 @@ bind_linux_dmabuf(struct wl_client *client, { struct weston_compositor *compositor = data; struct wl_resource *resource; + int *formats = NULL; + uint64_t *modifiers = NULL; + int num_formats, num_modifiers; + uint64_t modifier_invalid = DRM_FORMAT_MOD_INVALID; + int i, j; resource = wl_resource_create(client, &zwp_linux_dmabuf_v1_interface, version, id); @@ -478,9 +483,35 @@ bind_linux_dmabuf(struct wl_client *client, wl_resource_set_implementation(resource, &linux_dmabuf_implementation, compositor, NULL); - /* EGL_EXT_image_dma_buf_import does not provide a way to query the - * supported pixel formats. */ - /* XXX: send formats */ + /* + * Use EGL_EXT_image_dma_buf_import_modifiers to query and advertise + * format/modifier codes. + */ + compositor->renderer->query_dmabuf_formats(compositor, &formats, + &num_formats); + + for (i = 0; i < num_formats; i++) { + compositor->renderer->query_dmabuf_modifiers(compositor, + formats[i], + &modifiers, + &num_modifiers); + + /* send DRM_FORMAT_MOD_INVALID token when no modifiers are supported + * for this format */ + if (num_modifiers == 0) { + num_modifiers = 1; + modifiers = &modifier_invalid; + } + for (j = 0; j < num_modifiers; j++) { + uint32_t modifier_lo = modifiers[j] & 0xFFFFFFFF; + uint32_t modifier_hi = modifiers[j] >> 32; + zwp_linux_dmabuf_v1_send_modifier(resource, formats[i], + modifier_hi, + modifier_lo); + } + free(modifiers); + } + free(formats); } /** Advertise linux_dmabuf support @@ -498,7 +529,7 @@ WL_EXPORT int linux_dmabuf_setup(struct weston_compositor *compositor) { if (!wl_global_create(compositor->wl_display, - &zwp_linux_dmabuf_v1_interface, 2, + &zwp_linux_dmabuf_v1_interface, 3, compositor, bind_linux_dmabuf)) return -1; diff --git a/libweston/linux-dmabuf.h b/libweston/linux-dmabuf.h index 64f43e5..f4ab52c 100644 --- a/libweston/linux-dmabuf.h +++ b/libweston/linux-dmabuf.h @@ -29,6 +29,9 @@ #include <stdint.h> #define MAX_DMABUF_PLANES 4 +#ifndef DRM_FORMAT_MOD_INVALID +#define DRM_FORMAT_MOD_INVALID ((1ULL<<56) - 1) +#endif struct linux_dmabuf_buffer; typedef void (*dmabuf_user_data_destroy_func)( -- 2.10.0 _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/wayland-devel