The dmabuf interface requires a valid modifier to be sent. If we don't explicitly get a modifier from the driver, we can't know what to send; it must be inferred from legacy side-channels (or assumed to linear, if none exists).
If we have no modifier, then we can only have a single-plane format anyway, so fall back to the old wl_drm buffer import path. Fixes: a65db0ad1c ("st/dri: don't expose modifiers in EGL if the driver doesn't implement them") Reported-by: Andy Furniss <adf.li...@gmail.com> Cc: Marek Olšák <marek.ol...@amd.com> --- src/egl/drivers/dri2/platform_wayland.c | 45 +++++++++++++++++++++++---------- 1 file changed, 32 insertions(+), 13 deletions(-) diff --git a/src/egl/drivers/dri2/platform_wayland.c b/src/egl/drivers/dri2/platform_wayland.c index 011dddfabf..b2c41507d1 100644 --- a/src/egl/drivers/dri2/platform_wayland.c +++ b/src/egl/drivers/dri2/platform_wayland.c @@ -678,23 +678,42 @@ create_wl_buffer(struct dri2_egl_display *dri2_dpy, __DRIimage *image) { struct wl_buffer *ret; + GLboolean query; int width, height, fourcc, num_planes; + uint64_t modifier; + + query = dri2_dpy->image->queryImage(image, __DRI_IMAGE_ATTRIB_WIDTH, &width); + query &= dri2_dpy->image->queryImage(image, __DRI_IMAGE_ATTRIB_HEIGHT, + &height); + query &= dri2_dpy->image->queryImage(image, __DRI_IMAGE_ATTRIB_FOURCC, + &fourcc); + if (!query) + return NULL; - dri2_dpy->image->queryImage(image, __DRI_IMAGE_ATTRIB_WIDTH, &width); - dri2_dpy->image->queryImage(image, __DRI_IMAGE_ATTRIB_HEIGHT, &height); - dri2_dpy->image->queryImage(image, __DRI_IMAGE_ATTRIB_FOURCC, &fourcc); - dri2_dpy->image->queryImage(image, __DRI_IMAGE_ATTRIB_NUM_PLANES, - &num_planes); + query = dri2_dpy->image->queryImage(image, __DRI_IMAGE_ATTRIB_NUM_PLANES, + &num_planes); + if (!query) + num_planes = 1; - if (dri2_dpy->wl_dmabuf && dri2_dpy->image->base.version >= 15) { - struct zwp_linux_buffer_params_v1 *params; + modifier = DRM_FORMAT_MOD_INVALID; + if (dri2_dpy->image->base.version >= 15) { int mod_hi, mod_lo; - int i; - dri2_dpy->image->queryImage(image, __DRI_IMAGE_ATTRIB_MODIFIER_UPPER, - &mod_hi); - dri2_dpy->image->queryImage(image, __DRI_IMAGE_ATTRIB_MODIFIER_LOWER, - &mod_lo); + query = dri2_dpy->image->queryImage(image, + __DRI_IMAGE_ATTRIB_MODIFIER_UPPER, + &mod_hi); + query &= dri2_dpy->image->queryImage(image, + __DRI_IMAGE_ATTRIB_MODIFIER_LOWER, + &mod_lo); + if (query) { + modifier = (uint64_t) mod_hi << 32; + modifier |= (uint64_t) (mod_lo & 0xffffffff); + } + } + + if (dri2_dpy->wl_dmabuf && modifier != DRM_FORMAT_MOD_INVALID) { + struct zwp_linux_buffer_params_v1 *params; + int i; /* We don't need a wrapper for wl_dmabuf objects, because we have to * create the intermediate params object; we can set the queue on this, @@ -725,7 +744,7 @@ create_wl_buffer(struct dri2_egl_display *dri2_dpy, dri2_dpy->image->destroyImage(p_image); zwp_linux_buffer_params_v1_add(params, fd, i, offset, stride, - mod_hi, mod_lo); + modifier >> 32, modifier & 0xffffffff); close(fd); } -- 2.14.2 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev