summaryrefslogtreecommitdiff
path: root/src/via_mpeg.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/via_mpeg.c')
-rw-r--r--src/via_mpeg.c101
1 files changed, 97 insertions, 4 deletions
diff --git a/src/via_mpeg.c b/src/via_mpeg.c
index 653fa9e..4d49252 100644
--- a/src/via_mpeg.c
+++ b/src/via_mpeg.c
@@ -41,6 +41,90 @@
/*
*
*/
+int
+ViaSubPictureGrab(struct ViaSubPicture *SubPicture, XID ID,
+ CARD16 Width, CARD16 Height, CARD8 Type)
+{
+ int i;
+
+ ViaDebug(SubPicture->scrnIndex, "%s: Grabbing 0x%08X\n", __func__, ID);
+
+ /* We only track type and dimensions once. */
+ if ((SubPicture->Width == Width) && (SubPicture->Height == Height) &&
+ (SubPicture->Type == Type)) {
+ for (i = 0; i < VIA_SUBPICTURE_COUNT; i++)
+ if (!SubPicture->SubPictures[i].ID &&
+ !SubPicture->SubPictures[i].Mem)
+ break;
+
+ if (i == VIA_SUBPICTURE_COUNT) {
+ xf86DrvMsg(SubPicture->scrnIndex, X_ERROR, "%s: No more slots "
+ "available for 0x%08X\n", __func__, ID);
+ return BadAlloc;
+ }
+ } else {
+ for (i = 0; i < VIA_SUBPICTURE_COUNT; i++)
+ if (SubPicture->SubPictures[i].ID ||
+ SubPicture->SubPictures[i].Mem) {
+ xf86DrvMsg(SubPicture->scrnIndex, X_ERROR, "%s: Cannot change "
+ "layout. Subpictures still in use.\n", __func__);
+ return BadAccess;
+ }
+
+ SubPicture->Width = Width;
+ SubPicture->Height = Height;
+ SubPicture->Type = Type;
+
+ i = 0;
+ }
+
+ SubPicture->SubPictures[i].Mem =
+ ViaMemAlloc(xf86Screens[SubPicture->scrnIndex], Width * Height, 16);
+ if (!SubPicture->SubPictures[i].Mem) {
+ xf86DrvMsg(SubPicture->scrnIndex, X_ERROR, "%s: Memory allocation "
+ "failed for 0x%08X\n", __func__, ID);
+ return BadAlloc;
+ }
+
+ SubPicture->SubPictures[i].ID = ID;
+
+ return Success;
+}
+
+/*
+ *
+ */
+void
+ViaSubPictureRelease(struct ViaSubPicture *SubPicture, XID ID)
+{
+ int i;
+
+ ViaDebug(SubPicture->scrnIndex, "%s: Releasing 0x%08X\n", __func__, ID);
+
+ for (i = 0; i < VIA_SUBPICTURE_COUNT; i++)
+ if (SubPicture->SubPictures[i].ID == ID)
+ break;
+
+ if (i == VIA_SUBPICTURE_COUNT) {
+ xf86DrvMsg(SubPicture->scrnIndex, X_ERROR, "%s: Unknown ID: 0x%08X\n",
+ __func__, ID);
+ return;
+ }
+
+ SubPicture->SubPictures[i].ID = 0;
+
+ if (SubPicture->SubPictures[i].Mem) {
+ ViaMemFree(xf86Screens[SubPicture->scrnIndex],
+ SubPicture->SubPictures[i].Mem);
+ SubPicture->SubPictures[i].Mem = NULL;
+ }
+}
+
+#if 0
+
+/*
+ *
+ */
static int
ViaSubPicturePut(ScrnInfoPtr pScrn, CARD16 Width, CARD16 Height, CARD8 IA44,
CARD32 *Palette, CARD8 *Buffer)
@@ -80,6 +164,7 @@ ViaSubPicturePut(ScrnInfoPtr pScrn, CARD16 Width, CARD16 Height, CARD8 IA44,
return Success;
}
+#endif
/*
*
@@ -89,18 +174,26 @@ ViaSubPictureStop(ScrnInfoPtr pScrn)
{
struct ViaSwov *Swov = VIAPTR(pScrn)->Swov;
struct ViaSubPicture *SubPicture = Swov->SubPicture;
+ int i;
if (!SubPicture)
return;
SubPicture->Regs->Control = 0x00000000;
- if (SubPicture->Mem)
- ViaMemFree(pScrn, SubPicture->Mem);
+ for (i = 0; i < VIA_SUBPICTURE_COUNT; i++) {
+ SubPicture->SubPictures[i].ID = 0;
+
+ if (SubPicture->SubPictures[i].Mem) {
+ ViaMemFree(xf86Screens[SubPicture->scrnIndex],
+ SubPicture->SubPictures[i].Mem);
+ SubPicture->SubPictures[i].Mem = NULL;
+ }
+ }
- SubPicture->Mem = NULL;
SubPicture->Width = 0;
SubPicture->Height = 0;
+ SubPicture->Type = 0;
}
/*
@@ -521,7 +614,7 @@ ViaMpegSliceInit(struct ViaMpeg *Mpeg, XID BufferID, XID FRefID, XID BRefID,
CrOffset = Width * Height;
CbOffset = CrOffset + (Width >> 1) * (Height >> 1);
-#if 1
+#if 0
ViaDebug(Mpeg->scrnIndex, " Picture: 0x%08lX\n", Picture);
ViaDebug(Mpeg->scrnIndex, " LineOffset: 0x%08lX\n", Offset);
ViaDebug(Mpeg->scrnIndex, " SliceControl1: 0x%08lX\n", SliceControl1);