--- XFree86-4.2.1/xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfxdefs.h.orig Thu Apr 5 23:29:17 2001 +++ XFree86-4.2.1/xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfxdefs.h Thu Sep 5 21:46:01 2002 @@ -45,6 +45,7 @@ #define SST_DESKTOP_EN BIT(7) #define SST_DESKTOP_PIXEL_FORMAT_SHIFT 18 #define SST_DESKTOP_CLUT_BYPASS BIT(10) +#define SST_INTERLACE BIT(3) #define SST_HALF_MODE BIT(4) #define SST_CURSOR_EN BIT(27) #define SST_FBI_BUSY BIT(7) --- XFree86-4.2.1/xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx_driver.c.orig Wed Sep 18 03:02:14 2002 +++ XFree86-4.2.1/xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx_driver.c Wed Sep 18 13:41:20 2002 @@ -960,7 +960,18 @@ clockRanges->minClock= 12000; /* !!! What's the min clock? !!! */ clockRanges->maxClock=pTDFX->MaxClock; clockRanges->clockIndex = -1; - clockRanges->interlaceAllowed = FALSE; + switch (pTDFX->ChipType) { + case PCI_CHIP_BANSHEE: + clockRanges->interlaceAllowed = FALSE; + break; + case PCI_CHIP_VOODOO3: + case PCI_CHIP_VOODOO5: + clockRanges->interlaceAllowed = TRUE; + break; + default: + clockRanges->interlaceAllowed = FALSE; + break; + } clockRanges->doubleScanAllowed = TRUE; /* @@ -990,7 +1001,7 @@ return FALSE; } - xf86SetCrtcForModes(pScrn, INTERLACE_HALVE_V); + xf86SetCrtcForModes(pScrn, 0); pScrn->currentMode = pScrn->modes; @@ -1666,6 +1677,10 @@ tdfxReg->screensize=mode->HDisplay|(mode->VDisplay<<12); tdfxReg->vidcfg &= ~SST_HALF_MODE; } + if (mode->Flags&V_INTERLACE) { + tdfxReg->vidcfg|=SST_INTERLACE; + } else + tdfxReg->vidcfg&=~SST_INTERLACE; TDFXTRACEREG("cpp=%d Hdisplay=%d Vdisplay=%d stride=%d screensize=%x\n", pTDFX->cpp, mode->HDisplay, mode->VDisplay, tdfxReg->stride, @@ -2394,12 +2409,29 @@ static int TDFXValidMode(int scrnIndex, DisplayModePtr mode, Bool verbose, int flags) { + ScrnInfoPtr pScrn; + TDFXPtr pTDFX; + TDFXTRACE("TDFXValidMode start\n"); if ((mode->HDisplay>2048) || (mode->VDisplay>1536)) return MODE_BAD; - /* Banshee doesn't support interlace. Does V3? */ - if (mode->Flags&V_INTERLACE) - return MODE_BAD; + /* Banshee doesn't support interlace, but Voodoo 3 and higher do. */ + pScrn = xf86Screens[scrnIndex]; + pTDFX = TDFXPTR(pScrn); + if (mode->Flags&V_INTERLACE) { + switch (pTDFX->ChipType) { + case PCI_CHIP_BANSHEE: + return MODE_BAD; + break; + case PCI_CHIP_VOODOO3: + case PCI_CHIP_VOODOO5: + return MODE_OK; + break; + default: + return MODE_BAD; + break; + } + } /* In clock doubled mode widths must be divisible by 16 instead of 8 */ if ((mode->Clock>TDFX2XCUTOFF) && (mode->HDisplay%16)) return MODE_BAD;