xserver: Branch 'master' - 2 commits

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Jan 19 11:03:33 UTC 2024


 hw/xwayland/xwayland-glamor-gbm.c |   63 +++++++++++++++++++++++++++++++++-----
 1 file changed, 55 insertions(+), 8 deletions(-)

New commits:
commit d7f1909e7c198607794da5f4d778ce53139ff851
Author: Simon Ser <contact at emersion.fr>
Date:   Mon Jan 8 11:32:27 2024 +0100

    xwayland/glamor/gbm: make wl_drm optional
    
    Build on top of [1] to use linux-dmabuf to grab the main device
    when wl_drm is unavailable. Fixes Xwayland glamor on top of latest
    wlroots commit which has dropped wl_drm support [2].
    
    [1]: https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/818
    [2]: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/4397
    
    Signed-off-by: Simon Ser <contact at emersion.fr>

diff --git a/hw/xwayland/xwayland-glamor-gbm.c b/hw/xwayland/xwayland-glamor-gbm.c
index 3b22fcae3..69ead78f2 100644
--- a/hw/xwayland/xwayland-glamor-gbm.c
+++ b/hw/xwayland/xwayland-glamor-gbm.c
@@ -56,13 +56,15 @@ struct xwl_gbm_private {
     drmDevice *device;
     char *device_name;
     struct gbm_device *gbm;
-    struct wl_drm *drm;
     int drm_fd;
     Bool fd_render_node;
     Bool drm_authenticated;
-    uint32_t capabilities;
     Bool dmabuf_capable;
     Bool glamor_gles;
+
+    /* Set if wl_drm is available */
+    struct wl_drm *drm;
+    uint32_t capabilities;
 };
 
 struct xwl_pixmap {
@@ -562,7 +564,8 @@ xwl_glamor_gbm_get_wl_buffer_for_pixmap(PixmapPtr pixmap)
            zwp_linux_buffer_params_v1_create_immed(params, width, height,
                                                    format, 0);
         zwp_linux_buffer_params_v1_destroy(params);
-    } else if (num_planes == 1 && modifier == DRM_FORMAT_MOD_INVALID) {
+    } else if (num_planes == 1 && modifier == DRM_FORMAT_MOD_INVALID &&
+               xwl_gbm->drm) {
         xwl_pixmap->buffer =
             wl_drm_create_prime_buffer(xwl_gbm->drm, prime_fds[0], width, height,
                                        format,
@@ -1028,8 +1031,8 @@ xwl_glamor_gbm_has_wl_interfaces(struct xwl_screen *xwl_screen)
 {
     struct xwl_gbm_private *xwl_gbm = xwl_gbm_get(xwl_screen);
 
-    if (xwl_gbm->drm == NULL) {
-        LogMessageVerb(X_INFO, 3, "glamor: 'wl_drm' not supported\n");
+    if (xwl_gbm->drm == NULL && xwl_screen->dmabuf_protocol_version < 4) {
+        LogMessageVerb(X_INFO, 3, "glamor: 'wl_drm' not supported and linux-dmabuf v4 not supported\n");
         return FALSE;
     }
 
@@ -1133,6 +1136,47 @@ xwl_glamor_try_gles_api(struct xwl_screen *xwl_screen)
     return TRUE;
 }
 
+static Bool
+xwl_glamor_gbm_init_main_dev(struct xwl_screen *xwl_screen)
+{
+    struct xwl_gbm_private *xwl_gbm = xwl_gbm_get(xwl_screen);
+    drmDevice *main_dev;
+
+    while (!xwl_screen->default_feedback.feedback_done) {
+        if (wl_display_dispatch(xwl_screen->display) < 0) {
+            ErrorF("Failed to dispatch Wayland display\n");
+            return FALSE;
+        }
+    }
+
+    main_dev = xwl_screen->default_feedback.main_dev;
+    if (!(main_dev->available_nodes & (1 << DRM_NODE_RENDER))) {
+        ErrorF("Main linux-dmabuf device has no render node\n");
+        return FALSE;
+    }
+
+    xwl_gbm->device_name = strdup(main_dev->nodes[DRM_NODE_RENDER]);
+    if (!xwl_gbm->device_name) {
+        return FALSE;
+    }
+
+    xwl_gbm->drm_fd = open(xwl_gbm->device_name, O_RDWR | O_CLOEXEC);
+    if (xwl_gbm->drm_fd < 0) {
+        ErrorF("wayland-egl: could not open %s (%s)\n",
+               xwl_gbm->device_name, strerror(errno));
+        return FALSE;
+    }
+
+    if (drmGetDevice2(xwl_gbm->drm_fd, 0, &xwl_gbm->device) != 0) {
+        ErrorF("wayland-egl: Could not fetch DRM device %s\n",
+               xwl_gbm->device_name);
+        return FALSE;
+    }
+
+    xwl_gbm->fd_render_node = TRUE;
+    return TRUE;
+}
+
 static Bool
 xwl_glamor_gbm_init_egl(struct xwl_screen *xwl_screen)
 {
@@ -1141,6 +1185,9 @@ xwl_glamor_gbm_init_egl(struct xwl_screen *xwl_screen)
     const GLubyte *renderer;
     const char *gbm_backend_name;
 
+    if (!xwl_gbm->drm && !xwl_glamor_gbm_init_main_dev(xwl_screen))
+        return FALSE;
+
     if (!xwl_gbm->fd_render_node && !xwl_gbm->drm_authenticated) {
         ErrorF("Failed to get wl_drm, disabling Glamor and DRI3\n");
 	return FALSE;
commit 4beb4f26ef8207f3aaf25950e283c3c171973e6f
Author: Simon Ser <contact at emersion.fr>
Date:   Mon Jan 8 10:57:40 2024 +0100

    xwayland/glamor/gbm: use Bool for true/false fields
    
    This makes it more obvious what the values mean.
    
    Signed-off-by: Simon Ser <contact at emersion.fr>

diff --git a/hw/xwayland/xwayland-glamor-gbm.c b/hw/xwayland/xwayland-glamor-gbm.c
index 9442aee02..3b22fcae3 100644
--- a/hw/xwayland/xwayland-glamor-gbm.c
+++ b/hw/xwayland/xwayland-glamor-gbm.c
@@ -58,10 +58,10 @@ struct xwl_gbm_private {
     struct gbm_device *gbm;
     struct wl_drm *drm;
     int drm_fd;
-    int fd_render_node;
+    Bool fd_render_node;
     Bool drm_authenticated;
     uint32_t capabilities;
-    int dmabuf_capable;
+    Bool dmabuf_capable;
     Bool glamor_gles;
 };
 
@@ -945,7 +945,7 @@ xwl_drm_handle_device(void *data, struct wl_drm *drm, const char *device)
    }
 
    if (drmGetNodeTypeFromFd(xwl_gbm->drm_fd) == DRM_NODE_RENDER) {
-       xwl_gbm->fd_render_node = 1;
+       xwl_gbm->fd_render_node = TRUE;
        xwl_screen->expecting_event--;
    } else {
        drmGetMagic(xwl_gbm->drm_fd, &magic);


More information about the xorg-commit mailing list