Module: Mesa Branch: main Commit: 0f978c34410283558afe9de5dab007f63a763c5e URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=0f978c34410283558afe9de5dab007f63a763c5e
Author: Simon Ser <[email protected]> Date: Wed Nov 15 12:59:40 2023 +0100 egl: ensure a render node is passed to _eglFindDevice() _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 <[email protected]> Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/10142 Reviewed-by: Iago Toral Quiroga <[email protected]> Reviewed-by: Leandro Ribeiro <[email protected]> Tested-by: Iago Toral Quiroga <[email protected]> Tested-by: Alejandro PiƱeiro <[email protected]> Fixes: 2be404f5571a ("egl: error out if we can't find an EGLDevice in _eglFindDevice()") Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26205> --- 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;
