prototype new code to map card number to driver name

This commit is contained in:
Brian Paul 2008-05-28 11:45:50 -06:00
parent aa4ca9119d
commit 17ec3b3cc5

View file

@ -1,5 +1,6 @@
/**
* Generic EGL driver for DRI.
* Generic EGL driver for DRI. This is basically an "adaptor" driver
* that allows libEGL to load/use regular DRI drivers.
*
* This file contains all the code needed to interface DRI-based drivers
* with libEGL.
@ -37,6 +38,41 @@ const char *sysfs = "/sys/class";
static const int empty_attribute_list[1] = { None };
/**
* Given a card number, return the name of the DRI driver to use.
* This generally means reading the contents of
* /sys/class/drm/cardX/dri_library_name, where X is the card number
*/
static EGLBoolean
driver_name_from_card_number(int card, char *driverName, int maxDriverName)
{
char path[2000];
FILE *f;
int length;
snprintf(path, sizeof(path), "%s/drm/card%d/dri_library_name", sysfs, card);
f = fopen(path, "r");
if (!f)
return EGL_FALSE;
fgets(driverName, maxDriverName, f);
fclose(f);
if ((length = strlen(driverName)) > 1) {
/* remove the trailing newline from sysfs */
driverName[length - 1] = '\0';
strncat(driverName, "_dri", maxDriverName);
return EGL_TRUE;
}
else {
return EGL_FALSE;
}
}
/**
* The bootstrap function.
* Return a new driDriver object and plug in API functions.
@ -45,6 +81,26 @@ static const int empty_attribute_list[1] = { None };
_EGLDriver *
_eglMain(_EGLDisplay *dpy)
{
#if 1
const char *displayString = (const char *) dpy->NativeDisplay;
const int card = atoi(displayString + 1);
_EGLDriver *driver = NULL;
char driverName[1000];
if (!driver_name_from_card_number(card, driverName, sizeof(driverName))) {
_eglLog(_EGL_WARNING,
"Unable to determine driver name for card %d\n", card);
return NULL;
}
_eglLog(_EGL_DEBUG, "Driver name: %s\n", driverName);
driver = _eglOpenDriver(dpy, driverName);
return driver;
#else
int length;
char path[NAME_MAX];
struct dirent *dirent;
@ -63,11 +119,11 @@ _eglMain(_EGLDisplay *dpy)
if (strncmp(&dirent->d_name[0], "card", 4) != 0)
continue;
if (strcmp(&dirent->d_name[4], &dpy->DriverName[1]) != 0)
if (strcmp(&dirent->d_name[4], &driverName[1]) != 0)
continue;
snprintf(path, sizeof(path), "%s/drm/card%s/dri_library_name",
sysfs, &dpy->DriverName[1]);
sysfs, &driverName[1]);
_eglLog(_EGL_INFO, "Opening %s", path);
#if 1
file = fopen(path, "r");
@ -91,6 +147,7 @@ _eglMain(_EGLDisplay *dpy)
closedir(dir);
return driver;
#endif
}
@ -1087,6 +1144,7 @@ _eglDRIInitialize(_EGLDriver *drv, EGLDisplay dpy,
{
_EGLDisplay *disp = _eglLookupDisplay(dpy);
driDisplay *display;
const char *driverName = (const char *) disp->NativeDisplay;
assert(disp);
@ -1101,7 +1159,7 @@ _eglDRIInitialize(_EGLDriver *drv, EGLDisplay dpy,
*major = 1;
*minor = 0;
sscanf(&disp->DriverName[1], "%d", &display->minor);
sscanf(driverName + 1, "%d", &display->minor);
drv->Initialized = EGL_TRUE;
return EGL_TRUE;