[Mesa-dev] [PATCH] egl/wayland: Don't use dmabuf with no modifiers
Daniel Stone
daniels at collabora.com
Mon Oct 2 15:55:39 UTC 2017
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.lists at gmail.com>
Cc: Marek Olšák <marek.olsak at 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
More information about the mesa-dev
mailing list