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;
 

Reply via email to