diff options
Diffstat (limited to 'src/via_xvmc.c')
-rw-r--r-- | src/via_xvmc.c | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/src/via_xvmc.c b/src/via_xvmc.c index ebd1103..f638cef 100644 --- a/src/via_xvmc.c +++ b/src/via_xvmc.c @@ -187,6 +187,112 @@ XvMCEProcBufferStatus(ClientPtr client) * */ static int +XvMCEProcBufferSliceInit(ClientPtr client) +{ + ExtensionEntry *XvMCE_Ext; + struct XvMCEPrivates *Private; + ScrnInfoPtr pScrn; + XvPortPtr Port; + int i; + + REQUEST(xvmceBufferSliceInitReq); + REQUEST_SIZE_MATCH(xvmceBufferSliceInitReq); + + XvMCE_Ext = CheckExtension(XVMCE_EXT_NAME); + if (!XvMCE_Ext || !XvMCE_Ext->extPrivate) { + xf86Msg(X_WARNING, "%s: Extension not initialised.\n", __func__); + return BadMatch; + } + + Private = XvMCE_Ext->extPrivate; + pScrn = xf86Screens[Private->scrnIndex]; + + /* Does our client own this port? */ + Port = LookupIDByType(stuff->Port, XvGetRTPort()); + if (!Port) { + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "%s: Client doesn't own this Xv Port.\n", __func__); + return BadAccess; + } + + for (i = 0; i < VIAMC_BUFFER_COUNT; i++) + if (ViaMCBufferIDs[i] == stuff->Buffer) + break; + + if (i == VIAMC_BUFFER_COUNT) { + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "%s: Buffer 0x%08X does not " + "exist.\n", __func__, (unsigned int) stuff->Buffer); + return BadAccess; + } + + ViaDebug(pScrn->scrnIndex, "%s: Buffer 0x%08X\n", __func__, stuff->Buffer); + ViaDebug(pScrn->scrnIndex, "\t PictureType: 0x%02X, SliceFlags: 0x%02X\n", + stuff->PictureType, stuff->SliceFlags); + ViaDebug(pScrn->scrnIndex, "\t Present %01X: backwards 0x%08X, forwards 0x%08X\n", + stuff->ReferencesPresent, stuff->BackwardsReferenceBuffer, + stuff->ForwardsReferenceBuffer); + ViaDebug(pScrn->scrnIndex, "\t Ranges BH %d, BV %d, FH %d, FV %d\n", + stuff->MVRange_BackwardsHorizontal, stuff->MVRange_BackwardsVertical, + stuff->MVRange_ForwardsHorizontal, stuff->MVRange_ForwardsVertical); + + /* !!!! Setup hw here. !!!! */ + + return (client->noClientException); +} +/* + * + */ +static int +XvMCEProcBufferSliceSend(ClientPtr client) +{ + ExtensionEntry *XvMCE_Ext; + struct XvMCEPrivates *Private; + ScrnInfoPtr pScrn; + XvPortPtr Port; + int i; + + REQUEST(xvmceBufferSliceSendReq); + REQUEST_AT_LEAST_SIZE(xvmceBufferSliceSendReq); + + XvMCE_Ext = CheckExtension(XVMCE_EXT_NAME); + if (!XvMCE_Ext || !XvMCE_Ext->extPrivate) { + xf86Msg(X_WARNING, "%s: Extension not initialised.\n", __func__); + return BadMatch; + } + + Private = XvMCE_Ext->extPrivate; + pScrn = xf86Screens[Private->scrnIndex]; + + /* Does our client own this port? */ + Port = LookupIDByType(stuff->Port, XvGetRTPort()); + if (!Port) { + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "%s: Client doesn't own this Xv Port.\n", __func__); + return BadAccess; + } + + for (i = 0; i < VIAMC_BUFFER_COUNT; i++) + if (ViaMCBufferIDs[i] == stuff->Buffer) + break; + + if (i == VIAMC_BUFFER_COUNT) { + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "%s: Buffer 0x%08X does not " + "exist.\n", __func__, (unsigned int) stuff->Buffer); + return BadAccess; + } + + ViaDebug(pScrn->scrnIndex, "%s: Buffer 0x%08X: Slice %dbytes\n", + __func__, stuff->Buffer, stuff->SliceLength); + + /* !!!! dump the slice to the hw here. !!!! */ + + return (client->noClientException); +} + +/* + * + */ +static int XvMCEHandler(ClientPtr client) { REQUEST(xReq); @@ -198,6 +304,10 @@ XvMCEHandler(ClientPtr client) return XvMCEProcQMatrixSend(client); case xvmce_BufferStatus: return XvMCEProcBufferStatus(client); + case xvmce_BufferSliceInit: + return XvMCEProcBufferSliceInit(client); + case xvmce_BufferSliceSend: + return XvMCEProcBufferSliceSend(client); default: break; } |