From: Ivan Molodetskikh Date: Thu, 26 Sep 2019 21:45:39 +0000 (+0300) Subject: egl: allow INVALID format for linux_dmabuf X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=c376865f5eeca535c4aa8e33bcf166052c1ce2f2;p=mesa.git egl: allow INVALID format for linux_dmabuf As per https://gitlab.freedesktop.org/wayland/wayland-protocols/commit/fb9b2a87317c77e26283da5f6c9559d709f6fdcd, the compositor may advertise DRM_FORMAT_MOD_INVALID as a supported modifier. This patch makes mesa recognize this fact and allow linux_dmabuf usage with the INVALID modifier in this case. In case the driver doesn't support modifiers, we can still use linux-dmabuf protocol instead of the legacy wl_drm interface to create wl_buffers. This will help compositors to handle these buffers better. In this commit, the INVALID modifier is allowed to be added to the list of supported modifiers, and create_wl_buffer will be able to use linux_dmabuf with an INVALID modifier if the compositor advertised it as supported. Signed-off-by: Ivan Molodetskikh Tested-by: Marge Bot Part-of: --- diff --git a/src/egl/drivers/dri2/platform_wayland.c b/src/egl/drivers/dri2/platform_wayland.c index 71bcb04a77b..324ac2357da 100644 --- a/src/egl/drivers/dri2/platform_wayland.c +++ b/src/egl/drivers/dri2/platform_wayland.c @@ -522,6 +522,13 @@ get_back_bo(struct dri2_egl_surface *dri2_surf) modifiers = u_vector_tail(&dri2_dpy->wl_modifiers[visual_idx]); num_modifiers = u_vector_length(&dri2_dpy->wl_modifiers[visual_idx]); + if (num_modifiers == 1 && modifiers[0] == DRM_FORMAT_MOD_INVALID) { + /* For the purposes of this function, an INVALID modifier on its own + * means the modifiers aren't supported. + */ + num_modifiers = 0; + } + /* Substitute dri image format if server does not support original format */ if (!BITSET_TEST(dri2_dpy->formats, visual_idx)) linear_dri_image_format = dri2_wl_visuals[visual_idx].alt_dri_image_format; @@ -917,7 +924,23 @@ create_wl_buffer(struct dri2_egl_display *dri2_dpy, } } - if (dri2_dpy->wl_dmabuf && modifier != DRM_FORMAT_MOD_INVALID) { + bool supported_modifier = false; + if (modifier != DRM_FORMAT_MOD_INVALID) { + supported_modifier = true; + } else { + 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) { + supported_modifier = true; + break; + } + } + } + + if (dri2_dpy->wl_dmabuf && supported_modifier) { struct zwp_linux_buffer_params_v1 *params; int i; @@ -1290,10 +1313,6 @@ dmabuf_handle_modifier(void *data, struct zwp_linux_dmabuf_v1 *dmabuf, if (visual_idx == -1) return; - if (modifier_hi == (DRM_FORMAT_MOD_INVALID >> 32) && - modifier_lo == (DRM_FORMAT_MOD_INVALID & 0xffffffff)) - return; - BITSET_SET(dri2_dpy->formats, visual_idx); mod = u_vector_add(&dri2_dpy->wl_modifiers[visual_idx]);