diff options
Diffstat (limited to 'src/via_mpeg.c')
-rw-r--r-- | src/via_mpeg.c | 101 |
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); |