egl/surfaceless: Use EGL DeviceList instead of drmGetDevices2()
authorRobert Foss <rfoss@kernel.org>
Tue, 13 Jun 2023 11:57:45 +0000 (13:57 +0200)
committerMarge Bot <emma+marge@anholt.net>
Mon, 17 Jul 2023 22:27:00 +0000 (22:27 +0000)
surfaceless_probe_device() lists all of the DRM devices available,
but since EGL already already has created such a list use that instead.

Signed-off-by: Robert Foss <rfoss@kernel.org>
Reviewed-by: Adam Jackson <ajax@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/23742>

src/egl/drivers/dri2/platform_surfaceless.c

index 0e7248b..aa3d9cc 100644 (file)
@@ -34,6 +34,7 @@
 #include <sys/types.h>
 
 #include "egl_dri2.h"
+#include "eglglobals.h"
 #include "kopper_interface.h"
 #include "loader.h"
 
@@ -221,32 +222,26 @@ static const __DRIextension *swrast_loader_extensions[] = {
 static bool
 surfaceless_probe_device(_EGLDisplay *disp, bool swrast)
 {
-#define MAX_DRM_DEVICES 64
    const unsigned node_type = swrast ? DRM_NODE_PRIMARY : DRM_NODE_RENDER;
    struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
-   drmDevicePtr device, devices[MAX_DRM_DEVICES] = {NULL};
-   int i, num_devices;
+   _EGLDevice *dev_list = _eglGlobal.DeviceList;
+   drmDevicePtr device;
 
-   num_devices = drmGetDevices2(0, devices, ARRAY_SIZE(devices));
-   if (num_devices < 0)
-      return false;
+   while (dev_list) {
+      if (!_eglDeviceSupports(dev_list, _EGL_DEVICE_DRM))
+         goto next;
 
-   for (i = 0; i < num_devices; ++i) {
-      device = devices[i];
+      device = _eglDeviceDrm(dev_list);
+      assert(device);
 
       if (!(device->available_nodes & (1 << node_type)))
-         continue;
+         goto next;
 
       dri2_dpy->fd_render_gpu = loader_open_device(device->nodes[node_type]);
       if (dri2_dpy->fd_render_gpu < 0)
-         continue;
+         goto next;
 
-      disp->Device = _eglAddDevice(dri2_dpy->fd_render_gpu, swrast);
-      if (!disp->Device) {
-         close(dri2_dpy->fd_render_gpu);
-         dri2_dpy->fd_render_gpu = -1;
-         continue;
-      }
+      disp->Device = dev_list;
 
       char *driver_name = loader_get_driver_for_fd(dri2_dpy->fd_render_gpu);
       if (swrast) {
@@ -264,24 +259,26 @@ surfaceless_probe_device(_EGLDisplay *disp, bool swrast)
          dri2_dpy->driver_name = driver_name;
       }
 
-      if (dri2_dpy->driver_name && dri2_load_driver_dri3(disp))
+      if (dri2_dpy->driver_name && dri2_load_driver_dri3(disp)) {
+         if (swrast)
+            dri2_dpy->loader_extensions = swrast_loader_extensions;
+         else
+            dri2_dpy->loader_extensions = image_loader_extensions;
          break;
+      }
 
       free(dri2_dpy->driver_name);
       dri2_dpy->driver_name = NULL;
       close(dri2_dpy->fd_render_gpu);
       dri2_dpy->fd_render_gpu = -1;
+
+   next:
+      dev_list = _eglDeviceNext(dev_list);
    }
-   drmFreeDevices(devices, num_devices);
 
-   if (i == num_devices)
+   if (!dev_list)
       return false;
 
-   if (swrast)
-      dri2_dpy->loader_extensions = swrast_loader_extensions;
-   else
-      dri2_dpy->loader_extensions = image_loader_extensions;
-
    return true;
 }