Commit c376865f authored by Ivan Molodetskikh's avatar Ivan Molodetskikh Committed by Marge Bot
Browse files

egl: allow INVALID format for linux_dmabuf

As per
wayland/wayland-protocols@fb9b2a87

,
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's avatarIvan Molodetskikh <yalterz@gmail.com>
Tested-by: Marge Bot <!2147>
Part-of: <!2147>
parent 646fbb1c
Pipeline #114786 passed with stages
in 10 minutes and 25 seconds
......@@ -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]);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment