From 0f978c34410283558afe9de5dab007f63a763c5e Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Wed, 15 Nov 2023 12:59:40 +0100 Subject: [PATCH] egl: ensure a render node is passed to _eglFindDevice() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit _eglFindDevice() will fail if it's not provided a render node: the EGLDevice list only contains one entry per render node, plus the special software device. Passing a primary node for a display-only device will not work. Signed-off-by: Simon Ser Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/10142 Reviewed-by: Iago Toral Quiroga Reviewed-by: Leandro Ribeiro Tested-by: Iago Toral Quiroga Tested-by: Alejandro PiƱeiro Fixes: 2be404f5571a ("egl: error out if we can't find an EGLDevice in _eglFindDevice()") Part-of: --- src/egl/drivers/dri2/egl_dri2.c | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c index 27b1e4aede9..96887aa8f09 100644 --- a/src/egl/drivers/dri2/egl_dri2.c +++ b/src/egl/drivers/dri2/egl_dri2.c @@ -1080,8 +1080,31 @@ dri2_setup_device(_EGLDisplay *disp, EGLBoolean software) { struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); _EGLDevice *dev; + int render_fd; + + /* Extensions must be loaded before calling this function */ + assert(dri2_dpy->mesa); + /* If we're not software, we need a DRM node FD */ + assert(software || dri2_dpy->fd_render_gpu >= 0); + + /* fd_render_gpu is what we got from WSI, so might actually be a lie and + * not a render node... */ + if (software) { + render_fd = -1; + } else if (loader_is_device_render_capable(dri2_dpy->fd_render_gpu)) { + render_fd = dri2_dpy->fd_render_gpu; + } else { + render_fd = dri2_dpy->mesa->queryCompatibleRenderOnlyDeviceFd( + dri2_dpy->fd_render_gpu); + if (render_fd < 0) + return EGL_FALSE; + } + + dev = _eglFindDevice(render_fd, software); + + if (render_fd >= 0 && render_fd != dri2_dpy->fd_render_gpu) + close(render_fd); - dev = _eglFindDevice(dri2_dpy->fd_render_gpu, software); if (!dev) return EGL_FALSE;