[kirkstone] mesa: backport a patch to support compositors without zwp_linux_dmabuf_v1 again

Message ID 20220621141048.1970617-1-Martin.Jansa@gmail.com
State Accepted, archived
Commit a5919cb8bcb8f3fe66519c80aa8730b16cf987ac
Headers show
Series [kirkstone] mesa: backport a patch to support compositors without zwp_linux_dmabuf_v1 again | expand

Commit Message

Martin Jansa June 21, 2022, 2:10 p.m. UTC
* the same will be needed for kirkstone

Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com>
---
 ...nd-deprecate-drm_handle_format-and-d.patch | 158 ++++++++++++++++++
 meta/recipes-graphics/mesa/mesa.inc           |   1 +
 2 files changed, 159 insertions(+)
 create mode 100644 meta/recipes-graphics/mesa/files/0001-Revert-egl-wayland-deprecate-drm_handle_format-and-d.patch

Comments

Steve Sakoman June 21, 2022, 2:27 p.m. UTC | #1
On Tue, Jun 21, 2022 at 4:10 AM Martin Jansa <martin.jansa@gmail.com> wrote:
>
> * the same will be needed for kirkstone

I've got it in the patchset currently under test.

Steve

> Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com>
> ---
>  ...nd-deprecate-drm_handle_format-and-d.patch | 158 ++++++++++++++++++
>  meta/recipes-graphics/mesa/mesa.inc           |   1 +
>  2 files changed, 159 insertions(+)
>  create mode 100644 meta/recipes-graphics/mesa/files/0001-Revert-egl-wayland-deprecate-drm_handle_format-and-d.patch
>
> diff --git a/meta/recipes-graphics/mesa/files/0001-Revert-egl-wayland-deprecate-drm_handle_format-and-d.patch b/meta/recipes-graphics/mesa/files/0001-Revert-egl-wayland-deprecate-drm_handle_format-and-d.patch
> new file mode 100644
> index 0000000000..dac2de4e62
> --- /dev/null
> +++ b/meta/recipes-graphics/mesa/files/0001-Revert-egl-wayland-deprecate-drm_handle_format-and-d.patch
> @@ -0,0 +1,158 @@
> +From 7796c2c56c960ac55e49246f0349ac52539ada55 Mon Sep 17 00:00:00 2001
> +From: Leandro Ribeiro <leandro.ribeiro@collabora.com>
> +Date: Sun, 10 Apr 2022 22:54:36 -0300
> +Subject: [PATCH] Revert "egl/wayland: deprecate drm_handle_format() and
> + drm_handle_capabilities()"
> +
> +Commit af1ee8e010441f8f2ed8c77065b159652a4ac9fe dropped support to
> +wl_drm, as we thought that most compositors from active projects were
> +already supporting zwp_linux_dmabuf_v1.
> +
> +But that's not true, so revert this commit in order to give these
> +projects a longer transition period.
> +
> +Note that we didn't add back the support to GEM name API, and that was
> +on purpose.
> +
> +Signed-off-by: Leandro Ribeiro <leandro.ribeiro@collabora.com>
> +Reviewed-by: Simon Ser <contact@emersion.fr>
> +Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15822>
> +
> +Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com>
> +Upstream-Status: Backport [https://gitlab.freedesktop.org/mesa/mesa/-/commit/c60fea8c228ae3f32e20d6b65c473d9f04871d20]
> +---
> + src/egl/drivers/dri2/egl_dri2.h         |  1 +
> + src/egl/drivers/dri2/platform_wayland.c | 59 +++++++++++++++++++------
> + 2 files changed, 47 insertions(+), 13 deletions(-)
> +
> +diff --git a/src/egl/drivers/dri2/egl_dri2.h b/src/egl/drivers/dri2/egl_dri2.h
> +index c466ff83c53..eecb32a53fd 100644
> +--- a/src/egl/drivers/dri2/egl_dri2.h
> ++++ b/src/egl/drivers/dri2/egl_dri2.h
> +@@ -283,6 +283,7 @@ struct dri2_egl_display
> +    struct zwp_linux_dmabuf_feedback_v1 *wl_dmabuf_feedback;
> +    struct dmabuf_feedback_format_table format_table;
> +    bool authenticated;
> ++   uint32_t capabilities;
> +    char *device_name;
> + #endif
> +
> +diff --git a/src/egl/drivers/dri2/platform_wayland.c b/src/egl/drivers/dri2/platform_wayland.c
> +index 5ff83cce08a..843434376a7 100644
> +--- a/src/egl/drivers/dri2/platform_wayland.c
> ++++ b/src/egl/drivers/dri2/platform_wayland.c
> +@@ -1343,7 +1343,7 @@ create_wl_buffer(struct dri2_egl_display *dri2_dpy,
> +                  struct dri2_egl_surface *dri2_surf,
> +                  __DRIimage *image)
> + {
> +-   struct wl_buffer *ret;
> ++   struct wl_buffer *ret = NULL;
> +    EGLBoolean query;
> +    int width, height, fourcc, num_planes;
> +    uint64_t modifier = DRM_FORMAT_MOD_INVALID;
> +@@ -1447,11 +1447,28 @@ create_wl_buffer(struct dri2_egl_display *dri2_dpy,
> +       ret = zwp_linux_buffer_params_v1_create_immed(params, width, height,
> +                                                     fourcc, 0);
> +       zwp_linux_buffer_params_v1_destroy(params);
> ++   } else {
> ++      struct wl_drm *wl_drm =
> ++         dri2_surf ? dri2_surf->wl_drm_wrapper : dri2_dpy->wl_drm;
> ++      int fd = -1, stride;
> ++
> ++      if (num_planes > 1)
> ++         return NULL;
> ++
> ++      query = dri2_dpy->image->queryImage(image, __DRI_IMAGE_ATTRIB_FD, &fd);
> ++      query &= dri2_dpy->image->queryImage(image, __DRI_IMAGE_ATTRIB_STRIDE, &stride);
> ++      if (!query) {
> ++         if (fd >= 0)
> ++            close(fd);
> ++         return NULL;
> ++      }
> +
> +-      return ret;
> ++      ret = wl_drm_create_prime_buffer(wl_drm, fd, width, height, fourcc, 0,
> ++                                       stride, 0, 0, 0, 0);
> ++      close(fd);
> +    }
> +
> +-   return NULL;
> ++   return ret;
> + }
> +
> + static EGLBoolean
> +@@ -1698,16 +1715,21 @@ drm_handle_device(void *data, struct wl_drm *drm, const char *device)
> + static void
> + drm_handle_format(void *data, struct wl_drm *drm, uint32_t format)
> + {
> +-   /* deprecated, as compositors already support the dma-buf protocol extension
> +-    * and so we can rely on dmabuf_handle_modifier() to receive formats and
> +-    * modifiers */
> ++   struct dri2_egl_display *dri2_dpy = data;
> ++   int visual_idx = dri2_wl_visual_idx_from_fourcc(format);
> ++
> ++   if (visual_idx == -1)
> ++      return;
> ++
> ++   BITSET_SET(dri2_dpy->formats.formats_bitmap, visual_idx);
> + }
> +
> + static void
> + drm_handle_capabilities(void *data, struct wl_drm *drm, uint32_t value)
> + {
> +-   /* deprecated, as compositors already support the dma-buf protocol extension
> +-    * and so we can rely on it to create wl_buffer's */
> ++   struct dri2_egl_display *dri2_dpy = data;
> ++
> ++   dri2_dpy->capabilities = value;
> + }
> +
> + static void
> +@@ -2075,13 +2097,12 @@ dri2_initialize_wayland_drm(_EGLDisplay *disp)
> +    wl_registry_add_listener(dri2_dpy->wl_registry,
> +                             &registry_listener_drm, dri2_dpy);
> +
> +-   /* The compositor must expose the dma-buf interface. */
> +-   if (roundtrip(dri2_dpy) < 0 || dri2_dpy->wl_dmabuf == NULL)
> ++   if (roundtrip(dri2_dpy) < 0)
> +       goto cleanup;
> +
> +    /* Get default dma-buf feedback */
> +-   if (zwp_linux_dmabuf_v1_get_version(dri2_dpy->wl_dmabuf) >=
> +-       ZWP_LINUX_DMABUF_V1_GET_DEFAULT_FEEDBACK_SINCE_VERSION) {
> ++   if (dri2_dpy->wl_dmabuf && zwp_linux_dmabuf_v1_get_version(dri2_dpy->wl_dmabuf) >=
> ++                              ZWP_LINUX_DMABUF_V1_GET_DEFAULT_FEEDBACK_SINCE_VERSION) {
> +       dmabuf_feedback_format_table_init(&dri2_dpy->format_table);
> +       dri2_dpy->wl_dmabuf_feedback =
> +          zwp_linux_dmabuf_v1_get_default_feedback(dri2_dpy->wl_dmabuf);
> +@@ -2089,7 +2110,6 @@ dri2_initialize_wayland_drm(_EGLDisplay *disp)
> +                                                 &dmabuf_feedback_listener, dri2_dpy);
> +    }
> +
> +-   /* Receive events from the interfaces */
> +    if (roundtrip(dri2_dpy) < 0)
> +       goto cleanup;
> +
> +@@ -2176,6 +2196,19 @@ dri2_initialize_wayland_drm(_EGLDisplay *disp)
> +
> +    dri2_wl_setup_swap_interval(disp);
> +
> ++   if (dri2_dpy->wl_drm) {
> ++      /* To use Prime, we must have _DRI_IMAGE v7 at least. createImageFromFds
> ++       * support indicates that Prime export/import is supported by the driver.
> ++       * We deprecated the support to GEM names API, so we bail out if the
> ++       * driver does not suport Prime. */
> ++      if (!(dri2_dpy->capabilities & WL_DRM_CAPABILITY_PRIME) ||
> ++          (dri2_dpy->image->base.version < 7) ||
> ++          (dri2_dpy->image->createImageFromFds == NULL)) {
> ++         _eglLog(_EGL_WARNING, "wayland-egl: display does not support prime");
> ++         goto cleanup;
> ++      }
> ++   }
> ++
> +    if (dri2_dpy->is_different_gpu &&
> +        (dri2_dpy->image->base.version < 9 ||
> +         dri2_dpy->image->blitImage == NULL)) {
> +--
> +2.35.1
> +
> diff --git a/meta/recipes-graphics/mesa/mesa.inc b/meta/recipes-graphics/mesa/mesa.inc
> index 0628151e96..afac8014fe 100644
> --- a/meta/recipes-graphics/mesa/mesa.inc
> +++ b/meta/recipes-graphics/mesa/mesa.inc
> @@ -20,6 +20,7 @@ SRC_URI = "https://mesa.freedesktop.org/archive/mesa-${PV}.tar.xz \
>             file://0001-meson-misdetects-64bit-atomics-on-mips-clang.patch \
>             file://0001-futex.h-Define-__NR_futex-if-it-does-not-exist.patch \
>             file://0001-util-format-Check-for-NEON-before-using-it.patch \
> +           file://0001-Revert-egl-wayland-deprecate-drm_handle_format-and-d.patch \
>             "
>
>  SRC_URI[sha256sum] = "9f2b30f5276a9abaf71aafc6979685e2636189de1a87aea2c9e69744a6d0ebb9"
> --
> 2.35.1
>

Patch

diff --git a/meta/recipes-graphics/mesa/files/0001-Revert-egl-wayland-deprecate-drm_handle_format-and-d.patch b/meta/recipes-graphics/mesa/files/0001-Revert-egl-wayland-deprecate-drm_handle_format-and-d.patch
new file mode 100644
index 0000000000..dac2de4e62
--- /dev/null
+++ b/meta/recipes-graphics/mesa/files/0001-Revert-egl-wayland-deprecate-drm_handle_format-and-d.patch
@@ -0,0 +1,158 @@ 
+From 7796c2c56c960ac55e49246f0349ac52539ada55 Mon Sep 17 00:00:00 2001
+From: Leandro Ribeiro <leandro.ribeiro@collabora.com>
+Date: Sun, 10 Apr 2022 22:54:36 -0300
+Subject: [PATCH] Revert "egl/wayland: deprecate drm_handle_format() and
+ drm_handle_capabilities()"
+
+Commit af1ee8e010441f8f2ed8c77065b159652a4ac9fe dropped support to
+wl_drm, as we thought that most compositors from active projects were
+already supporting zwp_linux_dmabuf_v1.
+
+But that's not true, so revert this commit in order to give these
+projects a longer transition period.
+
+Note that we didn't add back the support to GEM name API, and that was
+on purpose.
+
+Signed-off-by: Leandro Ribeiro <leandro.ribeiro@collabora.com>
+Reviewed-by: Simon Ser <contact@emersion.fr>
+Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15822>
+
+Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com>
+Upstream-Status: Backport [https://gitlab.freedesktop.org/mesa/mesa/-/commit/c60fea8c228ae3f32e20d6b65c473d9f04871d20]
+---
+ src/egl/drivers/dri2/egl_dri2.h         |  1 +
+ src/egl/drivers/dri2/platform_wayland.c | 59 +++++++++++++++++++------
+ 2 files changed, 47 insertions(+), 13 deletions(-)
+
+diff --git a/src/egl/drivers/dri2/egl_dri2.h b/src/egl/drivers/dri2/egl_dri2.h
+index c466ff83c53..eecb32a53fd 100644
+--- a/src/egl/drivers/dri2/egl_dri2.h
++++ b/src/egl/drivers/dri2/egl_dri2.h
+@@ -283,6 +283,7 @@ struct dri2_egl_display
+    struct zwp_linux_dmabuf_feedback_v1 *wl_dmabuf_feedback;
+    struct dmabuf_feedback_format_table format_table;
+    bool authenticated;
++   uint32_t capabilities;
+    char *device_name;
+ #endif
+ 
+diff --git a/src/egl/drivers/dri2/platform_wayland.c b/src/egl/drivers/dri2/platform_wayland.c
+index 5ff83cce08a..843434376a7 100644
+--- a/src/egl/drivers/dri2/platform_wayland.c
++++ b/src/egl/drivers/dri2/platform_wayland.c
+@@ -1343,7 +1343,7 @@ create_wl_buffer(struct dri2_egl_display *dri2_dpy,
+                  struct dri2_egl_surface *dri2_surf,
+                  __DRIimage *image)
+ {
+-   struct wl_buffer *ret;
++   struct wl_buffer *ret = NULL;
+    EGLBoolean query;
+    int width, height, fourcc, num_planes;
+    uint64_t modifier = DRM_FORMAT_MOD_INVALID;
+@@ -1447,11 +1447,28 @@ create_wl_buffer(struct dri2_egl_display *dri2_dpy,
+       ret = zwp_linux_buffer_params_v1_create_immed(params, width, height,
+                                                     fourcc, 0);
+       zwp_linux_buffer_params_v1_destroy(params);
++   } else {
++      struct wl_drm *wl_drm =
++         dri2_surf ? dri2_surf->wl_drm_wrapper : dri2_dpy->wl_drm;
++      int fd = -1, stride;
++
++      if (num_planes > 1)
++         return NULL;
++
++      query = dri2_dpy->image->queryImage(image, __DRI_IMAGE_ATTRIB_FD, &fd);
++      query &= dri2_dpy->image->queryImage(image, __DRI_IMAGE_ATTRIB_STRIDE, &stride);
++      if (!query) {
++         if (fd >= 0)
++            close(fd);
++         return NULL;
++      }
+ 
+-      return ret;
++      ret = wl_drm_create_prime_buffer(wl_drm, fd, width, height, fourcc, 0,
++                                       stride, 0, 0, 0, 0);
++      close(fd);
+    }
+ 
+-   return NULL;
++   return ret;
+ }
+ 
+ static EGLBoolean
+@@ -1698,16 +1715,21 @@ drm_handle_device(void *data, struct wl_drm *drm, const char *device)
+ static void
+ drm_handle_format(void *data, struct wl_drm *drm, uint32_t format)
+ {
+-   /* deprecated, as compositors already support the dma-buf protocol extension
+-    * and so we can rely on dmabuf_handle_modifier() to receive formats and
+-    * modifiers */
++   struct dri2_egl_display *dri2_dpy = data;
++   int visual_idx = dri2_wl_visual_idx_from_fourcc(format);
++
++   if (visual_idx == -1)
++      return;
++
++   BITSET_SET(dri2_dpy->formats.formats_bitmap, visual_idx);
+ }
+ 
+ static void
+ drm_handle_capabilities(void *data, struct wl_drm *drm, uint32_t value)
+ {
+-   /* deprecated, as compositors already support the dma-buf protocol extension
+-    * and so we can rely on it to create wl_buffer's */
++   struct dri2_egl_display *dri2_dpy = data;
++
++   dri2_dpy->capabilities = value;
+ }
+ 
+ static void
+@@ -2075,13 +2097,12 @@ dri2_initialize_wayland_drm(_EGLDisplay *disp)
+    wl_registry_add_listener(dri2_dpy->wl_registry,
+                             &registry_listener_drm, dri2_dpy);
+ 
+-   /* The compositor must expose the dma-buf interface. */
+-   if (roundtrip(dri2_dpy) < 0 || dri2_dpy->wl_dmabuf == NULL)
++   if (roundtrip(dri2_dpy) < 0)
+       goto cleanup;
+ 
+    /* Get default dma-buf feedback */
+-   if (zwp_linux_dmabuf_v1_get_version(dri2_dpy->wl_dmabuf) >=
+-       ZWP_LINUX_DMABUF_V1_GET_DEFAULT_FEEDBACK_SINCE_VERSION) {
++   if (dri2_dpy->wl_dmabuf && zwp_linux_dmabuf_v1_get_version(dri2_dpy->wl_dmabuf) >=
++                              ZWP_LINUX_DMABUF_V1_GET_DEFAULT_FEEDBACK_SINCE_VERSION) {
+       dmabuf_feedback_format_table_init(&dri2_dpy->format_table);
+       dri2_dpy->wl_dmabuf_feedback =
+          zwp_linux_dmabuf_v1_get_default_feedback(dri2_dpy->wl_dmabuf);
+@@ -2089,7 +2110,6 @@ dri2_initialize_wayland_drm(_EGLDisplay *disp)
+                                                 &dmabuf_feedback_listener, dri2_dpy);
+    }
+ 
+-   /* Receive events from the interfaces */
+    if (roundtrip(dri2_dpy) < 0)
+       goto cleanup;
+ 
+@@ -2176,6 +2196,19 @@ dri2_initialize_wayland_drm(_EGLDisplay *disp)
+ 
+    dri2_wl_setup_swap_interval(disp);
+ 
++   if (dri2_dpy->wl_drm) {
++      /* To use Prime, we must have _DRI_IMAGE v7 at least. createImageFromFds
++       * support indicates that Prime export/import is supported by the driver.
++       * We deprecated the support to GEM names API, so we bail out if the
++       * driver does not suport Prime. */
++      if (!(dri2_dpy->capabilities & WL_DRM_CAPABILITY_PRIME) ||
++          (dri2_dpy->image->base.version < 7) ||
++          (dri2_dpy->image->createImageFromFds == NULL)) {
++         _eglLog(_EGL_WARNING, "wayland-egl: display does not support prime");
++         goto cleanup;
++      }
++   }
++
+    if (dri2_dpy->is_different_gpu &&
+        (dri2_dpy->image->base.version < 9 ||
+         dri2_dpy->image->blitImage == NULL)) {
+-- 
+2.35.1
+
diff --git a/meta/recipes-graphics/mesa/mesa.inc b/meta/recipes-graphics/mesa/mesa.inc
index 0628151e96..afac8014fe 100644
--- a/meta/recipes-graphics/mesa/mesa.inc
+++ b/meta/recipes-graphics/mesa/mesa.inc
@@ -20,6 +20,7 @@  SRC_URI = "https://mesa.freedesktop.org/archive/mesa-${PV}.tar.xz \
            file://0001-meson-misdetects-64bit-atomics-on-mips-clang.patch \
            file://0001-futex.h-Define-__NR_futex-if-it-does-not-exist.patch \
            file://0001-util-format-Check-for-NEON-before-using-it.patch \
+           file://0001-Revert-egl-wayland-deprecate-drm_handle_format-and-d.patch \
            "
 
 SRC_URI[sha256sum] = "9f2b30f5276a9abaf71aafc6979685e2636189de1a87aea2c9e69744a6d0ebb9"