summaryrefslogtreecommitdiff
path: root/src/via_xvmc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/via_xvmc.c')
-rw-r--r--src/via_xvmc.c110
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;
}