egl/android: use drmDevice instead of the manual /dev/dri iteration
authorEmil Velikov <emil.velikov@collabora.com>
Wed, 8 Aug 2018 13:19:05 +0000 (14:19 +0100)
committerEmil Velikov <emil.l.velikov@gmail.com>
Fri, 24 Aug 2018 10:50:36 +0000 (11:50 +0100)
Replace the manual handling of /dev/dri in favor of the drmDevice API.
The latter provides a consistent way of enumerating the devices,
providing device details as needed.

v2:
 - Use ARRAY_SIZE (Frank)
 - s/famour/favor/ typo (Frank)
 - Make MAX_DRM_DEVICES a macro - fix vla errors (RobF)
 - Remove left-over dev_path instance (RobF)

Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
Reviewed-by: Robert Foss <robert.foss@collabora.com> (v1)
Reviewed-by: Tomasz Figa <tfiga@chromium.org>
src/egl/drivers/dri2/platform_android.c

index a683d05d8d8bccd2aed5d2244b32364cd3c4f39d..9877c49fdd92f413c52592f612f3f10d68de68a5 100644 (file)
@@ -1457,7 +1457,8 @@ cleanup:
 static int
 droid_open_device(_EGLDisplay *disp)
 {
-   const int MAX_DRM_DEVICES = 32;
+#define MAX_DRM_DEVICES 32
+   drmDevicePtr device, devices[MAX_DRM_DEVICES] = { NULL };
    int prop_set, num_devices;
    int fd = -1, fallback_fd = -1;
 
@@ -1467,26 +1468,20 @@ droid_open_device(_EGLDisplay *disp)
    if (property_get("drm.gpu.vendor_name", vendor_buf, NULL) > 0)
       vendor_name = vendor_buf;
 
-   const char *drm_dir_name = "/dev/dri";
-   DIR *sysdir = opendir(drm_dir_name);
+   num_devices = drmGetDevices2(0, devices, ARRAY_SIZE(devices));
+   if (num_devices < 0)
+      return num_devices;
 
-   if (!sysdir)
-       return -errno;
+   for (int i = 0; i < num_devices; i++) {
+      device = devices[i];
 
-   struct dirent *dent;
-   while ((dent = readdir(sysdir))) {
-      char dev_path[128];
-      const char render_dev_prefix[] = "renderD";
-      size_t prefix_len = sizeof(render_dev_prefix) - 1;
-
-      if (strncmp(render_dev_prefix, dent->d_name, prefix_len) != 0)
+      if (!(device->available_nodes & (1 << DRM_NODE_RENDER)))
          continue;
 
-      snprintf(dev_path, sizeof(dev_path), "%s/%s", drm_dir_name, dent->d_name);
-      fd = loader_open_device(dev_path);
+      fd = loader_open_device(device->nodes[DRM_NODE_RENDER]);
       if (fd < 0) {
          _eglLog(_EGL_WARNING, "%s() Failed to open DRM device %s",
-                 __func__, dev_path);
+                 __func__, device->nodes[DRM_NODE_RENDER]);
          continue;
       }
 
@@ -1509,7 +1504,7 @@ droid_open_device(_EGLDisplay *disp)
    }
 
 success:
-   closedir(sysdir);
+   drmFreeDevices(devices, num_devices);
 
    if (fallback_fd < 0 && fd < 0) {
       _eglLog(_EGL_WARNING, "Failed to open any DRM device");
@@ -1523,6 +1518,7 @@ success:
 
    close(fallback_fd);
    return fd;
+#undef MAX_DRM_DEVICES
 }
 
 EGLBoolean