aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--render/egl.c20
1 files changed, 19 insertions, 1 deletions
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;
+}