mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-04 22:49:13 +02:00
prototype new code to map card number to driver name
This commit is contained in:
parent
aa4ca9119d
commit
17ec3b3cc5
1 changed files with 62 additions and 4 deletions
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue