--- mesa-20.0.4-orig/src/egl/drivers/dri2/platform_wayland.c 2020-04-03 12:15:27.013214800 +0200 +++ mesa-20.0.4-patched/src/egl/drivers/dri2/platform_wayland.c 2020-04-11 13:42:04.101878991 +0200 @@ -917,7 +917,31 @@ } } - if (dri2_dpy->wl_dmabuf && modifier != DRM_FORMAT_MOD_INVALID) { + bool supported_modifier = false; + bool mod_invalid_supported = false; + int visual_idx = dri2_wl_visual_idx_from_fourcc(fourcc); + assert(visual_idx != -1); + + uint64_t *mod; + u_vector_foreach(mod, &dri2_dpy->wl_modifiers[visual_idx]) { + if (*mod == DRM_FORMAT_MOD_INVALID) { + mod_invalid_supported = true; + } + if (*mod == modifier) { + supported_modifier = true; + break; + } + } + if (!supported_modifier && mod_invalid_supported) { + /* If the server has advertised DRM_FORMAT_MOD_INVALID then we trust + * that the client knows what it's doing, even though it's allocated + * a buffer the server hasn't explicitly claimed to support. */ + modifier = DRM_FORMAT_MOD_INVALID; + supported_modifier = true; + } + + + if (dri2_dpy->wl_dmabuf && supported_modifier) { struct zwp_linux_buffer_params_v1 *params; int i;