diff options
author | Jon Nettleton <jon.nettleton@gmail.com> | 2007-06-14 18:24:51 +0000 |
---|---|---|
committer | Jon Nettleton <jon.nettleton@gmail.com> | 2007-06-14 18:24:51 +0000 |
commit | db6b8ff3de7d43a63caf7178670af9bd27811898 (patch) | |
tree | f8345cda8d5acfcdbdcb41e6209d2775b6640827 /src/via_swov.c | |
parent | d45b190b7f1ac61d708a1e1a16584aaadd6f1ac5 (diff) |
merge unmerged changes from experimental branch
Diffstat (limited to 'src/via_swov.c')
-rw-r--r-- | src/via_swov.c | 114 |
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); |