diff options
author | Simon Ser <contact@emersion.fr> | 2021-02-23 11:41:47 +0100 |
---|---|---|
committer | Simon Ser <contact@emersion.fr> | 2021-03-27 11:23:32 +0100 |
commit | b89bcffea4fccdf4727f65b58576ba05903daa75 (patch) | |
tree | f4a1d34466f41fc5e1ba4a8227b3c1de127b9e3d | |
parent | 741da702bcc9a40f6c471560b86e20303f981133 (diff) |
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
-rw-r--r-- | backend/wayland/backend.c | 7 | ||||
-rw-r--r-- | 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]); } |