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 <emil.velikov@collabora.com>
Reviewed-by: Eric Engestrom <eric.engestrom@imgtec.com>
This commit is contained in:
Gurchetan Singh 2017-10-02 13:43:57 -07:00 committed by Eric Engestrom
parent a8e4a0f609
commit 540c804297

View file

@ -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;
}