diff options
author | Luc Verhaegen <libv@skynet.be> | 2005-10-14 09:17:29 +0000 |
---|---|---|
committer | Luc Verhaegen <libv@skynet.be> | 2005-10-14 09:17:29 +0000 |
commit | b33b3757e38d28f05f72b56cea86ea8afc7cc410 (patch) | |
tree | d2b85747a0abcc06246587e154f205c3e8d4ea77 | |
parent | 250ff89aebc1750b3d547b0930a6c2323b5fe669 (diff) |
[devel-swov_idles]
- FourCC is passed down from the DIX as an int, not a CARD32.
- Reintroduce HQVDoubleInit, so that the brief green flash of YUV 0x0000
can be avoided on CLE266Ax.
- Wait for HQV to go idle before disabling the HQV. This hopefully fixes
CLE266Cx (ported from Barry Scotts code - still needs testing)
-rw-r--r-- | src/via_video.c | 93 | ||||
-rw-r--r-- | src/via_video.h | 3 |
2 files changed, 76 insertions, 20 deletions
diff --git a/src/via_video.c b/src/via_video.c index 7498fdf..4285bf3 100644 --- a/src/via_video.c +++ b/src/via_video.c @@ -1064,7 +1064,7 @@ ViaSwovStride(struct ViaSwov *Swov, struct ViaXvPort *Port) * */ static Bool -ViaSwovSurfaceCreate(ScrnInfoPtr pScrn, CARD32 FourCC, CARD16 Width, CARD16 Height) +ViaSwovSurfaceCreate(ScrnInfoPtr pScrn, int FourCC, CARD16 Width, CARD16 Height) { VIAPtr pVia = VIAPTR(pScrn); struct ViaSwov *Swov = pVia->Swov; @@ -1352,7 +1352,6 @@ ViaHQVSwovIdle(struct ViaSwov *Swov) xf86DrvMsg(Swov->scrnIndex, X_WARNING, "%s: Video3 still firing.\n", __FUNCTION__); } - } /* @@ -1720,6 +1719,28 @@ ViaSwovCopy(VIAPtr pVia, struct ViaMem *Mem, unsigned char *buf) * */ static void +ViaHQVFlipInitWait(struct ViaSwov *Swov) +{ + int i; + + for (i = 0; i < 15; i++) + if ((Swov->HQV->Control & HQV_FLIP_STATUS)) + break; + else + usleep(1); + + if (i) { + ViaDebug(Swov->scrnIndex, "%s: status wait: %d.\n", __FUNCTION__, i); + if (!(Swov->HQV->Control & HQV_FLIP_STATUS)) + xf86DrvMsg(Swov->scrnIndex, X_WARNING, "%s: Unable to initialise" + " the HQV. (Status still not set)\n", __FUNCTION__); + } +} + +/* + * + */ +static void ViaHQVFlip(VIAPtr pVia, unsigned char* buf) { struct ViaSwov *Swov = pVia->Swov; @@ -1753,16 +1774,12 @@ ViaHQVFlip(VIAPtr pVia, unsigned char* buf) /* Before we fire V3 for the first time, wait. */ if (!Swov->Active) { - for (i = 0; i < 15; i++) - if ((Swov->HQV->Control & HQV_FLIP_STATUS)) - break; - else - usleep(1); - if (i) { - ViaDebug(Swov->scrnIndex, "%s: status wait: %d.\n", __FUNCTION__, i); - if (!(Swov->HQV->Control & HQV_FLIP_STATUS)) - xf86DrvMsg(Swov->scrnIndex, X_WARNING, "%s: Unable to initialise" - " the HQV. (Status still not set)\n", __FUNCTION__); + ViaHQVFlipInitWait(Swov); + + if (Swov->HQVDoubleInit) { + /* avoid green flash of a nulled YUV Back buffer */ + Swov->HQV->Control |= HQV_SW_FLIP | HQV_FLIP_STATUS; + ViaHQVFlipInitWait(Swov); } } } @@ -2030,6 +2047,33 @@ viaQueryImageAttributes(ScrnInfoPtr pScrn, int FourCC, CARD16 *Width, * */ static void +ViaHQVIdleWait(struct ViaSwov *Swov) +{ + int i; + + for (i = 0; i < 10; i++) + if (!(Swov->HQV->Control & HQV_IDLE) || + (Swov->HQV->Control & HQV_FLIP_STATUS)) { + Swov->HQV->Control |= HQV_FLIP_STATUS; + usleep(1); + } else + break; + + if (i) { + ViaDebug(Swov->scrnIndex, "%s: idle/status wait: %d.\n", __FUNCTION__, i); + if (!(Swov->HQV->Control & HQV_IDLE)) + xf86DrvMsg(Swov->scrnIndex, X_WARNING, "%s: HQV not idle.\n", + __FUNCTION__); + if (Swov->HQV->Control & HQV_FLIP_STATUS) + xf86DrvMsg(Swov->scrnIndex, X_WARNING, "%s: HQV flip status not" + " cleared.\n", __FUNCTION__); + } +} + +/* + * + */ +static void ViaVideoReset(ScrnInfoPtr pScrn) { struct ViaSwov *Swov = VIAPTR(pScrn)->Swov; @@ -2046,14 +2090,18 @@ ViaVideoReset(ScrnInfoPtr pScrn) Swov->Video->Compose = V1_COMMAND_FIRE; Swov->Video->Compose = V3_COMMAND_FIRE; - if (Swov->HQVDisablePatch) { - vgaHWPtr hwp = VGAHWPTR(pScrn); + if (Swov->HQV->Control & HQV_ENABLE) { + ViaHQVIdleWait(Swov); - ViaSeqMask(hwp, 0x2E, 0x00, 0x10); - Swov->HQV->Control &= ~HQV_ENABLE; - ViaSeqMask(hwp, 0x2E, 0x10, 0x10); - } else - Swov->HQV->Control &= ~HQV_ENABLE; + if (Swov->HQVDisablePatch) { + vgaHWPtr hwp = VGAHWPTR(pScrn); + + ViaSeqMask(hwp, 0x2E, 0x00, 0x10); + Swov->HQV->Control &= ~HQV_ENABLE; + ViaSeqMask(hwp, 0x2E, 0x10, 0x10); + } else + Swov->HQV->Control &= ~HQV_ENABLE; + } } /* @@ -2067,6 +2115,8 @@ ViaSwovStop(ScrnInfoPtr pScrn) VIAFUNC(pScrn->scrnIndex); + ViaHQVIdleWait(Swov); + if (Swov->HQVDisablePatch) ViaSeqMask(hwp, 0x2E, 0x00, 0x10); @@ -2150,26 +2200,31 @@ ViaSwovInit(ScrnInfoPtr pScrn) Swov->ThreeHQVBuffer = FALSE; Swov->HQVFetchByteUnit = TRUE; Swov->HQVDisablePatch = FALSE; + Swov->HQVDoubleInit = TRUE; } else { Swov->ThreeHQVBuffer = TRUE; Swov->HQVFetchByteUnit = FALSE; Swov->HQVDisablePatch = TRUE; + Swov->HQVDoubleInit = FALSE; } break; case VT3205: Swov->ThreeHQVBuffer = TRUE; Swov->HQVFetchByteUnit = FALSE; Swov->HQVDisablePatch = TRUE; + Swov->HQVDoubleInit = FALSE; break; case VT3204: Swov->ThreeHQVBuffer = TRUE; Swov->HQVFetchByteUnit = FALSE; Swov->HQVDisablePatch = TRUE; + Swov->HQVDoubleInit = FALSE; break; case VT3259: Swov->ThreeHQVBuffer = TRUE; Swov->HQVFetchByteUnit = FALSE; Swov->HQVDisablePatch = FALSE; + Swov->HQVDoubleInit = FALSE; break; default: xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "%s: Unhandled ChipSet.\n", diff --git a/src/via_video.h b/src/via_video.h index 41e8889..a4fb91c 100644 --- a/src/via_video.h +++ b/src/via_video.h @@ -42,7 +42,7 @@ struct ViaXvPort { #define VIA_DEINT_BOB 0x01 #define VIA_DEINT_INTERLEAVE 0x02 - CARD32 FourCC; + int FourCC; struct ViaMem *Front[2]; struct ViaMem *Back[3]; @@ -91,6 +91,7 @@ struct ViaSwov { Bool ThreeHQVBuffer; Bool HQVFetchByteUnit; Bool HQVDisablePatch; + Bool HQVDoubleInit; /* Track frame position */ short frameX0; |