mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-04 09:48:07 +02:00
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:
parent
a8e4a0f609
commit
540c804297
1 changed files with 39 additions and 28 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue