Mesa (main): Revert "egl/wayland: deprecate drm_handle_format() and drm_handle_capabilities()"

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Sat Apr 16 18:39:24 UTC 2022


Module: Mesa
Branch: main
Commit: c60fea8c228ae3f32e20d6b65c473d9f04871d20
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=c60fea8c228ae3f32e20d6b65c473d9f04871d20

Author: Leandro Ribeiro <leandro.ribeiro at collabora.com>
Date:   Sun Apr 10 22:54:36 2022 -0300

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 at collabora.com>
Reviewed-by: Simon Ser <contact at emersion.fr>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15822>

---

 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 89158993efd..1c840a966b3 100644
--- a/src/egl/drivers/dri2/egl_dri2.h
+++ b/src/egl/drivers/dri2/egl_dri2.h
@@ -284,6 +284,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 e9ecf6d1e71..9a33e0b2a6e 100644
--- a/src/egl/drivers/dri2/platform_wayland.c
+++ b/src/egl/drivers/dri2/platform_wayland.c
@@ -1344,7 +1344,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;
@@ -1448,11 +1448,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
@@ -1699,16 +1716,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
@@ -2077,13 +2099,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);
@@ -2091,7 +2112,6 @@ dri2_initialize_wayland_drm(_EGLDisplay *disp)
                                                 &dmabuf_feedback_listener, dri2_dpy);
    }
 
-   /* Receive events from the interfaces */
    if (roundtrip(dri2_dpy) < 0)
       goto cleanup;
 
@@ -2178,6 +2198,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)) {



More information about the mesa-commit mailing list