diff --git a/extra/mesa/0001-egl-allow-INVALID-format-for-linux_dmabuf.patch b/extra/mesa/0001-egl-allow-INVALID-format-for-linux_dmabuf.patch new file mode 100644 index 000000000..6b408df4d --- /dev/null +++ b/extra/mesa/0001-egl-allow-INVALID-format-for-linux_dmabuf.patch @@ -0,0 +1,84 @@ +From c71ea55be7c1dbb58d56df9c6cfa69718fdf5d6a Mon Sep 17 00:00:00 2001 +From: Ivan Molodetskikh +Date: Fri, 27 Sep 2019 00:45:39 +0300 +Subject: [PATCH 1/2] 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: +--- + src/egl/drivers/dri2/platform_wayland.c | 29 ++++++++++++++++++++----- + 1 file changed, 24 insertions(+), 5 deletions(-) + +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]); +-- +2.26.2 + diff --git a/extra/mesa/0002-egl-wayland-Fix-zwp_linux_dmabuf-usage.patch b/extra/mesa/0002-egl-wayland-Fix-zwp_linux_dmabuf-usage.patch new file mode 100644 index 000000000..a0eec3541 --- /dev/null +++ b/extra/mesa/0002-egl-wayland-Fix-zwp_linux_dmabuf-usage.patch @@ -0,0 +1,71 @@ +From 8aeeb72b5af16e27b152f733da4a7de0ec47f328 Mon Sep 17 00:00:00 2001 +From: Christopher James Halse Rogers +Date: Tue, 24 Mar 2020 14:19:51 +1100 +Subject: [PATCH 2/2] egl/wayland: Fix zwp_linux_dmabuf usage + +There's no guarantee that the formats advertised by wl_drm and the formats +advertised by zwp_linux_dmabuf_v1 are the same. + +get_back_bo() handles this by falling back from createImageWithModifiers() to +createImage() when there's a wl_drm format but no corresponding linux_dmabuf +format, but create_wl_buffer() unconditionally tries to create a linux_dmabuf +buffer unless DRIimage has DRM_FORMAT_MOD_INVALID. + +Fix this by always checking if the DRIimage modifier has been advertised +by zwp_linux_dmabuf_v1, and falling back to wl_drm if not. + +If DRM_FORMAT_MOD_INVALID has been advertised then we trust the client +has allocated something appropriate and treat any modifier as matching. + +Closes: https://gitlab.freedesktop.org/mesa/mesa/issues/2220 +Signed-off-by: Christopher James Halse Rogers +--- + src/egl/drivers/dri2/platform_wayland.c | 30 ++++++++++++++++--------- + 1 file changed, 19 insertions(+), 11 deletions(-) + +diff --git a/src/egl/drivers/dri2/platform_wayland.c b/src/egl/drivers/dri2/platform_wayland.c +index 324ac2357da..7b7646e6e7f 100644 +--- a/src/egl/drivers/dri2/platform_wayland.c ++++ b/src/egl/drivers/dri2/platform_wayland.c +@@ -925,19 +925,27 @@ create_wl_buffer(struct dri2_egl_display *dri2_dpy, + } + + 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); ++ 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) { +- supported_modifier = true; +- break; +- } ++ 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 has allocated the buffer with the right implicit ++ * modifier for the format, 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) { +-- +2.26.2 + diff --git a/extra/mesa/PKGBUILD b/extra/mesa/PKGBUILD index 241fe0636..78e834a80 100644 --- a/extra/mesa/PKGBUILD +++ b/extra/mesa/PKGBUILD @@ -10,7 +10,7 @@ pkgbase=mesa pkgname=('vulkan-mesa-layer' 'opencl-mesa' 'vulkan-radeon' 'libva-mesa-driver' 'mesa-vdpau' 'mesa') pkgdesc="An open-source implementation of the OpenGL specification" pkgver=20.0.5 -pkgrel=1 +pkgrel=2 arch=('x86_64') makedepends=('python-mako' 'libxml2' 'libx11' 'xorgproto' 'libdrm' 'libxshmfence' 'libxxf86vm' 'libxdamage' 'libvdpau' 'libva' 'wayland' 'wayland-protocols' 'zstd' @@ -20,21 +20,30 @@ url="https://www.mesa3d.org/" license=('custom') source=(https://mesa.freedesktop.org/archive/mesa-${pkgver}.tar.xz{,.sig} 0001-Rip-out-VC4-forced-NEON.patch + 0001-egl-allow-INVALID-format-for-linux_dmabuf.patch + 0002-egl-wayland-Fix-zwp_linux_dmabuf-usage.patch LICENSE) sha512sums=('6f5780f7574400fea54978b40eb97faca35826a8a7bed96362d7bebcda78e2cadd44585ef8dd7dc126e0cc62cff61bee9b2ea360fedcc09a1fbb4c1f20c6aa08' 'SKIP' 'ba55fd9816ebd9147be120da1fd4fa0364d19967a11570e6d5dd9d8b4f7971df46ced8b151ee07afaaa98043e131eed14918ec25f8c9b0f7e5c53f452674ee5c' + '2371631512cd0f6aeaa9db3a8484da039fe98610123683520d0fe076dbf49860f00f8d44ecb0b0b149cee766946fe800080178c6fca8cff289329bf46ce97858' + 'd8998785c373743932674eecdfc1f502b5ef58b3f53572a42b177bf5b367d43b4af3867e37bd71c6a23f1b740841aabf2d42c68eb95f1bc33c0e58d9b7e029b8' 'f9f0d0ccf166fe6cb684478b6f1e1ab1f2850431c06aa041738563eb1808a004e52cdec823c103c9e180f03ffc083e95974d291353f0220fe52ae6d4897fecc7') validpgpkeys=('8703B6700E7EE06D7A39B8D6EDAE37B02CEB490D' # Emil Velikov '946D09B5E4C9845E63075FF1D961C596A7203456' # Andres Gomez 'E3E8F480C52ADD73B278EE78E1ECBE07D7D70895' # Juan Antonio Suárez Romero (Igalia, S.L.) 'A5CC9FEC93F2F837CB044912336909B6B25FADFA' # Juan A. Suarez Romero '71C4B75620BC75708B4BDB254C95FAAB3EB073EC' # Dylan Baker - '57551DE15B968F6341C248F68D8E31AFC32428A6') # Eric Engestrom + '57551DE15B968F6341C248F68D8E31AFC32428A6') # Eric Engestrom prepare() { cd mesa-$pkgver + # https://gitlab.gnome.org/GNOME/mutter/issues/987 + # https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4294 + patch -Np1 -i ../0001-egl-allow-INVALID-format-for-linux_dmabuf.patch + patch -Np1 -i ../0002-egl-wayland-Fix-zwp_linux_dmabuf-usage.patch + [[ $CARCH == "armv6h" || $CARCH == "armv7h" ]] && patch -p1 -i ../0001-Rip-out-VC4-forced-NEON.patch || true }