It also turns back on 'chroma upsampling' (which was only turned off in a failed attempt to solve the issue, see quoted thread) and changes the vsync position to 2 (a la mga_vid.c, seems as good a constant as what was used before but is simpler).
A good example for testing is http://cox.iwr.uni-heidelberg.de/~ug/films/stefan.mov
-Michael
Index: programs/Xserver/hw/xfree86/drivers/mga/mga_video.c =================================================================== RCS file: /cvs/xc/programs/Xserver/hw/xfree86/drivers/mga/mga_video.c,v retrieving revision 1.34 diff -u -r1.34 mga_video.c --- programs/Xserver/hw/xfree86/drivers/mga/mga_video.c 20 Feb 2004 16:59:49 -0000 1.34 +++ programs/Xserver/hw/xfree86/drivers/mga/mga_video.c 15 Apr 2004 12:35:35 -0000 @@ -578,48 +578,29 @@ short src_w, short src_h, short drw_w, short drw_h ){ +#define VSYNC_POS 2 + MGAPtr pMga = MGAPTR(pScrn); - int tmp, hzoom, intrep; - int maxOverlayClock; + int tmp, intrep; CHECK_DMA_QUIESCENT(pMga, pScrn); - /* got 48 scanlines to do it in */ - tmp = INREG(MGAREG_VCOUNT) + 48; - /* FIXME always change it in vertical retrace use CrtcV ?*/ - if(tmp > pScrn->currentMode->CrtcVTotal) - tmp -= 49; /* too bad */ - else - tmp = pScrn->currentMode->CrtcVTotal -1; - - tmp = pScrn->currentMode->VDisplay +1; - /* enable accelerated 2x horizontal zoom when pixelclock >135MHz */ - - if ((pMga->ChipRev >= 0x80) || (pMga->Chipset == PCI_CHIP_MGAG550)) { - /* G450, G550 */ - maxOverlayClock = 234000; - } else { - maxOverlayClock = 135000; - } - - hzoom = (pScrn->currentMode->Clock > maxOverlayClock) ? 1 : 0; - switch(id) { case FOURCC_UYVY: - OUTREG(MGAREG_BESGLOBCTL, 0x000000c0 | (3 * hzoom) | (tmp << 16)); + OUTREG(MGAREG_BESGLOBCTL, 0x000000c0 | (VSYNC_POS << 16)); break; case FOURCC_YUY2: default: - OUTREG(MGAREG_BESGLOBCTL, 0x00000080 | (3 * hzoom) | (tmp << 16)); + OUTREG(MGAREG_BESGLOBCTL, 0x00000080 | (VSYNC_POS << 16)); break; } OUTREG(MGAREG_BESA1ORG, offset); if(y1 & 0x00010000) - OUTREG(MGAREG_BESCTL, 0x00040c41); + OUTREG(MGAREG_BESCTL, 0x00050c41); else - OUTREG(MGAREG_BESCTL, 0x00040c01); + OUTREG(MGAREG_BESCTL, 0x00050c01); OUTREG(MGAREG_BESHCOORD, (dstBox->x1 << 16) | (dstBox->x2 - 1)); OUTREG(MGAREG_BESVCOORD, (dstBox->y1 << 16) | (dstBox->y2 - 1)); @@ -640,7 +621,7 @@ OUTREG(MGAREG_BESVISCAL, tmp & 0x001ffffc); intrep = ((drw_w == src_w) || (drw_w < 2)) ? 0 : 1; - tmp = (((src_w - intrep) << 16)/(drw_w - intrep)) << hzoom; + tmp = (((src_w - intrep) << 16)/(drw_w - intrep)); if(tmp >= (32 << 16)) tmp = (32 << 16) - 1; OUTREG(MGAREG_BESHISCAL, tmp & 0x001ffffc);