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.
This commit is contained in:
Simon Ser 2023-11-20 20:48:55 +01:00
parent 9a0a4ce221
commit 395a08f5d1
1 changed files with 19 additions and 1 deletions

View File

@ -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;
}