Commit a470f6b2 authored by Zhenyu Wang's avatar Zhenyu Wang

try to move some fields to xvmc driver structure

Still a lot of things to move include batch buffer, lock, context,
surface resource handling, etc.
parent ce9802ed
......@@ -45,6 +45,7 @@
/* common header for context private */
struct _intel_xvmc_common {
unsigned int type;
unsigned int sarea_size;
};
#ifdef _INTEL_XVMC_SERVER_
......
......@@ -386,7 +386,6 @@ static Bool i915_allocate_xvmc_buffers(ScrnInfoPtr pScrn, I915XvMCContextPriv *c
return FALSE;
}
/* XXX xvmc ttm */
if (!i830_allocate_xvmc_buffer(pScrn, "[XvMC]Correction Data Buffer",
&(ctxpriv->mcCorrdata), 512 * 1024,
ALIGN_BOTH_ENDS)) {
......@@ -530,6 +529,7 @@ static int I915XvMCCreateContext (ScrnInfoPtr pScrn, XvMCContextPtr pContext,
}
contextRec->comm.type = xvmc_driver->flag;
contextRec->comm.sarea_size = pDRIInfo->SAREASize;
contextRec->ctxno = i;
contextRec->sis.handle = ctxpriv->sis_handle;
contextRec->sis.offset = ctxpriv->mcStaticIndirectState->offset;
......@@ -557,9 +557,7 @@ static int I915XvMCCreateContext (ScrnInfoPtr pScrn, XvMCContextPtr pContext,
contextRec->batchbuffer.handle = ctxpriv->batchbuffer_handle;
contextRec->batchbuffer.offset = ctxpriv->mcBatchBuffer->offset;
contextRec->batchbuffer.size = ctxpriv->mcBatchBuffer->size;
contextRec->sarea_size = pDRIInfo->SAREASize;
contextRec->sarea_priv_offset = sizeof(XF86DRISAREARec);
contextRec->screen = pScrn->pScreen->myNum;
contextRec->depth = pScrn->bitsPerPixel;
contextRec->deviceID = pI830DRI->deviceID;
......
......@@ -66,9 +66,7 @@ typedef struct
struct hwmc_buffer psc;
struct hwmc_buffer corrdata;/* Correction Data Buffer */
struct hwmc_buffer batchbuffer;
unsigned int sarea_size;
unsigned int sarea_priv_offset;
unsigned int screen;
unsigned int depth;
int deviceID;
} I915XvMCCreateContextRec;
......
......@@ -148,7 +148,7 @@ static __inline__ void renderError(void)
static void I915XvMCContendedLock(i915XvMCContext *pI915XvMC, drmLockFlags flags)
{
drmGetLock(pI915XvMC->fd, pI915XvMC->hHWContext, flags);
drmGetLock(xvmc_driver->fd, pI915XvMC->hHWContext, flags);
}
#define SET_BLOCKED_SIGSET(pI915XvMC) do { \
......@@ -199,7 +199,7 @@ static void LOCK_HARDWARE(i915XvMCContext *pI915XvMC)
static void UNLOCK_HARDWARE(i915XvMCContext *pI915XvMC)
{
pI915XvMC->locked = 0;
DRM_UNLOCK(pI915XvMC->fd, pI915XvMC->driHwLock,
DRM_UNLOCK(xvmc_driver->fd, pI915XvMC->driHwLock,
pI915XvMC->hHWContext);
PPTHREAD_MUTEX_UNLOCK(pI915XvMC);
}
......@@ -1205,49 +1205,49 @@ static void i915_mc_invalidate_subcontext_buffers(XvMCContext *context, unsigned
static int i915_xvmc_map_buffers(i915XvMCContext *pI915XvMC)
{
if (drmMap(pI915XvMC->fd,
if (drmMap(xvmc_driver->fd,
pI915XvMC->sis.handle,
pI915XvMC->sis.size,
(drmAddress *)&pI915XvMC->sis.map) != 0) {
return -1;
}
if (drmMap(pI915XvMC->fd,
if (drmMap(xvmc_driver->fd,
pI915XvMC->ssb.handle,
pI915XvMC->ssb.size,
(drmAddress *)&pI915XvMC->ssb.map) != 0) {
return -1;
}
if (drmMap(pI915XvMC->fd,
if (drmMap(xvmc_driver->fd,
pI915XvMC->msb.handle,
pI915XvMC->msb.size,
(drmAddress *)&pI915XvMC->msb.map) != 0) {
return -1;
}
if (drmMap(pI915XvMC->fd,
if (drmMap(xvmc_driver->fd,
pI915XvMC->psp.handle,
pI915XvMC->psp.size,
(drmAddress *)&pI915XvMC->psp.map) != 0) {
return -1;
}
if (drmMap(pI915XvMC->fd,
if (drmMap(xvmc_driver->fd,
pI915XvMC->psc.handle,
pI915XvMC->psc.size,
(drmAddress *)&pI915XvMC->psc.map) != 0) {
return -1;
}
if (drmMap(pI915XvMC->fd,
if (drmMap(xvmc_driver->fd,
pI915XvMC->corrdata.handle,
pI915XvMC->corrdata.size,
(drmAddress *)&pI915XvMC->corrdata.map) != 0) {
return -1;
}
if (drmMap(pI915XvMC->fd,
if (drmMap(xvmc_driver->fd,
pI915XvMC->batchbuffer.handle,
pI915XvMC->batchbuffer.size,
(drmAddress *)&pI915XvMC->batchbuffer.map) != 0) {
......@@ -1718,6 +1718,7 @@ static void i915_yuv2rgb_proc(XvMCSurface *surface)
static void i915_release_resource(Display *display, XvMCContext *context)
{
i915XvMCContext *pI915XvMC;
int screen = DefaultScreen(display);
if (!(pI915XvMC = context->privData))
return;
......@@ -1731,18 +1732,19 @@ static void i915_release_resource(Display *display, XvMCContext *context)
pthread_mutex_destroy(&pI915XvMC->ctxmutex);
XLockDisplay(display);
uniDRIDestroyContext(display, pI915XvMC->screen, pI915XvMC->id);
uniDRIDestroyContext(display, screen, pI915XvMC->id);
XUnlockDisplay(display);
intelDestroyBatchBuffer(pI915XvMC);
drmUnmap(pI915XvMC->sarea_address, pI915XvMC->sarea_size);
if (pI915XvMC->fd >= 0)
drmClose(pI915XvMC->fd);
pI915XvMC->fd = -1;
drmUnmap(xvmc_driver->sarea_address, xvmc_driver->sarea_size);
if (xvmc_driver->fd >= 0)
drmClose(xvmc_driver->fd);
xvmc_driver->fd = -1;
XLockDisplay(display);
uniDRICloseConnection(display, pI915XvMC->screen);
uniDRICloseConnection(display, screen);
_xvmc_destroy_context(display, context);
XUnlockDisplay(display);
......@@ -1768,9 +1770,8 @@ static Status i915_xvmc_mc_create_context(Display *display, XvMCContext *context
(int)(sizeof(I915XvMCCreateContextRec) >> 2),priv_count);
_xvmc_destroy_context(display, context);
free(priv_data);
free(pI915XvMC);
context->privData = NULL;
return BadAccess;
return BadValue;
}
context->privData = (void *)calloc(1, sizeof(i915XvMCContext));
......@@ -1816,73 +1817,22 @@ static Status i915_xvmc_mc_create_context(Display *display, XvMCContext *context
pI915XvMC->batchbuffer.handle = tmpComm->batchbuffer.handle;
pI915XvMC->batchbuffer.offset = tmpComm->batchbuffer.offset;
pI915XvMC->batchbuffer.size = tmpComm->batchbuffer.size;
pI915XvMC->sarea_size = tmpComm->sarea_size;
pI915XvMC->sarea_priv_offset = tmpComm->sarea_priv_offset;
//XXX
// xvmc_driver->screen =
pI915XvMC->screen = tmpComm->screen;
pI915XvMC->depth = tmpComm->depth;
/* Must free the private data we were passed from X */
free(priv_data);
priv_data = NULL;
/* XXX just keep current i915 setup code for now */
ret = uniDRIQueryDirectRenderingCapable(display, pI915XvMC->screen,
&isCapable);
if (!ret || !isCapable) {
XVMC_ERR("Direct Rendering is not available on this system!");
return BadAlloc;
}
if (!uniDRIOpenConnection(display, pI915XvMC->screen,
&pI915XvMC->hsarea, &curBusID)) {
XVMC_ERR("Could not open DRI connection to X server!");
return BadAlloc;
}
strncpy(pI915XvMC->busIdString, curBusID, 20);
pI915XvMC->busIdString[20] = '\0';
free(curBusID);
/* Open DRI Device */
if((pI915XvMC->fd = drmOpen("i915", NULL)) < 0) {
XVMC_ERR("DRM Device could not be opened.");
//(xvmc_driver->fini)();
//xvmc_driver = NULL;
return BadAccess;
}
/* Get magic number */
drmGetMagic(pI915XvMC->fd, &magic);
// context->flags = (unsigned long)magic;
if (!uniDRIAuthConnection(display, pI915XvMC->screen, magic)) {
XVMC_ERR("[XvMC]: X server did not allow DRI. Check permissions.");
//(xvmc_driver->fini)();
//xvmc_driver = NULL;
return BadAlloc;
}
/*
* Map DRI Sarea. we always want it right?
*/
if (drmMap(pI915XvMC->fd, pI915XvMC->hsarea,
pI915XvMC->sarea_size, &pI915XvMC->sarea_address) < 0) {
XVMC_ERR("Unable to map DRI SAREA.\n");
//(xvmc_driver->fini)();
//xvmc_driver = NULL;
return BadAlloc;
}
pSAREA = (drm_sarea_t *)pI915XvMC->sarea_address;
pSAREA = (drm_sarea_t *)xvmc_driver->sarea_address;
pI915XvMC->driHwLock = (drmLock *)&pSAREA->lock;
pI915XvMC->sarea = SAREAPTR(pI915XvMC);
XLockDisplay(display);
ret = XMatchVisualInfo(display, pI915XvMC->screen,
pI915XvMC->sarea = (drmI830Sarea*)((char*)pSAREA + pI915XvMC->sarea_priv_offset);
/*
* XXX we don't need to bother X for DRI context, as we're not DRI. */
#if 0
ret = XMatchVisualInfo(display, xvmc_driver->screen,
(pI915XvMC->depth == 32) ? 24 : pI915XvMC->depth, TrueColor,
&pI915XvMC->visualInfo);
XUnlockDisplay(display);
if (!ret) {
XVMC_ERR("Could not find a matching TrueColor visual.");
......@@ -1901,12 +1851,12 @@ static Status i915_xvmc_mc_create_context(Display *display, XvMCContext *context
drmUnmap(pI915XvMC->sarea_address, pI915XvMC->sarea_size);
return BadAlloc;
}
#endif
if (NULL == (pI915XvMC->drawHash = drmHashCreate())) {
XVMC_ERR("Could not allocate drawable hash table.");
free(pI915XvMC);
context->privData = NULL;
drmUnmap(pI915XvMC->sarea_address, pI915XvMC->sarea_size);
return BadAlloc;
}
......@@ -1914,7 +1864,6 @@ static Status i915_xvmc_mc_create_context(Display *display, XvMCContext *context
i915_xvmc_unmap_buffers(pI915XvMC);
free(pI915XvMC);
context->privData = NULL;
drmUnmap(pI915XvMC->sarea_address, pI915XvMC->sarea_size);
return BadAlloc;
}
......@@ -1927,6 +1876,7 @@ static Status i915_xvmc_mc_create_context(Display *display, XvMCContext *context
pI915XvMC->locked = 0;
pI915XvMC->port = context->port;
pthread_mutex_init(&pI915XvMC->ctxmutex, NULL);
/* XXX */
intelInitBatchBuffer(pI915XvMC);
pI915XvMC->ref = 1;
return Success;
......@@ -2024,7 +1974,7 @@ static Status i915_xvmc_mc_create_surface(Display *display, XvMCContext *context
pI915Surface->srf.size = tmpComm->srf.size;
free(priv_data);
if (drmMap(pI915XvMC->fd,
if (drmMap(xvmc_driver->fd,
pI915Surface->srf.handle,
pI915Surface->srf.size,
(drmAddress *)&pI915Surface->srf.map) != 0) {
......
......@@ -63,7 +63,6 @@ typedef struct _i915XvMCDrmMap {
***************************************************************************/
typedef struct _i915XvMCContext {
unsigned int ctxno;
int fd; /* File descriptor for /dev/dri */
unsigned int last_render;
unsigned int last_flip;
unsigned int dual_prime; /* Flag to identify when dual prime is in use. */
......@@ -71,18 +70,13 @@ typedef struct _i915XvMCContext {
unsigned int uvStride;
unsigned short ref;
pthread_mutex_t ctxmutex;
char busIdString[21]; /* PCI:0:1:0 or PCI:0:2:0 */
int lock; /* Lightweight lock to avoid locking twice */
int locked;
volatile drmI830Sarea *sarea;
drmLock *driHwLock;
drm_context_t hHWContext; /* drmcontext; */
drm_handle_t hsarea; /* Handle to drm shared memory area */
drmAddress sarea_address; /* Virtual address of shared memory area */
unsigned int sarea_size; /* Size of drm shared memory area */
unsigned int sarea_priv_offset; /* Offset in sarea to private part */
unsigned int screen;
unsigned int depth;
XvPortID port; /* Xv Port ID when displaying */
int haveXv; /* Have I initialized the Xv
......@@ -108,13 +102,13 @@ typedef struct _i915XvMCContext {
sigset_t sa_mask;
struct {
unsigned int start_offset;
unsigned int size;
unsigned int space;
unsigned char *ptr;
unsigned int start_offset;
unsigned int size;
unsigned int space;
unsigned char *ptr;
} batch;
struct
struct
{
void *ptr;
unsigned int size;
......
......@@ -54,7 +54,7 @@ int intelEmitIrqLocked(i915XvMCContext *pI915XvMC)
int ret, seq;
ie.irq_seq = &seq;
ret = drmCommandWriteRead(pI915XvMC->fd, DRM_I830_IRQ_EMIT,
ret = drmCommandWriteRead(xvmc_driver->fd, DRM_I830_IRQ_EMIT,
&ie, sizeof(ie));
if ( ret ) {
......@@ -73,7 +73,7 @@ void intelWaitIrq(i915XvMCContext *pI915XvMC, int seq)
iw.irq_seq = seq;
do {
ret = drmCommandWrite(pI915XvMC->fd, DRM_I830_IRQ_WAIT, &iw, sizeof(iw) );
ret = drmCommandWrite(xvmc_driver->fd, DRM_I830_IRQ_WAIT, &iw, sizeof(iw) );
} while (ret == -EAGAIN || ret == -EINTR);
if (ret) {
......@@ -206,7 +206,7 @@ void intelFlushBatchLocked(i915XvMCContext *pI915XvMC,
assert(batch.start + batch.used <= pI915XvMC->alloc.offset + pI915XvMC->alloc.size);
if (pI915XvMC->alloc.offset) {
if (drmCommandWrite(pI915XvMC->fd, DRM_I830_BATCHBUFFER, &batch, sizeof(batch))) {
if (drmCommandWrite(xvmc_driver->fd, DRM_I830_BATCHBUFFER, &batch, sizeof(batch))) {
fprintf(stderr, "DRM_I830_BATCHBUFFER: %d\n", -errno);
exit(1);
}
......@@ -219,7 +219,7 @@ void intelFlushBatchLocked(i915XvMCContext *pI915XvMC,
cmd.num_cliprects = batch.num_cliprects;
cmd.cliprects = batch.cliprects;
if (drmCommandWrite(pI915XvMC->fd, DRM_I830_CMDBUFFER,
if (drmCommandWrite(xvmc_driver->fd, DRM_I830_CMDBUFFER,
&cmd, sizeof(cmd))) {
fprintf(stderr, "DRM_I915_CMDBUFFER: %d\n", -errno);
exit(1);
......@@ -247,7 +247,7 @@ void intelCmdIoctl(i915XvMCContext *pI915XvMC, char *buf, unsigned used)
cmd.DR1 = 0;
cmd.DR4 = 0;
if (drmCommandWrite(pI915XvMC->fd, DRM_I830_CMDBUFFER,
if (drmCommandWrite(xvmc_driver->fd, DRM_I830_CMDBUFFER,
&cmd, sizeof(cmd))) {
fprintf(stderr, "DRM_I830_CMDBUFFER: %d\n", -errno);
exit(1);
......
......@@ -26,26 +26,26 @@
*/
#include "intel_xvmc.h"
static struct _intel_xvmc_driver* xvmc_driver = NULL;
struct _intel_xvmc_driver *xvmc_driver = NULL;
static int error_base;
static int event_base;
/***************************************************************************
// Function: XvMCCreateContext
// Description: Create a XvMC context for the given surface parameters.
// Arguments:
// display - Connection to the X server.
// port - XvPortID to use as avertised by the X connection.
// surface_type_id - Unique identifier for the Surface type.
// width - Width of the surfaces.
// height - Height of the surfaces.
// flags - one or more of the following
// XVMC_DIRECT - A direct rendered context is requested.
//
// Notes: surface_type_id and width/height parameters must match those
// returned by XvMCListSurfaceTypes.
// Returns: Status
***************************************************************************/
/*
* Function: XvMCCreateContext
* Description: Create a XvMC context for the given surface parameters.
* Arguments:
* display - Connection to the X server.
* port - XvPortID to use as avertised by the X connection.
* surface_type_id - Unique identifier for the Surface type.
* width - Width of the surfaces.
* height - Height of the surfaces.
* flags - one or more of the following
* XVMC_DIRECT - A direct rendered context is requested.
* Notes: surface_type_id and width/height parameters must match those
* returned by XvMCListSurfaceTypes.
* Returns: Status
*/
Status XvMCCreateContext(Display *display, XvPortID port,
int surface_type_id, int width, int height,
int flags, XvMCContext *context)
......@@ -55,17 +55,17 @@ Status XvMCCreateContext(Display *display, XvPortID port,
char *curBusID;
CARD32 *priv_data = NULL;
struct _intel_xvmc_common *comm;
uint magic;
drm_magic_t magic;
int major, minor;
int priv_count;
int isCapable;
int screen = DefaultScreen(display);
/* Verify Obvious things first */
if (!display || !context)
return BadValue;
if (!(flags & XVMC_DIRECT)) {
/* Indirect */
XVMC_ERR("Indirect Rendering not supported! Using Direct.");
return BadValue;
}
......@@ -91,7 +91,7 @@ Status XvMCCreateContext(Display *display, XvPortID port,
if (!XvMCQueryExtension(display, &event_base, &error_base)) {
XVMC_ERR("XvMCExtension is not available!");
return BadAccess;
return BadValue;
}
ret = XvMCQueryVersion(display, &major, &minor);
if (ret) {
......@@ -136,32 +136,25 @@ Status XvMCCreateContext(Display *display, XvPortID port,
return BadValue;
}
if (xvmc_driver == NULL) {
if (xvmc_driver == NULL || xvmc_driver->type != comm->type) {
XVMC_ERR("fail to load xvmc driver for type %d\n", comm->type);
return BadValue;
}
xvmc_driver->sarea_size = comm->sarea_size;
/* driver hook should free priv_data after return if success.
* and set xvmc_driver->screen num */
ret = (xvmc_driver->create_context)(display, context, priv_count, priv_data);
if (ret) {
XVMC_ERR("driver create context failed\n");
free(priv_data);
return ret;
}
#if 0
ret = uniDRIQueryDirectRenderingCapable(display, xvmc_driver->screen,
ret = uniDRIQueryDirectRenderingCapable(display, screen,
&isCapable);
if (!ret || !isCapable) {
XVMC_ERR("Direct Rendering is not available on this system!");
return BadAlloc;
free(priv_data);
return BadValue;
}
if (!uniDRIOpenConnection(display, xvmc_driver->screen,
if (!uniDRIOpenConnection(display, screen,
&xvmc_driver->hsarea, &curBusID)) {
XVMC_ERR("Could not open DRI connection to X server!");
return BadAlloc;
free(priv_data);
return BadValue;
}
strncpy(xvmc_driver->busID, curBusID, 20);
......@@ -171,19 +164,21 @@ Status XvMCCreateContext(Display *display, XvPortID port,
/* Open DRI Device */
if((xvmc_driver->fd = drmOpen("i915", NULL)) < 0) {
XVMC_ERR("DRM Device could not be opened.");
(xvmc_driver->fini)();
//(xvmc_driver->fini)();
xvmc_driver = NULL;
return BadAccess;
free(priv_data);
return BadValue;
}
/* Get magic number */
drmGetMagic(xvmc_driver->fd, &magic);
// context->flags = (unsigned long)magic;
if (!uniDRIAuthConnection(display, xvmc_driver->screen, magic)) {
if (!uniDRIAuthConnection(display, screen, magic)) {
XVMC_ERR("[XvMC]: X server did not allow DRI. Check permissions.");
(xvmc_driver->fini)();
//(xvmc_driver->fini)();
xvmc_driver = NULL;
free(priv_data);
return BadAlloc;
}
......@@ -193,66 +188,24 @@ Status XvMCCreateContext(Display *display, XvPortID port,
if (drmMap(xvmc_driver->fd, xvmc_driver->hsarea,
xvmc_driver->sarea_size, &xvmc_driver->sarea_address) < 0) {
XVMC_ERR("Unable to map DRI SAREA.\n");
(xvmc_driver->fini)();
//(xvmc_driver->fini)();
xvmc_driver = NULL;
free(priv_data);
return BadAlloc;
}
pSAREA = (drm_sarea_t *)xvmc_driver->sarea_address;
pI915XvMC->driHwLock = (drmLock *)&pSAREA->lock;
pI915XvMC->sarea = SAREAPTR(pI915XvMC);
XLockDisplay(display);
ret = XMatchVisualInfo(display, pI915XvMC->screen,
(pI915XvMC->depth == 32) ? 24 : pI915XvMC->depth, TrueColor,
&pI915XvMC->visualInfo);
XUnlockDisplay(display);
if (!ret) {
XVMC_ERR("Could not find a matching TrueColor visual.");
free(pI915XvMC);
context->privData = NULL;
drmUnmap(pI915XvMC->sarea_address, pI915XvMC->sarea_size);
return BadAlloc;
}
if (!uniDRICreateContext(display, pI915XvMC->screen,
pI915XvMC->visualInfo.visual, &pI915XvMC->id,
&pI915XvMC->hHWContext)) {
XVMC_ERR("Could not create DRI context.");
free(pI915XvMC);
context->privData = NULL;
drmUnmap(pI915XvMC->sarea_address, pI915XvMC->sarea_size);
return BadAlloc;
}
if (NULL == (pI915XvMC->drawHash = drmHashCreate())) {
XVMC_ERR("Could not allocate drawable hash table.");
free(pI915XvMC);
context->privData = NULL;
drmUnmap(pI915XvMC->sarea_address, pI915XvMC->sarea_size);
return BadAlloc;
}
if (i915_xvmc_map_buffers(pI915XvMC)) {
i915_xvmc_unmap_buffers(pI915XvMC);
free(pI915XvMC);
context->privData = NULL;
drmUnmap(pI915XvMC->sarea_address, pI915XvMC->sarea_size);
return BadAlloc;
/* call driver hook.
* driver hook should free priv_data after return if success.*/
ret = (xvmc_driver->create_context)(display, context, priv_count, priv_data);
if (ret) {
XVMC_ERR("driver create context failed\n");
free(priv_data);
drmUnmap(xvmc_driver->sarea_address, xvmc_driver->sarea_size);
return ret;
}
/* Initialize private context values */
pI915XvMC->yStride = STRIDE(width);
pI915XvMC->uvStride = STRIDE(width >> 1);
pI915XvMC->haveXv = 0;
pI915XvMC->dual_prime = 0;
pI915XvMC->last_flip = 0;
pI915XvMC->locked = 0;
pI915XvMC->port = context->port;
pthread_mutex_init(&pI915XvMC->ctxmutex, NULL);
intelInitBatchBuffer(pI915XvMC);
pI915XvMC->ref = 1;
#endif
/* FIXME batch buffer */
//intelInitBatchBuffer(xvmc_driver);
return Success;
}
......
......@@ -101,14 +101,16 @@ extern Status _xvmc_destroy_subpicture(Display *dpy,
struct _intel_xvmc_driver {
int type; /* hw xvmc type - i830_hwmc.h */
int screen; /* current screen num*/
#if 0
int fd; /* drm file handler */
drm_handle_t hsarea; /* DRI open connect */
char busID[32];
unsigned int sarea_size;
drmAddress sarea_address;
#endif
char busID[32];
int fd; /* drm file handler */
void *private;
/* XXX: remove? */
int (*init)(void);
void (*fini)(void);
......@@ -149,5 +151,6 @@ struct _intel_xvmc_driver {
};
extern struct _intel_xvmc_driver i915_xvmc_mc_driver;
extern struct _intel_xvmc_driver *xvmc_driver;
#endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment