From a2aea2672792dcf5ce63b2278d6128db4c795ca2 Mon Sep 17 00:00:00 2001 From: Robert Foss Date: Tue, 13 Jun 2023 13:57:45 +0200 Subject: [PATCH] egl/surfaceless: Use EGL DeviceList instead of drmGetDevices2() surfaceless_probe_device() lists all of the DRM devices available, but since EGL already already has created such a list use that instead. Signed-off-by: Robert Foss Reviewed-by: Adam Jackson Part-of: --- src/egl/drivers/dri2/platform_surfaceless.c | 45 ++++++++++++++--------------- 1 file changed, 21 insertions(+), 24 deletions(-) diff --git a/src/egl/drivers/dri2/platform_surfaceless.c b/src/egl/drivers/dri2/platform_surfaceless.c index 0e7248b..aa3d9cc 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; } -- 2.7.4