diff --git a/.pick_status.json b/.pick_status.json index 935d7d01d71..53f16bf3532 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -1844,7 +1844,7 @@ "description": "egl/gbm: Walk device list to initialize DRM platform", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "32f4cf38085e4056b8e4a9fc78fea28897a1d05f", "notes": null diff --git a/src/egl/drivers/dri2/platform_drm.c b/src/egl/drivers/dri2/platform_drm.c index 3933f3776bd..df383d88b6f 100644 --- a/src/egl/drivers/dri2/platform_drm.c +++ b/src/egl/drivers/dri2/platform_drm.c @@ -42,6 +42,7 @@ #include "egl_dri2.h" #include "egldevice.h" +#include "eglglobals.h" #include "loader.h" static struct gbm_bo * @@ -581,10 +582,26 @@ dri2_initialize_drm(_EGLDisplay *disp) dri2_dpy->fd_display_gpu = loader_open_device(drm->nodes[DRM_NODE_PRIMARY]); } else { - char buf[64]; - int n = snprintf(buf, sizeof(buf), DRM_DEV_NAME, DRM_DIR_NAME, 0); - if (n != -1 && n < sizeof(buf)) - dri2_dpy->fd_display_gpu = loader_open_device(buf); + _EGLDevice *dev_list = _eglGlobal.DeviceList; + drmDevicePtr drm; + while (dev_list) { + if (!_eglDeviceSupports(dev_list, _EGL_DEVICE_DRM)) + goto next; + + drm = _eglDeviceDrm(dev_list); + + if (!(drm->available_nodes & (1 << DRM_NODE_PRIMARY))) + goto next; + + dri2_dpy->fd_display_gpu = + loader_open_device(drm->nodes[DRM_NODE_PRIMARY]); + if (dri2_dpy->fd_display_gpu < 0) + goto next; + + break; + next: + dev_list = _eglDeviceNext(dev_list); + } } gbm = gbm_create_device(dri2_dpy->fd_display_gpu);