diff --git a/src/egl/drivers/dri2/platform_surfaceless.c b/src/egl/drivers/dri2/platform_surfaceless.c index 0e7248b065f..aa3d9ccb59d 100644 --- a/src/egl/drivers/dri2/platform_surfaceless.c +++ b/src/egl/drivers/dri2/platform_surfaceless.c @@ -34,6 +34,7 @@ #include #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; }