DRI2: Allow multiple driver names.
Each driver type (e.g. DRI2DriverDRI or DRI2DriverVDPAU) can have a name in the driverNames array in DRI2InfoRec. DRI2Connect returns the name for the driver specified by driverType. Also print names of supported drivers in DRI2ScreenInit. Signed-off-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Kristian Høgsberg <krh@bitplanet.net> Signed-off-by: Keith Packard <keithp@keithp.com>
This commit is contained in:
parent
f57bc0ede8
commit
f311f2d047
|
@ -70,7 +70,8 @@ typedef struct _DRI2Drawable {
|
||||||
typedef struct _DRI2Screen *DRI2ScreenPtr;
|
typedef struct _DRI2Screen *DRI2ScreenPtr;
|
||||||
|
|
||||||
typedef struct _DRI2Screen {
|
typedef struct _DRI2Screen {
|
||||||
const char *driverName;
|
unsigned int numDrivers;
|
||||||
|
const char **driverNames;
|
||||||
const char *deviceName;
|
const char *deviceName;
|
||||||
int fd;
|
int fd;
|
||||||
unsigned int lastSequence;
|
unsigned int lastSequence;
|
||||||
|
@ -772,14 +773,12 @@ DRI2Connect(ScreenPtr pScreen, unsigned int driverType, int *fd,
|
||||||
{
|
{
|
||||||
DRI2ScreenPtr ds = DRI2GetScreen(pScreen);
|
DRI2ScreenPtr ds = DRI2GetScreen(pScreen);
|
||||||
|
|
||||||
if (ds == NULL)
|
if (ds == NULL || driverType >= ds->numDrivers ||
|
||||||
|
!ds->driverNames[driverType])
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
if (driverType != DRI2DriverDRI)
|
|
||||||
return BadValue;
|
|
||||||
|
|
||||||
*fd = ds->fd;
|
*fd = ds->fd;
|
||||||
*driverName = ds->driverName;
|
*driverName = ds->driverNames[driverType];
|
||||||
*deviceName = ds->deviceName;
|
*deviceName = ds->deviceName;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
@ -800,6 +799,11 @@ Bool
|
||||||
DRI2ScreenInit(ScreenPtr pScreen, DRI2InfoPtr info)
|
DRI2ScreenInit(ScreenPtr pScreen, DRI2InfoPtr info)
|
||||||
{
|
{
|
||||||
DRI2ScreenPtr ds;
|
DRI2ScreenPtr ds;
|
||||||
|
const char* driverTypeNames[] = {
|
||||||
|
"DRI", /* DRI2DriverDRI */
|
||||||
|
"VDPAU", /* DRI2DriverVDPAU */
|
||||||
|
};
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
if (info->version < 3)
|
if (info->version < 3)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -815,7 +819,6 @@ DRI2ScreenInit(ScreenPtr pScreen, DRI2InfoPtr info)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
ds->fd = info->fd;
|
ds->fd = info->fd;
|
||||||
ds->driverName = info->driverName;
|
|
||||||
ds->deviceName = info->deviceName;
|
ds->deviceName = info->deviceName;
|
||||||
|
|
||||||
ds->CreateBuffer = info->CreateBuffer;
|
ds->CreateBuffer = info->CreateBuffer;
|
||||||
|
@ -828,9 +831,35 @@ DRI2ScreenInit(ScreenPtr pScreen, DRI2InfoPtr info)
|
||||||
ds->GetMSC = info->GetMSC;
|
ds->GetMSC = info->GetMSC;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (info->version == 3 || info->numDrivers == 0) {
|
||||||
|
/* Driver too old: use the old-style driverName field */
|
||||||
|
ds->numDrivers = 1;
|
||||||
|
ds->driverNames = xalloc(sizeof(*ds->driverNames));
|
||||||
|
if (!ds->driverNames) {
|
||||||
|
xfree(ds);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
ds->driverNames[0] = info->driverName;
|
||||||
|
} else {
|
||||||
|
ds->numDrivers = info->numDrivers;
|
||||||
|
ds->driverNames = xalloc(info->numDrivers * sizeof(*ds->driverNames));
|
||||||
|
if (!ds->driverNames) {
|
||||||
|
xfree(ds);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
memcpy(ds->driverNames, info->driverNames,
|
||||||
|
info->numDrivers * sizeof(*ds->driverNames));
|
||||||
|
}
|
||||||
|
|
||||||
dixSetPrivate(&pScreen->devPrivates, dri2ScreenPrivateKey, ds);
|
dixSetPrivate(&pScreen->devPrivates, dri2ScreenPrivateKey, ds);
|
||||||
|
|
||||||
xf86DrvMsg(pScreen->myNum, X_INFO, "[DRI2] Setup complete\n");
|
xf86DrvMsg(pScreen->myNum, X_INFO, "[DRI2] Setup complete\n");
|
||||||
|
for (i = 0; i < sizeof(driverTypeNames) / sizeof(driverTypeNames[0]); i++) {
|
||||||
|
if (i < ds->numDrivers && ds->driverNames[i]) {
|
||||||
|
xf86DrvMsg(pScreen->myNum, X_INFO, "[DRI2] %s driver: %s\n",
|
||||||
|
driverTypeNames[i], ds->driverNames[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@ -840,6 +869,7 @@ DRI2CloseScreen(ScreenPtr pScreen)
|
||||||
{
|
{
|
||||||
DRI2ScreenPtr ds = DRI2GetScreen(pScreen);
|
DRI2ScreenPtr ds = DRI2GetScreen(pScreen);
|
||||||
|
|
||||||
|
xfree(ds->driverNames);
|
||||||
xfree(ds);
|
xfree(ds);
|
||||||
dixSetPrivate(&pScreen->devPrivates, dri2ScreenPrivateKey, NULL);
|
dixSetPrivate(&pScreen->devPrivates, dri2ScreenPrivateKey, NULL);
|
||||||
}
|
}
|
||||||
|
|
|
@ -164,9 +164,18 @@ typedef struct {
|
||||||
DRI2DestroyBufferProcPtr DestroyBuffer;
|
DRI2DestroyBufferProcPtr DestroyBuffer;
|
||||||
DRI2CopyRegionProcPtr CopyRegion;
|
DRI2CopyRegionProcPtr CopyRegion;
|
||||||
DRI2WaitProcPtr Wait;
|
DRI2WaitProcPtr Wait;
|
||||||
|
|
||||||
|
/* added in version 4 */
|
||||||
|
|
||||||
DRI2ScheduleSwapProcPtr ScheduleSwap;
|
DRI2ScheduleSwapProcPtr ScheduleSwap;
|
||||||
DRI2GetMSCProcPtr GetMSC;
|
DRI2GetMSCProcPtr GetMSC;
|
||||||
DRI2ScheduleWaitMSCProcPtr ScheduleWaitMSC;
|
DRI2ScheduleWaitMSCProcPtr ScheduleWaitMSC;
|
||||||
|
|
||||||
|
/* number of drivers in the driverNames array */
|
||||||
|
unsigned int numDrivers;
|
||||||
|
/* array of driver names, indexed by DRI2Driver* driver types */
|
||||||
|
/* a name of NULL means that driver is not supported */
|
||||||
|
const char * const *driverNames;
|
||||||
} DRI2InfoRec, *DRI2InfoPtr;
|
} DRI2InfoRec, *DRI2InfoPtr;
|
||||||
|
|
||||||
extern _X_EXPORT int DRI2EventBase;
|
extern _X_EXPORT int DRI2EventBase;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user