[Mesa-dev] [PATCH 1/5] egl/android: use drmDevice instead of the manual /dev/dri iteration

Robert Foss robert.foss at collabora.com
Mon Aug 13 19:01:08 UTC 2018


Hey Emil,

On 13/08/2018 16.44, Emil Velikov wrote:
> From: Emil Velikov <emil.velikov at collabora.com>
> 
> Replace the manual handling of /dev/dri in famour of the drmDevice API.
> The latter provides a consistent way of enumerating the devices,
> providing device details as needed.
> 
> 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>
> ---
> 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 | 23 +++++++++--------------
>   1 file changed, 9 insertions(+), 14 deletions(-)
> 
> diff --git a/src/egl/drivers/dri2/platform_android.c b/src/egl/drivers/dri2/platform_android.c
> index cc16fd8118f..685851acfc2 100644
> --- a/src/egl/drivers/dri2/platform_android.c
> +++ b/src/egl/drivers/dri2/platform_android.c
> @@ -1290,6 +1290,7 @@ static int
>   droid_open_device(_EGLDisplay *disp)
>   {
>      const int MAX_DRM_DEVICES = 32;
> +   drmDevicePtr device, devices[MAX_DRM_DEVICES] = { NULL };

The android-8.0.0_r35 AOSP checkout I'm running doesn't want to compile the 
above line.

external/mesa3d/src/egl/drivers/dri2/platform_android.c:1259:33: error: 
variable-sized object may not be initialized
    drmDevicePtr device, devices[MAX_DRM_DEVICES] = { NULL };
                                 ^~~~~~~~~~~~~~~
external/mesa3d/src/egl/drivers/dri2/platform_android.c:1282:28: error: use of 
undeclared identifier 'dev_path'
                  __func__, dev_path);


>      int prop_set, num_devices;
>      int fd = -1, fallback_fd = -1;
>   
> @@ -1299,23 +1300,17 @@ 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, MAX_DRM_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);
> @@ -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");
> 


More information about the mesa-dev mailing list