浏览代码

prototype new code to map card number to driver name

tags/mesa_20090313
Brian Paul 17 年前
父节点
当前提交
17ec3b3cc5
共有 1 个文件被更改,包括 62 次插入4 次删除
  1. 62
    4
      src/egl/drivers/dri/egldri.c

+ 62
- 4
src/egl/drivers/dri/egldri.c 查看文件

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

正在加载...
取消
保存