summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuc Verhaegen <libv@skynet.be>2005-10-14 09:17:29 +0000
committerLuc Verhaegen <libv@skynet.be>2005-10-14 09:17:29 +0000
commitb33b3757e38d28f05f72b56cea86ea8afc7cc410 (patch)
treed2b85747a0abcc06246587e154f205c3e8d4ea77
parent250ff89aebc1750b3d547b0930a6c2323b5fe669 (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.c93
-rw-r--r--src/via_video.h3
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;