From 395a08f5d19151b6a1a6e788c9f112a00953ec37 Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Mon, 20 Nov 2023 20:48:55 +0100 Subject: [PATCH] render/egl: fallback to GBM FD if EGLDevice is not available It's possible that we don't have an EGLDevice if we created the EGL context from a GBM device. Let's ensure all GPU-accelerated renderers always have a DRM FD to return by falling back to GBM's FD. --- render/egl.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/render/egl.c b/render/egl.c index 8a1e6dae..162634be 100644 --- a/render/egl.c +++ b/render/egl.c @@ -954,7 +954,7 @@ static char *get_render_name(const char *name) { return render_name; } -int wlr_egl_dup_drm_fd(struct wlr_egl *egl) { +static int dup_egl_device_drm_fd(struct wlr_egl *egl) { if (egl->device == EGL_NO_DEVICE_EXT || (!egl->exts.EXT_device_drm && !egl->exts.EXT_device_drm_render_node)) { return -1; @@ -1001,3 +1001,21 @@ int wlr_egl_dup_drm_fd(struct wlr_egl *egl) { return render_fd; } + +int wlr_egl_dup_drm_fd(struct wlr_egl *egl) { + int fd = dup_egl_device_drm_fd(egl); + if (fd >= 0) { + return fd; + } + + // Fallback to GBM's FD if we can't use EGLDevice + if (egl->gbm_device == NULL) { + return -1; + } + + fd = fcntl(gbm_device_get_fd(egl->gbm_device), F_DUPFD_CLOEXEC, 0); + if (fd < 0) { + wlr_log_errno(WLR_ERROR, "Failed to dup GBM FD"); + } + return fd; +}