[Mesa-dev] [PATCH v2] egl/android: use drmDevice instead of the manual /dev/dri iteration
Eric Engestrom
eric.engestrom at intel.com
Tue Aug 14 17:26:03 UTC 2018
On Tuesday, 2018-08-14 10:05:06 +0100, Emil Velikov wrote:
> From: Emil Velikov <emil.velikov at collabora.com>
>
> 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)
>
> Cc: Robert Foss <robert.foss at collabora.com>
> Cc: Tomasz Figa <tfiga at chromium.org>
> Signed-off-by: Emil Velikov <emil.velikov at collabora.com>
> Reviewed-by: Robert Foss <robert.foss at collabora.com> (v1)
> ---
> If using VGEM the following patch is needed [1]. It's been on the list
> for ages - will double-check and commmit it to drm-misc.
>
> [1] https://lists.freedesktop.org/archives/dri-devel/2018-March/170944.html
> ---
> src/egl/drivers/dri2/platform_android.c | 28 +++++++++++--------------
> 1 file changed, 12 insertions(+), 16 deletions(-)
>
> diff --git a/src/egl/drivers/dri2/platform_android.c b/src/egl/drivers/dri2/platform_android.c
> index cc16fd8118f..b83c76e60df 100644
> --- a/src/egl/drivers/dri2/platform_android.c
> +++ b/src/egl/drivers/dri2/platform_android.c
> @@ -1289,7 +1289,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 };
That int was never used until now; and still isn't after your patch,
save for this one declaration. How about simply `devices[32]` and drop
the #define & #undef?
(Feel free to ignore, this isn't important at all)
> int prop_set, num_devices;
> int fd = -1, fallback_fd = -1;
>
> @@ -1299,26 +1300,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;
> }
>
> @@ -1341,7 +1336,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");
> @@ -1355,6 +1350,7 @@ success:
>
> close(fallback_fd);
> return fd;
> +#undef MAX_DRM_DEVICES
> }
>
> EGLBoolean
> --
> 2.18.0
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list