mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-06 02:58:05 +02:00
egl/wayland: Don't use dmabuf with no modifiers
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") Fixes:02cc359372("egl/wayland: Use linux-dmabuf interface for buffers") Signed-off-by: Daniel Stone <daniels@collabora.com> Reviewed-by: Emil Velikov <emil.velikov@collabora.com> Reported-by: Andy Furniss <adf.lists@gmail.com> Cc: Marek Olšák <marek.olsak@amd.com> (cherry picked from commitb65d6dafd6)
This commit is contained in:
parent
0f6e89dfe0
commit
99d3661bce
1 changed files with 11 additions and 7 deletions
|
|
@ -720,6 +720,7 @@ create_wl_buffer(struct dri2_egl_display *dri2_dpy,
|
|||
struct wl_buffer *ret;
|
||||
EGLBoolean query;
|
||||
int width, height, fourcc, num_planes;
|
||||
uint64_t modifier = DRM_FORMAT_MOD_INVALID;
|
||||
|
||||
query = dri2_dpy->image->queryImage(image, __DRI_IMAGE_ATTRIB_WIDTH, &width);
|
||||
query &= dri2_dpy->image->queryImage(image, __DRI_IMAGE_ATTRIB_HEIGHT,
|
||||
|
|
@ -734,10 +735,8 @@ create_wl_buffer(struct dri2_egl_display *dri2_dpy,
|
|||
if (!query)
|
||||
num_planes = 1;
|
||||
|
||||
if (dri2_dpy->wl_dmabuf && dri2_dpy->image->base.version >= 15) {
|
||||
struct zwp_linux_buffer_params_v1 *params;
|
||||
if (dri2_dpy->image->base.version >= 15) {
|
||||
int mod_hi, mod_lo;
|
||||
int i;
|
||||
|
||||
query = dri2_dpy->image->queryImage(image,
|
||||
__DRI_IMAGE_ATTRIB_MODIFIER_UPPER,
|
||||
|
|
@ -745,10 +744,15 @@ create_wl_buffer(struct dri2_egl_display *dri2_dpy,
|
|||
query &= dri2_dpy->image->queryImage(image,
|
||||
__DRI_IMAGE_ATTRIB_MODIFIER_LOWER,
|
||||
&mod_lo);
|
||||
if (!query) {
|
||||
mod_hi = DRM_FORMAT_MOD_INVALID >> 32;
|
||||
mod_lo = DRM_FORMAT_MOD_INVALID & 0xffffffff;
|
||||
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,
|
||||
|
|
@ -791,7 +795,7 @@ create_wl_buffer(struct dri2_egl_display *dri2_dpy,
|
|||
}
|
||||
|
||||
zwp_linux_buffer_params_v1_add(params, fd, i, offset, stride,
|
||||
mod_hi, mod_lo);
|
||||
modifier >> 32, modifier & 0xffffffff);
|
||||
close(fd);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue