summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuc Verhaegen <libv@skynet.be>2009-08-09 02:51:22 +0200
committerLuc Verhaegen <libv@skynet.be>2009-11-04 15:13:02 +0100
commit589e5fe6988ce12b63a33deca26b0659d6944622 (patch)
tree816fb970a08650cfec704e579eab12d7bee142e6
parentb557de1498b6ebe84bc3c65bf51623e433ce1557 (diff)
XvMC: Hook up mpeg code to test buffer handling.
Clean up the interface, bail out of SliceInit and SlicePut before touching the hw. Buffer allocation and handling seems ok now. Next up, having Xv display empty Mpeg allocated buffers.
-rw-r--r--src/via_mpeg.c336
-rw-r--r--src/via_mpeg.h29
-rw-r--r--src/via_xvmc.c107
3 files changed, 247 insertions, 225 deletions
diff --git a/src/via_mpeg.c b/src/via_mpeg.c
index af9b663..0c435ed 100644
--- a/src/via_mpeg.c
+++ b/src/via_mpeg.c
@@ -153,58 +153,58 @@ ViaSubPictureDestroy(ScrnInfoPtr pScrn)
*
*/
static void
-ViaMpegPrintRegs(ScrnInfoPtr pScrn)
+ViaMpegPrintRegs(struct ViaMpeg *Mpeg)
{
- struct ViaMpegRegs *Regs = VIAPTR(pScrn)->Swov->Mpeg->Regs;
+ struct ViaMpegRegs *Regs = Mpeg->Regs;
#if 0
int i;
#endif
- ViaDebug(pScrn->scrnIndex, "%s: MPEG register Map.\n", __func__);
+ ViaDebug(Mpeg->scrnIndex, "%s: MPEG register Map.\n", __func__);
- ViaDebug(pScrn->scrnIndex, " Picture: 0x%08lX\n", Regs->Picture);
- ViaDebug(pScrn->scrnIndex, " Macroblock: 0x%08lX\n", Regs->Macroblock);
- ViaDebug(pScrn->scrnIndex, " Null: 0x%08lX\n", Regs->Null);
- ViaDebug(pScrn->scrnIndex, " Control: 0x%08lX\n", Regs->Control);
+ ViaDebug(Mpeg->scrnIndex, " Picture: 0x%08lX\n", Regs->Picture);
+ ViaDebug(Mpeg->scrnIndex, " Macroblock: 0x%08lX\n", Regs->Macroblock);
+ ViaDebug(Mpeg->scrnIndex, " Null: 0x%08lX\n", Regs->Null);
+ ViaDebug(Mpeg->scrnIndex, " Control: 0x%08lX\n", Regs->Control);
/* Write-Only. */
#if 0
for (i = 0; i < 4; i++)
- ViaDebug(pScrn->scrnIndex, " MV%1d: 0x%08lX\n", i, Regs->MV[i]);
+ ViaDebug(Mpeg->scrnIndex, " MV%1d: 0x%08lX\n", i, Regs->MV[i]);
for (i = 0; i < 4; i++) {
- ViaDebug(pScrn->scrnIndex, " Buffer[%1d]->Y: 0x%08lX\n", i, Regs->Buffer[i].Y);
- ViaDebug(pScrn->scrnIndex, " Buffer[%1d]->Cb: 0x%08lX\n", i, Regs->Buffer[i].Cb);
- ViaDebug(pScrn->scrnIndex, " Buffer[%1d]->Cr: 0x%08lX\n", i, Regs->Buffer[i].Cr);
+ ViaDebug(Mpeg->scrnIndex, " Buffer[%1d]->Y: 0x%08lX\n", i, Regs->Buffer[i].Y);
+ ViaDebug(Mpeg->scrnIndex, " Buffer[%1d]->Cb: 0x%08lX\n", i, Regs->Buffer[i].Cb);
+ ViaDebug(Mpeg->scrnIndex, " Buffer[%1d]->Cr: 0x%08lX\n", i, Regs->Buffer[i].Cr);
}
#endif
- ViaDebug(pScrn->scrnIndex, " LineOffset: 0x%08lX\n", Regs->LineOffset);
- ViaDebug(pScrn->scrnIndex, " Status: 0x%08lX\n", Regs->Status);
- ViaDebug(pScrn->scrnIndex, " IDCTBlock: 0x%08lX\n", Regs->IDCTBlock);
+ ViaDebug(Mpeg->scrnIndex, " LineOffset: 0x%08lX\n", Regs->LineOffset);
+ ViaDebug(Mpeg->scrnIndex, " Status: 0x%08lX\n", Regs->Status);
+ ViaDebug(Mpeg->scrnIndex, " IDCTBlock: 0x%08lX\n", Regs->IDCTBlock);
#if 0
- ViaDebug(pScrn->scrnIndex, " QMatrixSelect: 0x%08lX\n", Regs->QMatrixSelect);
- ViaDebug(pScrn->scrnIndex, " QMatrixContent: 0x%08lX\n", Regs->QMatrixContent);
+ ViaDebug(Mpeg->scrnIndex, " QMatrixSelect: 0x%08lX\n", Regs->QMatrixSelect);
+ ViaDebug(Mpeg->scrnIndex, " QMatrixContent: 0x%08lX\n", Regs->QMatrixContent);
#endif
- ViaDebug(pScrn->scrnIndex, " SliceStreamOut: 0x%08lX\n", Regs->SliceStreamOut);
+ ViaDebug(Mpeg->scrnIndex, " SliceStreamOut: 0x%08lX\n", Regs->SliceStreamOut);
/* Reserved */
#if 0
for (i = 0; i < 4; i++)
- ViaDebug(pScrn->scrnIndex, " IDCTData%1d: 0x%08lX\n", i, Regs->IDCTData[i]);
+ ViaDebug(Mpeg->scrnIndex, " IDCTData%1d: 0x%08lX\n", i, Regs->IDCTData[i]);
#endif
- ViaDebug(pScrn->scrnIndex, " SliceControl1: 0x%08lX\n", Regs->SliceControl1);
- ViaDebug(pScrn->scrnIndex, " SliceControl2: 0x%08lX\n", Regs->SliceControl2);
- ViaDebug(pScrn->scrnIndex, " SliceControl3: 0x%08lX\n", Regs->SliceControl3);
- ViaDebug(pScrn->scrnIndex, " SliceControl4: 0x%08lX\n", Regs->SliceControl4);
+ ViaDebug(Mpeg->scrnIndex, " SliceControl1: 0x%08lX\n", Regs->SliceControl1);
+ ViaDebug(Mpeg->scrnIndex, " SliceControl2: 0x%08lX\n", Regs->SliceControl2);
+ ViaDebug(Mpeg->scrnIndex, " SliceControl3: 0x%08lX\n", Regs->SliceControl3);
+ ViaDebug(Mpeg->scrnIndex, " SliceControl4: 0x%08lX\n", Regs->SliceControl4);
#if 0
for (i = 0; i < 4; i++)
- ViaDebug(pScrn->scrnIndex, " SliceStream[%1d]: 0x%08lX\n", i, Regs->SliceStream[i]);
+ ViaDebug(Mpeg->scrnIndex, " SliceStream[%1d]: 0x%08lX\n", i, Regs->SliceStream[i]);
#endif
- ViaDebug(pScrn->scrnIndex, "%s: Done.\n", __func__);
+ ViaDebug(Mpeg->scrnIndex, "%s: Done.\n", __func__);
}
#endif
@@ -212,15 +212,14 @@ ViaMpegPrintRegs(ScrnInfoPtr pScrn)
*
*/
static void
-ViaMpegReset(ScrnInfoPtr pScrn)
+ViaMpegReset(struct ViaMpeg *Mpeg)
{
- struct ViaMpeg *Mpeg = VIAPTR(pScrn)->Swov->Mpeg;
int i, j;
for (i = 0; i < 14; i++)
Mpeg->Regs->Null = 0;
- Mpeg->Regs->SliceControl3 = 0x0400000; /* reset slice engine */
+ Mpeg->Regs->SliceControl3 = 0x00400000; /* reset slice engine */
for (i = 0; i < 6; i++) {
Mpeg->Regs->Control = 0x00000063;
@@ -256,99 +255,124 @@ ViaMpegEngineIdle(struct ViaMpeg *Mpeg)
/*
*
*/
-static CARD8
-ViaMpegGrabBuffer(ScrnInfoPtr pScrn, CARD32 Format, CARD16 Width, CARD16 Height)
+Bool
+ViaMpegEngineInit(struct ViaMpeg *Mpeg, CARD16 Width, CARD16 Height)
{
- struct ViaMpeg *Mpeg = VIAPTR(pScrn)->Swov->Mpeg;
- CARD16 MBWidth, MBHeight;
- CARD8 i;
-
- VIAFUNC(pScrn);
+ VIAFUNC(Mpeg);
/* Since MPEG macroblocks are 16x16 anyway, the chroma planes are always
addressable by the unichrome. */
if ((Width & 0x0F) || (Height & 0x0F)) {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "%s: %dx%d is not a multiple of 16x16.\n",
+ xf86DrvMsg(Mpeg->scrnIndex, X_WARNING, "%s: %dx%d is not a multiple of 16x16.\n",
__func__, Width, Height);
- return 0xFF;
+ return FALSE;
}
- MBWidth = Width >> 4;
- MBHeight = Height >> 4;
- Width = (Width + 0x1F) & ~0x1F;
+ Mpeg->MBWidth = Width >> 4;
+ Mpeg->MBHeight = Height >> 4;
+ Mpeg->Width = (Width + 0x1F) & ~0x1F;
+ Mpeg->Height = Height;
+
+ ViaDebug(Mpeg->scrnIndex, "%s: %dx%d (MB %dx%d)\n", __func__,
+ Mpeg->Width, Mpeg->Height, Mpeg->MBWidth, Mpeg->MBHeight);
- for (i = 0; i < VIAMPEG_BUFFERS_MAX; i++) {
- if (!Mpeg->Buffers[i].Mem) {
- Mpeg->Buffers[i].Mem = ViaMemAlloc(pScrn, (Width * Height * 3) / 2, 16);
- if (!Mpeg->Buffers[i].Mem) {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "%s: Failed to allocate %dx%d buffer.\n",
- __func__, Width, Height);
- return 0xFF;
- }
+ return TRUE;
+}
- Mpeg->Buffers[i].Width = Width;
- Mpeg->Buffers[i].Height = Height;
- Mpeg->Buffers[i].MBWidth = MBWidth;
- Mpeg->Buffers[i].MBHeight = MBHeight;
+/*
+ *
+ */
+Bool
+ViaMpegBufferGrab(struct ViaMpeg *Mpeg, XID BufferID)
+{
+ int i, size;
- /* maybe memset to clear old memory contents? */
- ViaDebug(pScrn->scrnIndex, "%s: Grabbed %dx%d Buffer %X\n", __func__, Width, Height, i);
+ VIAFUNC(Mpeg);
- return i;
- }
+ for (i = 0; i < VIAMPEG_BUFFERS_MAX; i++)
+ if (!Mpeg->Buffers[i].ID && !Mpeg->Buffers[i].Mem)
+ break;
+
+ if (i == VIAMPEG_BUFFERS_MAX) {
+ xf86DrvMsg(Mpeg->scrnIndex, X_WARNING, "%s: No slots available.\n", __func__);
+ return FALSE;
+ }
+
+ size = (Mpeg->Width * Mpeg->Height * 3) / 2;
+
+ Mpeg->Buffers[i].Mem = ViaMemAlloc(xf86Screens[Mpeg->scrnIndex], size, 16);
+ if (!Mpeg->Buffers[i].Mem) {
+ xf86DrvMsg(Mpeg->scrnIndex, X_WARNING, "%s: Failed to allocate %dx%d buffer.\n",
+ __func__, Mpeg->Width, Mpeg->Height);
+ return FALSE;
}
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "%s: No more free buffers available.\n",
- __func__);
- return 0xFF;
+ Mpeg->Buffers[i].ID = BufferID;
+
+ /* maybe memset to clear old memory contents? */
+ ViaDebug(Mpeg->scrnIndex, "%s: 0x%08X: Grabbed Buffer %d (%dbytes)\n",
+ __func__, BufferID, i, size);
+
+ return TRUE;
}
/*
*
*/
-static void
-ViaMpegReleaseBuffer(ScrnInfoPtr pScrn, CARD8 ID)
+void
+ViaMpegBufferRelease(struct ViaMpeg *Mpeg, XID BufferID)
{
- struct ViaMpeg *Mpeg = VIAPTR(pScrn)->Swov->Mpeg;
+ int i;
- VIAFUNC(pScrn);
+ VIAFUNC(Mpeg);
- if (ID == Mpeg->Current)
+ /* If the buffer is still used by the decoder, first
+ wait until the decoder is done. */
+ if ((BufferID == Mpeg->CurrentID) ||
+ (BufferID == Mpeg->FRefID) ||
+ (BufferID == Mpeg->BRefID)) {
ViaMpegEngineIdle(Mpeg);
+ Mpeg->CurrentID = 0;
+ Mpeg->FRefID = 0;
+ Mpeg->BRefID = 0;
+ }
/* don't overwrite a picture while it's still flipping */
- if (ID == Mpeg->Flipping) {
- ViaHQVIdle(VIAPTR(pScrn)->Swov);
- Mpeg->Flipping = 0xFF;
+ if (BufferID == Mpeg->FlippingID) {
+ ViaHQVIdle(VIAPTR(xf86Screens[Mpeg->scrnIndex])->Swov);
+ Mpeg->FlippingID = 0;
}
- if ((ID < VIAMPEG_BUFFERS_MAX) && (Mpeg->Buffers[ID].Mem)) {
- ViaDebug(pScrn->scrnIndex, "%s: Releasing %dx%d Buffer %X\n", __func__,
- Mpeg->Buffers[ID].Width, Mpeg->Buffers[ID].Height, ID);
- ViaMemFree(pScrn, Mpeg->Buffers[ID].Mem);
- Mpeg->Buffers[ID].Mem = NULL;
- Mpeg->Buffers[ID].Width = 0;
- Mpeg->Buffers[ID].Height = 0;
- Mpeg->Buffers[ID].MBWidth = 0;
- Mpeg->Buffers[ID].MBHeight = 0;
- return;
+ for (i = 0; i < VIAMPEG_BUFFERS_MAX; i++)
+ if (Mpeg->Buffers[i].ID == BufferID)
+ break;
+
+ if (i == VIAMPEG_BUFFERS_MAX) {
+ xf86DrvMsg(Mpeg->scrnIndex, X_WARNING,
+ "%s: Buffer 0x%08X doesn't exist.\n",
+ __func__, (unsigned int) BufferID);
+ return;
}
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "%s: Buffer %d doesn't exist.\n",
- __func__, ID);
+ ViaDebug(Mpeg->scrnIndex, "%s: Releasing Buffer 0x%08X\n", __func__,
+ (unsigned int) BufferID);
+
+ Mpeg->Buffers[i].ID = 0;
+ if (Mpeg->Buffers[i].Mem)
+ ViaMemFree(xf86Screens[Mpeg->scrnIndex], Mpeg->Buffers[i].Mem);
+ Mpeg->Buffers[i].Mem = NULL;
}
/*
*
*/
-static int
-ViaMpegQMatrix(ScrnInfoPtr pScrn, CARD32 Type, CARD8 Matrix[64])
+void
+ViaMpegQMatrix(struct ViaMpeg *Mpeg, CARD32 Type, CARD8 Matrix[64])
{
- struct ViaMpeg *Mpeg = VIAPTR(pScrn)->Swov->Mpeg;
CARD32 *Temp = (CARD32 *) Matrix;
int i;
- /* VIAFUNC(pScrn); */
+ /* VIAFUNC(Mpeg); */
ViaMpegEngineIdle(Mpeg);
@@ -356,74 +380,91 @@ ViaMpegQMatrix(ScrnInfoPtr pScrn, CARD32 Type, CARD8 Matrix[64])
for (i = 0; i < 16; i++)
Mpeg->Regs->QMatrixContent = Temp[i];
-
- return Success;
}
/*
*
*/
-static int
-ViaMpegInitSlice(ScrnInfoPtr pScrn, CARD8 ID, CARD8 FRef, CARD8 BRef,
+int
+ViaMpegSliceInit(struct ViaMpeg *Mpeg, XID BufferID, XID FRefID, XID BRefID,
CARD8 F_MV_Range, CARD8 B_MV_Range, CARD8 PictureStructure,
CARD8 PictureCoding, CARD8 IntraDCPrecision, CARD8 Flags)
{
- struct ViaMpeg *Mpeg = VIAPTR(pScrn)->Swov->Mpeg;
CARD32 Base, CbOffset, CrOffset, Offset = 0;
CARD32 Picture = 0, SliceControl1 = 0, SliceControl2 = 0, SliceControl3 = 0;
CARD16 Width, Height, MBWidth, MBHeight;
+ int i, FRef, BRef;
- /* VIAFUNC(pScrn); */
+ /* VIAFUNC(Mpeg); */
/* TODO: we need to adjust Width and Height when using an interlaced stream */
- ViaDebug(pScrn->scrnIndex, "%s: 0x%02X: FRef 0x%02X; BRef 0x%02X\n",
- __func__, ID, FRef, BRef);
+ ViaDebug(Mpeg->scrnIndex, "%s: 0x%08X: FRef 0x%02X; BRef 0x%02X\n",
+ __func__, BufferID, FRefID, BRefID);
/* Check ID */
- if ((ID >= VIAMPEG_BUFFERS_MAX) || !Mpeg->Buffers[ID].Mem) {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "%s: Wrong Buffer ID (%02X).\n",
- __func__, ID);
+ for (i = 0; i < VIAMPEG_BUFFERS_MAX; i++)
+ if (Mpeg->Buffers[i].ID == BufferID)
+ break;
+
+ if (i == VIAMPEG_BUFFERS_MAX) {
+ xf86DrvMsg(Mpeg->scrnIndex, X_WARNING,
+ "%s: Wrong Buffer ID (0x%08X).\n",
+ __func__, (unsigned int) BufferID);
return BadAccess;
}
- Mpeg->Current = ID;
- Width = Mpeg->Buffers[ID].Width;
- Height = Mpeg->Buffers[ID].Height;
- MBWidth = Mpeg->Buffers[ID].MBWidth;
- MBHeight = Mpeg->Buffers[ID].MBHeight;
+ Mpeg->CurrentID = BufferID;
+ Width = Mpeg->Width;
+ Height = Mpeg->Height;
+ MBWidth = Mpeg->MBWidth;
+ MBHeight = Mpeg->MBHeight;
switch (PictureCoding & 0x03) {
case 0x01:
- ViaDebug(pScrn->scrnIndex, "%s: 0x%02X: %dx%d Intra picture\n",
- __func__, ID, Width, Height);
+ ViaDebug(Mpeg->scrnIndex, "%s: 0x%08X: %dx%d Intra picture\n",
+ __func__, (unsigned int) BufferID, Width, Height);
break;
case 0x02:
- ViaDebug(pScrn->scrnIndex, "%s: 0x%02X: %dx%d P picture\n",
- __func__, ID, Width, Height);
+ ViaDebug(Mpeg->scrnIndex, "%s: 0x%08X: %dx%d P picture\n",
+ __func__, (unsigned int) BufferID, Width, Height);
break;
case 0x03:
- ViaDebug(pScrn->scrnIndex, "%s: 0x%02X: %dx%d B picture\n",
- __func__, ID, Width, Height);
+ ViaDebug(Mpeg->scrnIndex, "%s: 0x%08X: %dx%d B picture\n",
+ __func__, (unsigned int) BufferID, Width, Height);
break;
}
/* Check Forward reference */
- if ((FRef >= VIAMPEG_BUFFERS_MAX) || !Mpeg->Buffers[FRef].Mem ||
- (Mpeg->Buffers[FRef].Width != Width) || (Mpeg->Buffers[FRef].Height != Height)) {
- if (FRef != 0xFF)
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "%s: Wrong forward reference buffer (%02X).\n",
- __func__, FRef);
- FRef = ID; /* this never hurts - at most messes up the video */
- }
+ for (FRef = 0; FRef < VIAMPEG_BUFFERS_MAX; FRef++)
+ if (Mpeg->Buffers[FRef].ID == FRefID)
+ break;
+
+ if ((FRef == VIAMPEG_BUFFERS_MAX) || !Mpeg->Buffers[FRef].Mem) {
+ xf86DrvMsg(Mpeg->scrnIndex, X_WARNING,
+ "%s: Wrong forward reference buffer (0x%08X).\n",
+ __func__, (unsigned int) FRefID);
+ FRef = i; /* this never hurts - at most messes up the video */
+ Mpeg->FRefID = 0;
+ } else
+ Mpeg->FRefID = FRefID;
/* Check backward reference */
- if ((BRef >= VIAMPEG_BUFFERS_MAX) || !Mpeg->Buffers[BRef].Mem ||
- (Mpeg->Buffers[BRef].Width != Width) || (Mpeg->Buffers[BRef].Height != Height)) {
- if (BRef != 0xFF)
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "%s: Wrong backward reference buffer (%02X).\n",
- __func__, BRef);
- BRef = ID;
- }
+ for (BRef = 0; BRef < VIAMPEG_BUFFERS_MAX; BRef++)
+ if (Mpeg->Buffers[BRef].ID == BRefID)
+ break;
+
+ if ((BRef == VIAMPEG_BUFFERS_MAX) || !Mpeg->Buffers[BRef].Mem) {
+ xf86DrvMsg(Mpeg->scrnIndex, X_WARNING,
+ "%s: Wrong backward reference buffer (0x%08X).\n",
+ __func__, (unsigned int) BRefID);
+ BRef = i; /* this never hurts - at most messes up the video */
+ Mpeg->BRefID = 0;
+ } else
+ Mpeg->BRefID = 0;
+
+
+ // Testing.
+ return Success;
/* Buffers are ready, now prepare for setting up the engine */
@@ -481,11 +522,11 @@ ViaMpegInitSlice(ScrnInfoPtr pScrn, CARD8 ID, CARD8 FRef, CARD8 BRef,
CbOffset = CrOffset + (Width >> 1) * (Height >> 1);
#if 0
- ViaDebug(pScrn->scrnIndex, " Picture: 0x%08lX\n", Picture);
- ViaDebug(pScrn->scrnIndex, " LineOffset: 0x%08lX\n", Offset);
- ViaDebug(pScrn->scrnIndex, " SliceControl1: 0x%08lX\n", SliceControl1);
- ViaDebug(pScrn->scrnIndex, " SliceControl2: 0x%08lX\n", SliceControl2);
- ViaDebug(pScrn->scrnIndex, " SliceControl3: 0x%08lX\n", SliceControl3);
+ ViaDebug(Mpeg->scrnIndex, " Picture: 0x%08lX\n", Picture);
+ ViaDebug(Mpeg->scrnIndex, " LineOffset: 0x%08lX\n", Offset);
+ ViaDebug(Mpeg->scrnIndex, " SliceControl1: 0x%08lX\n", SliceControl1);
+ ViaDebug(Mpeg->scrnIndex, " SliceControl2: 0x%08lX\n", SliceControl2);
+ ViaDebug(Mpeg->scrnIndex, " SliceControl3: 0x%08lX\n", SliceControl3);
#endif
/* Set up the actual engine. */
@@ -496,7 +537,7 @@ ViaMpegInitSlice(ScrnInfoPtr pScrn, CARD8 ID, CARD8 FRef, CARD8 BRef,
Mpeg->Regs->LineOffset = Offset;
/* Destination buffer */
- Base = Mpeg->Buffers[ID].Mem->Base;
+ Base = Mpeg->Buffers[i].Mem->Base;
Mpeg->Regs->Buffer[0].Y = Base >> 3;
Mpeg->Regs->Buffer[0].Cr = (Base + CrOffset) >> 3;
Mpeg->Regs->Buffer[0].Cb = (Base + CbOffset) >> 3;
@@ -524,23 +565,22 @@ ViaMpegInitSlice(ScrnInfoPtr pScrn, CARD8 ID, CARD8 FRef, CARD8 BRef,
/*
*
*/
-static int
-ViaMpegPutSlice(ScrnInfoPtr pScrn, CARD8 ID, CARD8 SliceCode,
+int
+ViaMpegSlicePut(struct ViaMpeg *Mpeg, XID BufferID, CARD8 SliceCode,
CARD32 SliceLength, CARD8 *Slice)
{
- struct ViaMpeg *Mpeg = VIAPTR(pScrn)->Swov->Mpeg;
CARD32 *SlicePtr, Mask;
CARD32 i;
- /* VIAFUNC(pScrn); */
+ /* VIAFUNC(Mpeg); */
- /* ViaDebug(pScrn->scrnIndex, "%s: 0x%08lX: 0x%08lX: %ld bytes\n",
- __func__, ID, SliceCode, SliceLength); */
+ ViaDebug(Mpeg->scrnIndex, "%s: 0x%08lX: 0x%08lX: %ld bytes\n",
+ __func__, BufferID, SliceCode, SliceLength);
- if (ID != Mpeg->Current) {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
- "%s: failed, 0x%02X is not the current Buffer\n", __func__,
- ID);
+ if (BufferID != Mpeg->CurrentID) {
+ xf86DrvMsg(Mpeg->scrnIndex, X_WARNING,
+ "%s: failed, 0x%08X is not the current Buffer\n",
+ __func__, (unsigned int) BufferID);
return BadAccess;
}
@@ -555,11 +595,14 @@ ViaMpegPutSlice(ScrnInfoPtr pScrn, CARD8 ID, CARD8 SliceCode,
ViaMpegEngineIdle(Mpeg);
/* don't overwrite a picture while it's still flipping */
- if (ID == Mpeg->Flipping) {
- ViaHQVIdle(VIAPTR(pScrn)->Swov);
- Mpeg->Flipping = 0xFF;
+ if (BufferID == Mpeg->FlippingID) {
+ ViaHQVIdle(VIAPTR(xf86Screens[Mpeg->scrnIndex])->Swov);
+ Mpeg->FlippingID = 0;
}
+ // Testing!!!
+ return Success;
+
Mpeg->Regs->SliceControl4 = i;
if (SliceCode)
@@ -579,7 +622,7 @@ ViaMpegPutSlice(ScrnInfoPtr pScrn, CARD8 ID, CARD8 SliceCode,
Mpeg->Regs->SliceStream[0] = 0;
Mpeg->Regs->SliceStream[0] = 0;
- /* ViaDebug(pScrn->scrnIndex, "%s: Slice ReadBack: 0x%08lX\n", __func__,
+ /* ViaDebug(Mpeg->scrnIndex, "%s: Slice ReadBack: 0x%08lX\n", __func__,
Mpeg->Regs->SliceStreamOut); */
return Success;
@@ -602,7 +645,7 @@ ViaMpegInit(ScrnInfoPtr pScrn)
Mpeg->Regs = (struct ViaMpegRegs *) (pVia->MapBase + 0xC00);
pVia->Swov->Mpeg = Mpeg;
- ViaMpegReset(pScrn);
+ ViaMpegReset(Mpeg);
}
/*
@@ -614,21 +657,22 @@ ViaMpegStop(ScrnInfoPtr pScrn)
struct ViaMpeg *Mpeg = VIAPTR(pScrn)->Swov->Mpeg;
int i;
+ VIAFUNC(pScrn);
+
ViaMpegEngineIdle(Mpeg);
- ViaMpegReset(pScrn);
+ ViaMpegReset(Mpeg);
for (i = 0; i < VIAMPEG_BUFFERS_MAX; i++)
if (Mpeg->Buffers[i].Mem) {
+ Mpeg->Buffers[i].ID = 0;
ViaMemFree(pScrn, Mpeg->Buffers[i].Mem);
Mpeg->Buffers[i].Mem = NULL;
- Mpeg->Buffers[i].Width = 0;
- Mpeg->Buffers[i].Height = 0;
- Mpeg->Buffers[i].MBWidth = 0;
- Mpeg->Buffers[i].MBHeight = 0;
}
- Mpeg->Current = 0xFF;
- Mpeg->Flipping = 0xFF;
+ Mpeg->CurrentID = 0;
+ Mpeg->FlippingID = 0;
+ Mpeg->FRefID = 0;
+ Mpeg->BRefID = 0;
}
/*
diff --git a/src/via_mpeg.h b/src/via_mpeg.h
index 7ea1843..f5e5996 100644
--- a/src/via_mpeg.h
+++ b/src/via_mpeg.h
@@ -37,16 +37,19 @@
struct ViaMpeg {
int scrnIndex;
- CARD8 Current;
- CARD8 Flipping;
-
- struct {
- CARD16 Width;
- CARD16 Height;
+ XID ContextID; /* The XvMC way. */
+ CARD16 Width;
+ CARD16 Height;
+ CARD16 MBWidth;
+ CARD16 MBHeight;
- CARD16 MBWidth;
- CARD16 MBHeight;
+ XID CurrentID;
+ XID FlippingID;
+ XID FRefID;
+ XID BRefID;
+ struct {
+ XID ID;
struct ViaMem *Mem;
} Buffers[VIAMPEG_BUFFERS_MAX];
@@ -86,4 +89,14 @@ void ViaMpegInit(ScrnInfoPtr pScrn);
void ViaMpegStop(ScrnInfoPtr pScrn);
void ViaMpegDestroy(ScrnInfoPtr pScrn);
+/* prototypes for the X extension. */
+Bool ViaMpegEngineInit(struct ViaMpeg *Mpeg, CARD16 Width, CARD16 Height);
+Bool ViaMpegBufferGrab(struct ViaMpeg *Mpeg, XID BufferID);
+void ViaMpegBufferRelease(struct ViaMpeg *Mpeg, XID BufferID);
+int ViaMpegSliceInit(struct ViaMpeg *Mpeg, XID BufferID, XID FRefID, XID BRefID,
+ CARD8 F_MV_Range, CARD8 B_MV_Range, CARD8 PictureStructure,
+ CARD8 PictureCoding, CARD8 IntraDCPrecision, CARD8 Flags);
+int ViaMpegSlicePut(struct ViaMpeg *Mpeg, XID BufferID, CARD8 SliceCode,
+ CARD32 SliceLength, CARD8 *Slice);
+
#endif /* HAVE_VIA_MPEG_H */
diff --git a/src/via_xvmc.c b/src/via_xvmc.c
index 83ac935..741bbe4 100644
--- a/src/via_xvmc.c
+++ b/src/via_xvmc.c
@@ -33,15 +33,14 @@
#include "via_driver.h"
#include "via_video.h"
+#include "via_mpeg.h"
+#if 0
/* Just some placeholders to be able to flesh out the library */
-static XID ViaMCContextID = 0;
-static int ViaMCContextWidth = 0;
-static int ViaMCContextHeight = 0;
-
#define VIAMC_BUFFER_COUNT 8
static XID ViaMCBufferIDs[VIAMC_BUFFER_COUNT] = { 0, 0, 0, 0, 0, 0, 0, 0};
static int ViaMCBufferStatus[VIAMC_BUFFER_COUNT] = { 0, 0, 0, 0, 0, 0, 0, 0};
+#endif
/*
*
@@ -140,7 +139,6 @@ XvMCEProcBufferStatus(ClientPtr client)
struct XvMCEPrivates *Private;
ScrnInfoPtr pScrn;
XvPortPtr Port;
- int i;
xvmceBufferStatusReply reply;
REQUEST(xvmceBufferStatusReq);
@@ -163,20 +161,11 @@ XvMCEProcBufferStatus(ClientPtr client)
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;
- }
-
reply.type = X_Reply;
reply.sequenceNumber = client->sequence;
reply.length = (sizeof(xvmceBufferStatusReply) - sizeof(xGenericReply)) >> 2;
- reply.StatusFlags = ViaMCBufferStatus[i];
+ // FIXME !!!
+ reply.StatusFlags = 0;
WriteToClient(client, sizeof(xvmceBufferStatusReply), (char *)&reply);
@@ -193,7 +182,7 @@ XvMCEProcBufferSliceInit(ClientPtr client)
struct XvMCEPrivates *Private;
ScrnInfoPtr pScrn;
XvPortPtr Port;
- int i;
+ int status;
REQUEST(xvmceBufferSliceInitReq);
REQUEST_SIZE_MATCH(xvmceBufferSliceInitReq);
@@ -215,16 +204,6 @@ XvMCEProcBufferSliceInit(ClientPtr client)
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);
@@ -235,7 +214,17 @@ XvMCEProcBufferSliceInit(ClientPtr client)
stuff->MVRange_BackwardsHorizontal, stuff->MVRange_BackwardsVertical,
stuff->MVRange_ForwardsHorizontal, stuff->MVRange_ForwardsVertical);
- /* !!!! Setup hw here. !!!! */
+ status = ViaMpegSliceInit(VIAPTR(pScrn)->Swov->Mpeg, stuff->Buffer,
+ stuff->ForwardsReferenceBuffer,
+ stuff->BackwardsReferenceBuffer,
+ 0, // F_MV_Range
+ 0, // B_MV_Range
+ 0, // PictureStructure
+ 0, // PictureCoding
+ 0, // IntraDCPrecision
+ 0); // Flags
+ if (status != Success)
+ return status;
return (client->noClientException);
}
@@ -249,7 +238,6 @@ XvMCEProcBufferSliceSend(ClientPtr client)
struct XvMCEPrivates *Private;
ScrnInfoPtr pScrn;
XvPortPtr Port;
- int i;
REQUEST(xvmceBufferSliceSendReq);
REQUEST_AT_LEAST_SIZE(xvmceBufferSliceSendReq);
@@ -271,20 +259,11 @@ XvMCEProcBufferSliceSend(ClientPtr client)
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. !!!! */
+ ViaMpegSlicePut(VIAPTR(pScrn)->Swov->Mpeg, stuff->Buffer, 0, // FIXME.
+ stuff->SliceLength, (CARD8 *) &stuff[1]);
return (client->noClientException);
}
@@ -396,16 +375,19 @@ static int
ViaMCCreateContext(ScrnInfoPtr pScrn, XvMCContextPtr context,
int *num_priv, CARD32 **priv)
{
+ struct ViaMpeg *Mpeg = VIAPTR(pScrn)->Swov->Mpeg;
+
ViaDebug(pScrn->scrnIndex, "%s: adapter %d, surfaceid %08X (%dx%d); %08X\n",
__func__, context->adapt_num, context->surface_type_id,
context->width, context->height, context->flags);
- if (ViaMCContextID)
+ if (Mpeg->ContextID)
return BadAccess;
- ViaMCContextID = context->context_id;
- ViaMCContextWidth = context->height;
- ViaMCContextHeight = context->flags;
+ if (!ViaMpegEngineInit(Mpeg, context->width, context->height))
+ return BadValue;
+
+ Mpeg->ContextID = context->context_id;
return Success;
}
@@ -416,14 +398,14 @@ ViaMCCreateContext(ScrnInfoPtr pScrn, XvMCContextPtr context,
static void
ViaMCDestroyContext(ScrnInfoPtr pScrn, XvMCContextPtr context)
{
+ struct ViaMpeg *Mpeg = VIAPTR(pScrn)->Swov->Mpeg;
+
VIAFUNC(pScrn);
- if (ViaMCContextID != context->context_id)
+ if (Mpeg->ContextID != context->context_id)
return;
- ViaMCContextID = 0;
- ViaMCContextWidth = 0;
- ViaMCContextHeight = 0;
+ Mpeg->ContextID = 0;
}
/*
@@ -433,24 +415,16 @@ static int
ViaMCBufferCreate(ScrnInfoPtr pScrn, XvMCSurfacePtr Buffer,
int *num_priv, CARD32 **priv)
{
- int i;
+ struct ViaMpeg *Mpeg = VIAPTR(pScrn)->Swov->Mpeg;
VIAFUNC(pScrn);
- if (ViaMCContextID != Buffer->context->context_id)
+ if (Mpeg->ContextID != Buffer->context->context_id)
return BadAccess;
- for (i = 0; i < VIAMC_BUFFER_COUNT; i++)
- if (!ViaMCBufferIDs[i])
- break;
-
- if (i == VIAMC_BUFFER_COUNT)
+ if (!ViaMpegBufferGrab(Mpeg, Buffer->surface_id))
return BadAlloc;
- ViaDebug(pScrn->scrnIndex, "%s: claimed %d (%08X)\n",
- __func__, i, Buffer->surface_id);
- ViaMCBufferIDs[i] = Buffer->surface_id;
-
return Success;
}
@@ -460,23 +434,14 @@ ViaMCBufferCreate(ScrnInfoPtr pScrn, XvMCSurfacePtr Buffer,
static void
ViaMCBufferDestroy(ScrnInfoPtr pScrn, XvMCSurfacePtr Buffer)
{
- int i;
+ struct ViaMpeg *Mpeg = VIAPTR(pScrn)->Swov->Mpeg;
VIAFUNC(pScrn);
- if (ViaMCContextID != Buffer->context->context_id)
- return;
-
- for (i = 0; i < VIAMC_BUFFER_COUNT; i++)
- if (ViaMCBufferIDs[i] == Buffer->surface_id)
- break;
-
- if (i == VIAMC_BUFFER_COUNT)
+ if (Mpeg->ContextID != Buffer->context->context_id)
return;
- ViaDebug(pScrn->scrnIndex, "%s: released %d (%08X)\n",
- __func__, i, Buffer->surface_id);
- ViaMCBufferIDs[i] = 0;
+ ViaMpegBufferRelease(Mpeg, Buffer->surface_id);
}
/*