From 540c804297d813aa7df28d570e0407e332873c88 Mon Sep 17 00:00:00 2001 From: Gurchetan Singh Date: Mon, 2 Oct 2017 13:43:57 -0700 Subject: [PATCH] egl/surfaceless: add probe device helper function This will help us initialize a software driver, if it's needed or requested. Reviewed-by: Emil Velikov Reviewed-by: Eric Engestrom --- src/egl/drivers/dri2/platform_surfaceless.c | 67 +++++++++++++++++------------ 1 file changed, 39 insertions(+), 28 deletions(-) diff --git a/src/egl/drivers/dri2/platform_surfaceless.c b/src/egl/drivers/dri2/platform_surfaceless.c index 3c00ff4..f6aa217 100644 --- a/src/egl/drivers/dri2/platform_surfaceless.c +++ b/src/egl/drivers/dri2/platform_surfaceless.c @@ -267,6 +267,44 @@ static const __DRIextension *image_loader_extensions[] = { NULL, }; +static bool +surfaceless_probe_device(_EGLDisplay *dpy) +{ + struct dri2_egl_display *dri2_dpy = dpy->DriverData; + const int limit = 64; + const int base = 128; + int fd; + int i; + + for (i = 0; i < limit; ++i) { + char *card_path; + if (asprintf(&card_path, DRM_RENDER_DEV_NAME, DRM_DIR_NAME, base + i) < 0) + continue; + + fd = loader_open_device(card_path); + free(card_path); + if (fd < 0) + continue; + + dri2_dpy->driver_name = loader_get_driver_for_fd(fd); + if (!dri2_dpy->driver_name) { + close(fd); + continue; + } + + dri2_dpy->fd = fd; + if (dri2_load_driver_dri3(dpy)) + return true; + + close(fd); + dri2_dpy->fd = -1; + free(dri2_dpy->driver_name); + dri2_dpy->driver_name = NULL; + } + + return false; +} + EGLBoolean dri2_initialize_surfaceless(_EGLDriver *drv, _EGLDisplay *disp) { @@ -282,34 +320,7 @@ dri2_initialize_surfaceless(_EGLDriver *drv, _EGLDisplay *disp) dri2_dpy->fd = -1; disp->DriverData = (void *) dri2_dpy; - - const int limit = 64; - const int base = 128; - for (int i = 0; i < limit; ++i) { - char *card_path; - if (asprintf(&card_path, DRM_RENDER_DEV_NAME, DRM_DIR_NAME, base + i) < 0) - continue; - - dri2_dpy->fd = loader_open_device(card_path); - - free(card_path); - if (dri2_dpy->fd < 0) - continue; - - dri2_dpy->driver_name = loader_get_driver_for_fd(dri2_dpy->fd); - if (dri2_dpy->driver_name) { - if (dri2_load_driver_dri3(disp)) { - driver_loaded = 1; - break; - } - free(dri2_dpy->driver_name); - dri2_dpy->driver_name = NULL; - } - close(dri2_dpy->fd); - dri2_dpy->fd = -1; - } - - if (!driver_loaded) { + if (!surfaceless_probe_device(disp)) { err = "DRI2: failed to load driver"; goto cleanup; } -- 2.7.4