From b89bcffea4fccdf4727f65b58576ba05903daa75 Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Tue, 23 Feb 2021 11:41:47 +0100 Subject: [PATCH] render/egl, backend/wayland: add workaround for split render/display setups Split render/display setups have two separate devices: one display-only with a primary node, and one render-only with a render node. However in these cases the EGL implementation and the Wayland compositor will advertise the display device instead of the render device [1]. The EGL implementation will magically open the render device when the display device is passed in. So just pass the display device as if it were a render device. Maybe in the future Mesa will advertise the render device instead and we'll be able to remove this workaround. [1]: https://gitlab.freedesktop.org/mesa/mesa/-/issues/4178 --- backend/wayland/backend.c | 7 ++++++- render/egl.c | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/backend/wayland/backend.c b/backend/wayland/backend.c index 1b702adf..825a5ad7 100644 --- a/backend/wayland/backend.c +++ b/backend/wayland/backend.c @@ -143,7 +143,12 @@ static char *get_render_name(const char *name) { if (match == NULL) { wlr_log(WLR_ERROR, "Cannot find DRM device %s", name); } else if (!(match->available_nodes & (1 << DRM_NODE_RENDER))) { - wlr_log(WLR_ERROR, "DRM device %s has no render node", name); + // Likely a split display/render setup. Pick the primary node and hope + // Mesa will open the right render node under-the-hood. + wlr_log(WLR_DEBUG, "DRM device %s has no render node, " + "falling back to primary node", name); + assert(match->available_nodes & (1 << DRM_NODE_PRIMARY)); + render_name = strdup(match->nodes[DRM_NODE_PRIMARY]); } else { render_name = strdup(match->nodes[DRM_NODE_RENDER]); } diff --git a/render/egl.c b/render/egl.c index e42529e9..0a20a696 100644 --- a/render/egl.c +++ b/render/egl.c @@ -766,7 +766,12 @@ static char *get_render_name(const char *name) { if (match == NULL) { wlr_log(WLR_ERROR, "Cannot find DRM device %s", name); } else if (!(match->available_nodes & (1 << DRM_NODE_RENDER))) { - wlr_log(WLR_ERROR, "DRM device %s has no render node", name); + // Likely a split display/render setup. Pick the primary node and hope + // Mesa will open the right render node under-the-hood. + wlr_log(WLR_DEBUG, "DRM device %s has no render node, " + "falling back to primary node", name); + assert(match->available_nodes & (1 << DRM_NODE_PRIMARY)); + render_name = strdup(match->nodes[DRM_NODE_PRIMARY]); } else { render_name = strdup(match->nodes[DRM_NODE_RENDER]); }