summaryrefslogtreecommitdiff
path: root/src/via_swov.c
diff options
context:
space:
mode:
authorJon Nettleton <jon.nettleton@gmail.com>2007-06-14 18:24:51 +0000
committerJon Nettleton <jon.nettleton@gmail.com>2007-06-14 18:24:51 +0000
commitdb6b8ff3de7d43a63caf7178670af9bd27811898 (patch)
treef8345cda8d5acfcdbdcb41e6209d2775b6640827 /src/via_swov.c
parentd45b190b7f1ac61d708a1e1a16584aaadd6f1ac5 (diff)
merge unmerged changes from experimental branch
Diffstat (limited to 'src/via_swov.c')
-rw-r--r--src/via_swov.c114
1 files changed, 91 insertions, 23 deletions
diff --git a/src/via_swov.c b/src/via_swov.c
index b207f3226fc0..4106c026dbb1 100644
--- a/src/via_swov.c
+++ b/src/via_swov.c
@@ -89,13 +89,12 @@ viaWaitHQVFlip(VIAPtr pVia)
unsigned long proReg = 0;
CARD32 volatile *pdwState;
- if ((pVia->ChipId == PCI_CHIP_VT3259) &&
- !(pVia->swov.gdwVideoFlagSW & VIDEO_1_INUSE))
+ if (pVia->ChipId == PCI_CHIP_VT3259 && !(pVia->swov.gdwVideoFlagSW & VIDEO_1_INUSE))
proReg = PRO_HQV1_OFFSET;
pdwState = (CARD32 volatile *)(pVia->VidMapBase + (HQV_CONTROL + proReg));
- if (pVia->ChipId == PCI_CHIP_VT3259) {
+ if (pVia->VideoEngine == VIDEO_ENGINE_CME) {
while (*pdwState & (HQV_SUBPIC_FLIP | HQV_SW_FLIP)) ;
} else {
while (!(*pdwState & HQV_FLIP_STATUS)) ;
@@ -126,8 +125,7 @@ viaWaitHQVDone(VIAPtr pVia)
CARD32 volatile *pdwState;
unsigned long proReg = 0;
- if ((pVia->ChipId == PCI_CHIP_VT3259) &&
- !(pVia->swov.gdwVideoFlagSW & VIDEO_1_INUSE))
+ if (pVia->ChipId == PCI_CHIP_VT3259 && !(pVia->swov.gdwVideoFlagSW & VIDEO_1_INUSE))
proReg = PRO_HQV1_OFFSET;
pdwState = (CARD32 volatile *)(pVia->VidMapBase + (HQV_CONTROL + proReg));
@@ -214,12 +212,14 @@ VIAVidHWDiffInit(ScrnInfoPtr pScrn)
HWDiff->dwSupportTwoColorKey = VID_HWDIFF_FALSE;
HWDiff->dwHQVInitPatch = VID_HWDIFF_TRUE;
HWDiff->dwHQVDisablePatch = VID_HWDIFF_FALSE;
+ HWDiff->dwNeedV1Prefetch = VID_HWDIFF_FALSE;
} else {
HWDiff->dwThreeHQVBuffer = VID_HWDIFF_TRUE;
HWDiff->dwHQVFetchByteUnit = VID_HWDIFF_TRUE;
HWDiff->dwSupportTwoColorKey = VID_HWDIFF_TRUE;
HWDiff->dwHQVInitPatch = VID_HWDIFF_FALSE;
HWDiff->dwHQVDisablePatch = VID_HWDIFF_TRUE;
+ HWDiff->dwNeedV1Prefetch = VID_HWDIFF_FALSE;
}
break;
case VIA_KM400:
@@ -228,6 +228,7 @@ VIAVidHWDiffInit(ScrnInfoPtr pScrn)
HWDiff->dwSupportTwoColorKey = VID_HWDIFF_FALSE;
HWDiff->dwHQVInitPatch = VID_HWDIFF_FALSE;
HWDiff->dwHQVDisablePatch = VID_HWDIFF_TRUE;
+ HWDiff->dwNeedV1Prefetch = VID_HWDIFF_FALSE;
break;
case VIA_K8M800:
HWDiff->dwThreeHQVBuffer = VID_HWDIFF_TRUE;
@@ -235,6 +236,7 @@ VIAVidHWDiffInit(ScrnInfoPtr pScrn)
HWDiff->dwSupportTwoColorKey = VID_HWDIFF_FALSE;
HWDiff->dwHQVInitPatch = VID_HWDIFF_FALSE;
HWDiff->dwHQVDisablePatch = VID_HWDIFF_TRUE;
+ HWDiff->dwNeedV1Prefetch = VID_HWDIFF_FALSE;
break;
case VIA_PM800:
HWDiff->dwThreeHQVBuffer = VID_HWDIFF_TRUE;
@@ -242,14 +244,41 @@ VIAVidHWDiffInit(ScrnInfoPtr pScrn)
HWDiff->dwSupportTwoColorKey = VID_HWDIFF_TRUE;
HWDiff->dwHQVInitPatch = VID_HWDIFF_FALSE;
HWDiff->dwHQVDisablePatch = VID_HWDIFF_FALSE;
+ HWDiff->dwNeedV1Prefetch = VID_HWDIFF_FALSE;
break;
case VIA_VM800:
+ case VIA_P4M900:
HWDiff->dwThreeHQVBuffer = VID_HWDIFF_TRUE;
HWDiff->dwHQVFetchByteUnit = VID_HWDIFF_TRUE;
HWDiff->dwSupportTwoColorKey = VID_HWDIFF_FALSE;
HWDiff->dwHQVInitPatch = VID_HWDIFF_FALSE;
HWDiff->dwHQVDisablePatch = VID_HWDIFF_TRUE;
+ HWDiff->dwNeedV1Prefetch = VID_HWDIFF_FALSE;
break;
+ case VIA_K8M890:
+ HWDiff->dwThreeHQVBuffer = VID_HWDIFF_TRUE;
+ HWDiff->dwHQVFetchByteUnit = VID_HWDIFF_TRUE;
+ HWDiff->dwSupportTwoColorKey = VID_HWDIFF_FALSE;
+ HWDiff->dwHQVInitPatch = VID_HWDIFF_FALSE;
+ HWDiff->dwHQVDisablePatch = VID_HWDIFF_TRUE;
+ HWDiff->dwNeedV1Prefetch = VID_HWDIFF_TRUE;
+ break;
+ case VIA_P4M890:
+ HWDiff->dwThreeHQVBuffer = VID_HWDIFF_TRUE;
+ HWDiff->dwHQVFetchByteUnit = VID_HWDIFF_TRUE;
+ HWDiff->dwSupportTwoColorKey = VID_HWDIFF_FALSE;
+ HWDiff->dwHQVInitPatch = VID_HWDIFF_FALSE;
+ HWDiff->dwHQVDisablePatch = VID_HWDIFF_TRUE;
+ HWDiff->dwNeedV1Prefetch = VID_HWDIFF_FALSE;
+ break;
+ case VIA_CX700:
+ HWDiff->dwThreeHQVBuffer = VID_HWDIFF_TRUE;
+ HWDiff->dwHQVFetchByteUnit = VID_HWDIFF_TRUE;
+ HWDiff->dwSupportTwoColorKey = VID_HWDIFF_TRUE;
+ HWDiff->dwHQVInitPatch = VID_HWDIFF_FALSE;
+ HWDiff->dwHQVDisablePatch = VID_HWDIFF_FALSE;
+ HWDiff->dwNeedV1Prefetch = VID_HWDIFF_FALSE;
+ break;
default:
xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
"VIAVidHWDiffInit: Unhandled ChipSet.\n");
@@ -739,6 +768,10 @@ viaCalculateVideoColor(VIAPtr pVia, int hue, int saturation, int brightness,
case PCI_CHIP_VT3204:
case PCI_CHIP_VT3259:
case PCI_CHIP_VT3314:
+ case PCI_CHIP_VT3336:
+ case PCI_CHIP_VT3364:
+ case PCI_CHIP_VT3324:
+ case PCI_CHIP_VT3327:
model = 0;
break;
case PCI_CHIP_CLE3122:
@@ -872,6 +905,10 @@ viaSetColorSpace(VIAPtr pVia, int hue, int saturation, int brightness,
DBG_DD(ErrorF("000002C4 %08lx\n", col1));
DBG_DD(ErrorF("000002C8 %08lx\n", col2));
break;
+ case PCI_CHIP_VT3327:
+ case PCI_CHIP_VT3336:
+ case PCI_CHIP_VT3324:
+ case PCI_CHIP_VT3364:
case PCI_CHIP_CLE3122:
VIDOutD(V1_ColorSpaceReg_2, col2);
VIDOutD(V1_ColorSpaceReg_1, col1);
@@ -896,6 +933,12 @@ ViaInitVideoStatusFlag(VIAPtr pVia)
case PCI_CHIP_VT3259:
case PCI_CHIP_VT3314:
return VIDEO_HQV_INUSE | SW_USE_HQV | VIDEO_3_INUSE;
+ case PCI_CHIP_VT3327:
+ case PCI_CHIP_VT3336:
+ case PCI_CHIP_VT3324:
+ case PCI_CHIP_VT3364:
+ return VIDEO_HQV_INUSE | SW_USE_HQV | VIDEO_1_INUSE | \
+ VIDEO_ACTIVE | VIDEO_SHOW;
case PCI_CHIP_CLE3122:
return VIDEO_HQV_INUSE | SW_USE_HQV | VIDEO_1_INUSE;
default:
@@ -927,14 +970,17 @@ ViaSetVidCtl(VIAPtr pVia, unsigned int videoFlag)
case PCI_CHIP_VT3259:
case PCI_CHIP_VT3314:
return V3_ENABLE | V3_EXPIRE_NUM_3205;
-
+ case PCI_CHIP_VT3327:
+ case PCI_CHIP_VT3336:
+ case PCI_CHIP_VT3324:
+ case PCI_CHIP_VT3364:
+ return V3_ENABLE | VIDEO_EXPIRE_NUM_VT3336;
case PCI_CHIP_CLE3122:
if (CLE266_REV_IS_CX(pVia->ChipRev))
return V3_ENABLE | V3_EXPIRE_NUM_F;
else
return V3_ENABLE | V3_EXPIRE_NUM;
break;
-
default:
DBG_DD(ErrorF("Unknown DeviceID\n"));
break;
@@ -976,8 +1022,7 @@ AddHQVSurface(ScrnInfoPtr pScrn, unsigned int numbuf, CARD32 fourcc)
{ HQV_DST_STARTADDR0, HQV_DST_STARTADDR1, HQV_DST_STARTADDR2 };
unsigned long proReg = 0;
- if ((pVia->ChipId == PCI_CHIP_VT3259) &&
- !(pVia->swov.gdwVideoFlagSW & VIDEO_1_INUSE))
+ if (pVia->ChipId == PCI_CHIP_VT3259 && !(pVia->swov.gdwVideoFlagSW & VIDEO_1_INUSE))
proReg = PRO_HQV1_OFFSET;
isplanar = ((fourcc == FOURCC_YV12) || (fourcc == FOURCC_XVMC));
@@ -1205,7 +1250,7 @@ SetFIFO_V1(VIAPtr pVia, CARD8 depth, CARD8 prethreshold, CARD8 threshold)
static void
SetFIFO_V3(VIAPtr pVia, CARD8 depth, CARD8 prethreshold, CARD8 threshold)
{
- if (pVia->ChipId == PCI_CHIP_VT3314) {
+ if ((pVia->ChipId == PCI_CHIP_VT3314) || (pVia->ChipId == PCI_CHIP_VT3324) || (pVia->ChipId == PCI_CHIP_VT3327)) {
SaveVideoRegister(pVia, ALPHA_V3_FIFO_CONTROL,
(VIDInD(ALPHA_V3_FIFO_CONTROL) & ALPHA_FIFO_MASK) |
((depth - 1) & 0xff) | ((threshold & 0xff) << 8));
@@ -1263,6 +1308,12 @@ static void
SetFIFO_V3_64or32or32(VIAPtr pVia)
{
switch (pVia->ChipId) {
+ case PCI_CHIP_VT3327:
+ case PCI_CHIP_VT3336:
+ case PCI_CHIP_VT3324:
+ case PCI_CHIP_VT3364:
+ SetFIFO_V3(pVia, 225, 200, 250);
+ break;
case PCI_CHIP_VT3204:
SetFIFO_V3(pVia, 100, 89, 89);
break;
@@ -1273,14 +1324,12 @@ SetFIFO_V3_64or32or32(VIAPtr pVia)
case PCI_CHIP_VT3259:
SetFIFO_V3(pVia, 32, 29, 29);
break;
-
case PCI_CHIP_CLE3122:
if (CLE266_REV_IS_CX(pVia->ChipRev))
SetFIFO_V3(pVia, 64, 56, 56);
else
SetFIFO_V3(pVia, 32, 16, 16);
break;
-
default:
break;
}
@@ -1290,6 +1339,12 @@ static void
SetFIFO_V3_64or32or16(VIAPtr pVia)
{
switch (pVia->ChipId) {
+ case PCI_CHIP_VT3327:
+ case PCI_CHIP_VT3336:
+ case PCI_CHIP_VT3324:
+ case PCI_CHIP_VT3364:
+ SetFIFO_V3(pVia, 225, 200, 250);
+ break;
case PCI_CHIP_VT3204:
SetFIFO_V3(pVia, 100, 89, 89);
break;
@@ -1391,7 +1446,7 @@ SetColorKey(VIAPtr pVia, unsigned long videoFlag,
CARD32 keyLow, CARD32 keyHigh, CARD32 compose)
{
keyLow &= 0x00FFFFFF;
- if (pVia->ChipId == PCI_CHIP_VT3259)
+ if (pVia->VideoEngine == VIDEO_ENGINE_CME)
keyLow |= 0x40000000;
/*SaveVideoRegister(pVia, V_COLOR_KEY, keyLow); */
@@ -1423,7 +1478,7 @@ SetChromaKey(VIAPtr pVia, unsigned long videoFlag,
chromaLow |= (VIDInD(V_CHROMAKEY_LOW) & ~CHROMA_KEY_LOW);
chromaHigh |= (VIDInD(V_CHROMAKEY_HIGH) & ~CHROMA_KEY_HIGH);
- if (pVia->ChipId == PCI_CHIP_VT3259)
+ if (pVia->VideoEngine == VIDEO_ENGINE_CME)
chromaLow |= 0x40000000;
SaveVideoRegister(pVia, V_CHROMAKEY_HIGH, chromaHigh);
@@ -1465,8 +1520,7 @@ SetHQVFetch(VIAPtr pVia, CARD32 srcFetch, unsigned long srcHeight)
{
unsigned long proReg = 0;
- if ((pVia->ChipId == PCI_CHIP_VT3259) &&
- !(pVia->swov.gdwVideoFlagSW & VIDEO_1_INUSE))
+ if (pVia->ChipId == PCI_CHIP_VT3259 && !(pVia->swov.gdwVideoFlagSW & VIDEO_1_INUSE))
proReg = PRO_HQV1_OFFSET;
if (!pVia->HWDiff.dwHQVFetchByteUnit) { /* CLE_C0 */
@@ -1632,7 +1686,9 @@ Upd_Video(ScrnInfoPtr pScrn, unsigned long videoFlag,
unsigned long dwOffset = 0, fetch = 0, tmp = 0;
unsigned long proReg = 0;
- if ((pVia->ChipId == PCI_CHIP_VT3259) && !(videoFlag & VIDEO_1_INUSE))
+ DBG_DD(ErrorF("videoflag=%p\n",videoFlag));
+
+ if (pVia->ChipId == PCI_CHIP_VT3259 && !(videoFlag & VIDEO_1_INUSE))
proReg = PRO_HQV1_OFFSET;
compose = (VIDInD(V_COMPOSE_MODE) &
@@ -1657,6 +1713,12 @@ Upd_Video(ScrnInfoPtr pScrn, unsigned long videoFlag,
DBG_DD(ErrorF("===srcHeight= %ld \n", srcHeight));
vidCtl = ViaSetVidCtl(pVia, videoFlag);
+
+ if(hwDiff->dwNeedV1Prefetch) {
+ DBG_DD(ErrorF("NEEDV1PREFETCH\n"));
+ vidCtl |= V1_PREFETCH_ON_3336;
+ }
+
viaOverlayGetV1V3Format(pVia, (videoFlag & VIDEO_1_INUSE) ? 1 : 3,
videoFlag, &vidCtl, &hqvCtl);
@@ -1688,7 +1750,7 @@ Upd_Video(ScrnInfoPtr pScrn, unsigned long videoFlag,
pVia->swov.overlayRecordV1.dwOffset,
pVia->swov.overlayRecordV1.dwUVoffset,
srcPitch, oriSrcHeight);
- if (pVia->ChipId == PCI_CHIP_VT3259) {
+ if (pVia->VideoEngine == VIDEO_ENGINE_CME) {
SaveVideoRegister(pVia, HQV_SRC_STARTADDR_Y + proReg,
YCbCr.dwY);
SaveVideoRegister(pVia, HQV_SRC_STARTADDR_U + proReg,
@@ -1726,7 +1788,7 @@ Upd_Video(ScrnInfoPtr pScrn, unsigned long videoFlag,
pVia->swov.overlayRecordV1.dwHQVAddr[1] + hqvOffset,
pVia->swov.overlayRecordV1.dwHQVAddr[2] + hqvOffset);
- if (pVia->ChipId == PCI_CHIP_VT3259)
+ if (pVia->VideoEngine == VIDEO_ENGINE_CME)
SaveVideoRegister(pVia, 0x1cc + proReg, dwOffset);
SaveVideoRegister(pVia, HQV_SRC_STARTADDR_Y + proReg, startAddr);
} else {
@@ -1865,6 +1927,12 @@ Upd_Video(ScrnInfoPtr pScrn, unsigned long videoFlag,
if (haveHQVzoomV) {
miniCtl |= V1_Y_INTERPOLY | V1_YCBCR_INTERPOLY;
+ if (srcWidth >= 800 &&
+ (pVia->ChipId == PCI_CHIP_VT3327 || pVia->ChipId == PCI_CHIP_VT3336 ||
+ pVia->ChipId == PCI_CHIP_VT3324 || pVia->ChipId == PCI_CHIP_VT3364 ||
+ pVia->ChipId == PCI_CHIP_VT3205)) {
+ miniCtl &= ~V1_Y_INTERPOLY;
+ }
tmp |= zoomCtl & 0x0000ffff;
hqvFilterCtl &= 0xfffdffff;
}
@@ -1924,7 +1992,7 @@ Upd_Video(ScrnInfoPtr pScrn, unsigned long videoFlag,
usleep(1);
}
- if (pVia->ChipId == PCI_CHIP_VT3259)
+ if (pVia->VideoEngine == VIDEO_ENGINE_CME)
hqvCtl |= HQV_GEN_IRQ;
VIDOutD(HQV_CONTROL + proReg, hqvCtl & ~HQV_SW_FLIP);
@@ -1933,7 +2001,7 @@ Upd_Video(ScrnInfoPtr pScrn, unsigned long videoFlag,
DBG_DD(ErrorF("HQV control wf5 - %08lx\n", *HQVCtrl));
DBG_DD(ErrorF(" Wait flips5"));
- if (pVia->ChipId != PCI_CHIP_VT3259) {
+ if (pVia->VideoEngine != VIDEO_ENGINE_CME) {
for (i = 0; (i < 50) && !(*HQVCtrl & HQV_FLIP_STATUS);
i++) {
DBG_DD(ErrorF(" HQV wait %d %08lx\n", i, *HQVCtrl));
@@ -2042,7 +2110,7 @@ VIAVidUpdateOverlay(ScrnInfoPtr pScrn, LPDDUPDATEOVERLAY pUpdate)
videoFlag = pVia->swov.gdwVideoFlagSW;
}
- if ((pVia->ChipId == PCI_CHIP_VT3259) && !(videoFlag & VIDEO_1_INUSE))
+ if (pVia->ChipId == PCI_CHIP_VT3259 && !(videoFlag & VIDEO_1_INUSE))
proReg = PRO_HQV1_OFFSET;
flags |= DDOVER_INTERLEAVED;
@@ -2170,7 +2238,7 @@ ViaOverlayHide(ScrnInfoPtr pScrn)
(pVia->swov.SrcFourCC == FOURCC_XVMC))
videoFlag = pVia->swov.gdwVideoFlagSW;
- if ((pVia->ChipId == PCI_CHIP_VT3259) && !(videoFlag & VIDEO_1_INUSE))
+ if (pVia->ChipId == PCI_CHIP_VT3259 && !(videoFlag & VIDEO_1_INUSE))
proReg = PRO_HQV1_OFFSET;
ResetVidRegBuffer(pVia);