diff -Naur xc.orig/programs/Xserver/hw/xfree86/drivers/trident/trident_video.c xc/programs/Xserver/hw/xfree86/drivers/trident/trident_video.c --- xc.orig/programs/Xserver/hw/xfree86/drivers/trident/trident_video.c 2003-07-03 17:40:19.000000000 +0200 +++ xc/programs/Xserver/hw/xfree86/drivers/trident/trident_video.c 2003-07-03 16:33:40.000000000 +0200 @@ -21,7 +21,7 @@ * * Author: Alan Hourihane, alanh@fairlite.demon.co.uk */ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/trident/trident_video.c,v 1.31 2002/12/22 18:54:43 alanh Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/trident/trident_video.c,v 1.35 2003/06/01 23:02:09 alanh Exp $ */ #include "xf86.h" #include "xf86_OSproc.h" @@ -67,7 +67,7 @@ static void tridentSetVideoParameters(TRIDENTPtr pTrident, int brightness, int saturation, int hue); void tridentFixFrame(ScrnInfoPtr pScrn, int *fixFrame); -static void WaitForSync(ScrnInfoPtr pScrn); +static void WaitForVBlank(ScrnInfoPtr pScrn); #define MAKE_ATOM(a) MakeAtom(a, sizeof(a) - 1, TRUE) @@ -255,6 +255,9 @@ int red, green, blue; int tmp; + WaitForVBlank(pScrn); + OUTW(vgaIOBase + 4, 0x848E); + if (pTrident->Chipset >= CYBER9388) { OUTW(vgaIOBase + 4, 0x80B9); OUTW(vgaIOBase + 4, 0x00BE); @@ -326,8 +329,6 @@ tridentSetVideoParameters(pTrident,pPriv->Brightness,pPriv->Saturation, pPriv->HUE); } - - OUTW(vgaIOBase + 4, 0x848E); } @@ -407,37 +408,6 @@ } -static Bool -RegionsEqual(RegionPtr A, RegionPtr B) -{ - int *dataA, *dataB; - int num; - - num = REGION_NUM_RECTS(A); - if(num != REGION_NUM_RECTS(B)) - return FALSE; - - if((A->extents.x1 != B->extents.x1) || - (A->extents.x2 != B->extents.x2) || - (A->extents.y1 != B->extents.y1) || - (A->extents.y2 != B->extents.y2)) - return FALSE; - - dataA = (int*)REGION_RECTS(A); - dataB = (int*)REGION_RECTS(B); - - while(num--) { - if((dataA[0] != dataB[0]) || (dataA[1] != dataB[1])) - return FALSE; - dataA += 2; - dataB += 2; - } - - return TRUE; -} - -#define DummyScreen screenInfo.screens[0] - static void TRIDENTStopVideo(ScrnInfoPtr pScrn, pointer data, Bool shutdown) { @@ -449,9 +419,9 @@ if(shutdown) { if(pPriv->videoStatus & CLIENT_VIDEO_ON) { - OUTW(vgaIOBase + 4, 0x0091); - WaitForSync(pScrn); - OUTW(vgaIOBase + 4, 0x848E); + WaitForVBlank(pScrn); + OUTW(vgaIOBase + 4, 0x848E); + OUTW(vgaIOBase + 4, 0x0091); } if(pPriv->linear) { xf86FreeOffscreenLinear(pPriv->linear); @@ -616,55 +586,6 @@ } -static void -TRIDENTCopyData( - unsigned char *src, - unsigned char *dst, - int srcPitch, - int dstPitch, - int h, - int w -){ - w <<= 1; - while(h--) { - memcpy(dst, src, w); - src += srcPitch; - dst += dstPitch; - } -} - -static void -TRIDENTCopyMungedData( - unsigned char *src1, - unsigned char *src2, - unsigned char *src3, - unsigned char *dst1, - int srcPitch, - int srcPitch2, - int dstPitch, - int h, - int w -){ - CARD32 *dst = (CARD32*)dst1; - int i, j; - - dstPitch >>= 2; - w >>= 1; - - for(j = 0; j < h; j++) { - for(i = 0; i < w; i++) { - dst[i] = src1[i << 1] | (src1[(i << 1) + 1] << 16) | - (src3[i] << 8) | (src2[i] << 24); - } - dst += dstPitch; - src1 += srcPitch; - if(j & 1) { - src2 += srcPitch2; - src3 += srcPitch2; - } - } -} - static FBLinearPtr TRIDENTAllocateMemory( ScrnInfoPtr pScrn, @@ -858,6 +779,7 @@ OUTW(vgaIOBase + 4, 0xFFBC); OUTW(vgaIOBase + 4, 0xFFBD); OUTW(vgaIOBase + 4, 0x04BE); + WaitForVBlank(pScrn); OUTW(vgaIOBase + 4, 0x948E); } else { @@ -866,6 +788,7 @@ OUTW(vgaIOBase + 4, ((((id == FOURCC_YV12) || (id == FOURCC_YUY2)) ? ((width+2) >> 2) : ((width+2) >> 6)) << 8) |0x96); + WaitForVBlank(pScrn); OUTW(vgaIOBase + 4, 0x948E); OUTB(0x83C8, 0x00); OUTB(0x83C6, 0x95); @@ -960,23 +883,23 @@ offset3 = tmp; } nlines = ((((y2 + 0xffff) >> 16) + 1) & ~1) - top; - TRIDENTCopyMungedData(buf + (top * srcPitch) + (left >> 1), - buf + offset2, buf + offset3, dst_start, - srcPitch, srcPitch2, dstPitch, nlines, npixels); + xf86XVCopyYUV12ToPacked(buf + (top * srcPitch) + (left >> 1), + buf + offset2, buf + offset3, dst_start, + srcPitch, srcPitch2, dstPitch, nlines, npixels); break; case FOURCC_UYVY: case FOURCC_YUY2: default: buf += (top * srcPitch) + left; nlines = ((y2 + 0xffff) >> 16) - top; - TRIDENTCopyData(buf, dst_start, srcPitch, dstPitch, nlines, npixels); + xf86XVCopyPacked(buf, dst_start, srcPitch, dstPitch, nlines, npixels); break; } /* update cliplist */ - if(!RegionsEqual(&pPriv->clip, clipBoxes)) { + if(!REGION_EQUAL(pScrn->pScreen, &pPriv->clip, clipBoxes)) { /* update cliplist */ - REGION_COPY(pScreen, &pPriv->clip, clipBoxes); + REGION_COPY(pScrn->pScreen, &pPriv->clip, clipBoxes); xf86XVFillKeyHelper(pScrn->pScreen, pPriv->colorKey, clipBoxes); } @@ -1101,10 +1024,9 @@ if(pPriv->isOn) { TRIDENTPtr pTrident = TRIDENTPTR(surface->pScrn); int vgaIOBase = VGAHWPTR(surface->pScrn)->IOBase; - - OUTW(vgaIOBase + 4, 0x0091); - WaitForSync(surface->pScrn); + WaitForVBlank(surface->pScrn); OUTW(vgaIOBase + 4, 0x848E); + OUTW(vgaIOBase + 4, 0x0091); pPriv->isOn = FALSE; } @@ -1249,9 +1171,9 @@ if(pPriv->videoStatus & TIMER_MASK) { if(pPriv->videoStatus & OFF_TIMER) { if(pPriv->offTime < time) { - OUTW(vgaIOBase + 4, 0x0091); - WaitForSync(pScrn); + WaitForVBlank(pScrn); OUTW(vgaIOBase + 4, 0x848E); + OUTW(vgaIOBase + 4, 0x0091); pPriv->videoStatus = FREE_TIMER; pPriv->freeTime = time + FREE_DELAY; } @@ -1399,7 +1321,7 @@ } static void -WaitForSync(ScrnInfoPtr pScrn) +WaitForVBlank(ScrnInfoPtr pScrn) { register vgaHWPtr hwp = VGAHWPTR(pScrn);