diff options
Diffstat (limited to 'xc')
6 files changed, 177 insertions, 115 deletions
diff --git a/xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx.h b/xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx.h index 7ddcab9f7..5860a6781 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx.h +++ b/xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx.h @@ -47,6 +47,9 @@ typedef struct _TDFXRec *TDFXPtr; #define PIXMAP_CACHE_LINES 512 #endif +#define TILE_WIDTH 128 +#define TILE_HEIGHT 32 + #include "tdfx_priv.h" extern Bool TDFXInitFifo(ScreenPtr pScreen); @@ -177,8 +180,12 @@ typedef struct _TDFXRec { unsigned int PIOBase[MAXCHIPS]; long FbMapSize; int pixelFormat; - int stride; /* desktop stride in bytes */ - int strideInTiles; + int desktopIsTiled; + int strideInBytes; /* stride in bytes of physical buffer */ + int strideInTiles; /* stride in tiles of physical */ + int stride; /* either strideInBytes or strideInTiles of desktop */ + int mappedStride; /* Tiled Aperture Pitch */ + int lg2TileAperturePitch; int cpp; int maxClip; int MaxClock; @@ -329,6 +336,7 @@ extern Bool TDFXDRIFinishScreenInit(ScreenPtr pScreen); extern Bool TDFXDGAInit(ScreenPtr pScreen); extern void TDFXCursorGrabMemory(ScreenPtr pScreen); extern void TDFXSetLFBConfig(TDFXPtr pTDFX); +extern int TDFXComputeTileAperturePitch(TDFXPtr pTDFX, int *lgTilePitch); extern void TDFXSendNOPFifo(ScrnInfoPtr pScrn); extern Bool TDFXSwitchMode(int scrnIndex, DisplayModePtr mode, int flags); @@ -372,5 +380,3 @@ extern void TDFXVgaProtect(ScrnInfoPtr pScrn, Bool state); extern void TDFXVgaBlankScreen(ScrnInfoPtr pScrn, Bool state); extern void TDFXVgaRestoreFonts(ScrnInfoPtr pScrn, vgaRegPtr vgaReg); #endif - - diff --git a/xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx_accel.c b/xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx_accel.c index d4fdb1966..ced121a9f 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx_accel.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx_accel.c @@ -122,13 +122,11 @@ TDFXSelectBuffer(TDFXPtr pTDFX, int which) { DECLARE(SSTCP_SRCBASEADDR|SSTCP_DSTBASEADDR|SSTCP_SRCFORMAT|SSTCP_DSTFORMAT); switch (which) { case TDFX_FRONT: -#ifdef TDFX_DESKTOP_IS_TILED - stride = pTDFX->strideInTiles; - tilebit = BIT(31); -#else stride = pTDFX->stride; - tilebit = 0; -#endif + if (pTDFX->desktopIsTiled) + tilebit = BIT(31); + else + tilebit = 0; if (pTDFX->cpp==1) fmt= stride | (1<<16); else @@ -169,40 +167,52 @@ TDFXSelectBuffer(TDFXPtr pTDFX, int which) { } } -void -TDFXSetLFBConfig(TDFXPtr pTDFX) { - unsigned long int tileMark; -#ifdef TDFX_DESKTOP_IS_TILED - tileMark = pTDFX->fbOffset; -#else - tileMark = pTDFX->backOffset; +/* Needs pTDFX->strideInBytes */ +int TDFXComputeTileAperturePitch(TDFXPtr pTDFX, int *lgTilePitch) +{ + int TileAperturePitch, lg2TileAperturePitch, stride; + + if (pTDFX->cpp == 3) + stride = 4 * pTDFX->strideInBytes / 3; + else + stride = pTDFX->strideInBytes;; + + for (lg2TileAperturePitch = 0, TileAperturePitch = SST_MIN_SGRAM_TILE_STRIDE; + TileAperturePitch <= SST_MAX_SGRAM_TILE_STRIDE && + TileAperturePitch < stride; + lg2TileAperturePitch += 1, TileAperturePitch <<= 1) ; +#if 0 + fprintf(stderr, "Using %d (== lg2(%d)-10) for tile aperture pitch\n", + lg2TileAperturePitch, TileAperturePitch); + fprintf(stderr, "stride == %d\n", stride); #endif + *lgTilePitch = lg2TileAperturePitch; + return TileAperturePitch; +} + +void TDFXSetLFBConfig(TDFXPtr pTDFX) +{ + unsigned long int tileMark; + + if (pTDFX->desktopIsTiled) + tileMark = pTDFX->fbOffset; + else + tileMark = pTDFX->backOffset; + if (pTDFX->ChipType<=PCI_CHIP_VOODOO3) { TDFXWriteLongMMIO(pTDFX, LFBMEMORYCONFIG, (tileMark>>12) | - SST_RAW_LFB_ADDR_STRIDE_4K | + SST_RAW_LFB_ADDR_STRIDE(pTDFX->lg2TileAperturePitch) | pTDFX->strideInTiles<<SST_RAW_LFB_TILE_STRIDE_SHIFT); } else { int chip; - int stride, bits; - int TileAperturePitch, lg2TileAperturePitch; - if (pTDFX->cpp==2) stride=pTDFX->stride; - else stride=4*pTDFX->stride/pTDFX->cpp; - bits = tileMark>>12; - for (lg2TileAperturePitch = 0, TileAperturePitch = 1024; - (lg2TileAperturePitch < 5) && - TileAperturePitch < stride; - lg2TileAperturePitch += 1, TileAperturePitch <<= 1); -#if 0 - fprintf(stderr, "Using %d (== lg2(%d)-10) for tile aperture pitch\n", - lg2TileAperturePitch, TileAperturePitch); - fprintf(stderr, "stride == %d\n", stride); -#endif + unsigned long int bits = tileMark >> 12; + for (chip=0; chip<pTDFX->numChips; chip++) { TDFXWriteChipLongMMIO(pTDFX, chip, LFBMEMORYCONFIG, (bits&0x1FFF) | - SST_RAW_LFB_ADDR_STRIDE(lg2TileAperturePitch) | + SST_RAW_LFB_ADDR_STRIDE(pTDFX->lg2TileAperturePitch) | ((bits&0x6000)<<10) | - pTDFX->strideInTiles<<SST_RAW_LFB_TILE_STRIDE_SHIFT); + pTDFX->strideInTiles<<SST_RAW_LFB_TILE_STRIDE_SHIFT); } } } @@ -214,6 +224,7 @@ TDFXAccelInit(ScreenPtr pScreen) ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; TDFXPtr pTDFX = TDFXPTR(pScrn); CARD32 commonFlags; + unsigned int tilebit; pTDFX->AccelInfoRec = infoPtr = XAACreateInfoRec(); if (!infoPtr) return FALSE; @@ -293,9 +304,14 @@ TDFXAccelInit(ScreenPtr pScreen) pTDFX->PciCnt=TDFXReadLongMMIO(pTDFX, 0)&0x1F; pTDFX->PrevDrawState=pTDFX->DrawState=0; - pTDFX->ModeReg.srcbaseaddr=pTDFX->fbOffset; +#ifdef TDFX_DESKTOP_IS_TILED + tilebit = BIT(31); +#else + tilebit = 0; +#endif + pTDFX->ModeReg.srcbaseaddr = pTDFX->fbOffset | tilebit; TDFXWriteLongMMIO(pTDFX, SST_2D_SRCBASEADDR, pTDFX->ModeReg.srcbaseaddr); - pTDFX->ModeReg.dstbaseaddr=pTDFX->fbOffset; + pTDFX->ModeReg.dstbaseaddr = pTDFX->fbOffset | tilebit; TDFXWriteLongMMIO(pTDFX, SST_2D_DSTBASEADDR, pTDFX->ModeReg.dstbaseaddr); /* Initialize the register shadow */ @@ -436,11 +452,7 @@ TDFXSetupForScreenToScreenCopy(ScrnInfoPtr pScrn, int xdir, int ydir, int rop, "rop=%d planemask=%d trans_color=%d\n", xdir, ydir, rop, planemask, trans_color); pTDFX=TDFXPTR(pScrn); -#ifdef TDFX_DESKTOP_IS_TILED - stride = pTDFX->strideInTiles; -#else stride = pTDFX->stride; -#endif TDFXClearState(pScrn); if (trans_color!=-1) { @@ -510,11 +522,7 @@ TDFXSetupForSolidFill(ScrnInfoPtr pScrn, int color, int rop, TDFXTRACEACCEL("TDFXSetupForSolidFill color=%d rop=%d planemask=%d\n", color, rop, planemask); pTDFX=TDFXPTR(pScrn); -#ifdef TDFX_DESKTOP_IS_TILED - stride = pTDFX->strideInTiles; -#else stride = pTDFX->stride; -#endif TDFXClearState(pScrn); pTDFX->Cmd=TDFXROPCvt[rop]<<24; @@ -560,11 +568,7 @@ TDFXSetupForMono8x8PatternFill(ScrnInfoPtr pScrn, int patx, int paty, " bg=%d rop=%d planemask=%d\n", patx, paty, fg, bg, rop, planemask); pTDFX=TDFXPTR(pScrn); -#ifdef TDFX_DESKTOP_IS_TILED - stride = pTDFX->strideInTiles; -#else stride = pTDFX->stride; -#endif TDFXClearState(pScrn); pTDFX->Cmd = (TDFXROPCvt[rop+ROP_PATTERN_OFFSET]<<24) | @@ -811,11 +815,8 @@ TDFXSubsequentScreenToScreenColorExpandFill(ScrnInfoPtr pScrn, int x, int y, "x=%d y=%d w=%d h=%d srcx=%d srcy=%d offset=%d\n", x, y, w, h, srcx, srcy, offset); pTDFX=TDFXPTR(pScrn); -#ifdef TDFX_DESKTOP_IS_TILED - stride = pTDFX->strideInTiles; -#else stride = pTDFX->stride; -#endif + /* Don't bother resetting clip1 since we're changing it anyway */ pTDFX->DrawState&=~DRAW_STATE_CLIP1CHANGED; TDFXMatchState(pTDFX); @@ -876,16 +877,12 @@ TDFXSubsequentCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, int x, int y, int w, int h, int skipleft) { TDFXPtr pTDFX; - int fmt, stride; + int fmt, stride, src_stride, src_fmt; TDFXTRACEACCEL("SubsequentCPUToScreenColorExpandFill x=%d y=%d w=%d h=%d" " skipleft=%d\n", x, y, w, h, skipleft); pTDFX = TDFXPTR(pScrn); -#ifdef TDFX_DESKTOP_IS_TILED - stride = pTDFX->strideInTiles; -#else stride = pTDFX->stride; -#endif /* We're changing clip1 anyway, so don't bother to reset it */ pTDFX->DrawState&=~DRAW_STATE_CLIP1CHANGED; @@ -896,17 +893,20 @@ TDFXSubsequentCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, int x, int y, if (pTDFX->cpp==1) fmt=(1<<16)|stride; else fmt=((pTDFX->cpp+1)<<16)|stride; - pTDFX->scanlineWidth=w; + pTDFX->scanlineWidth = w; + src_stride = (((w + 31) /32) * 4) & 0x3fff; /* #src bytes */ + src_fmt = SST_2D_PIXFMT_1BPP | SST_2D_SOURCE_PACKING_DWORD | src_stride; TDFXMakeRoom(pTDFX, 8); DECLARE(SSTCP_CLIP1MIN|SSTCP_CLIP1MAX|SSTCP_SRCFORMAT| SSTCP_DSTFORMAT|SSTCP_DSTSIZE|SSTCP_SRCXY| SSTCP_DSTXY|SSTCP_COMMAND); TDFXWriteLong(pTDFX, SST_2D_DSTFORMAT, fmt); + pTDFX->sst2DDstFmtShadow = fmt; TDFXWriteLong(pTDFX, SST_2D_CLIP1MIN, ((y&0x1FFF)<<16)|(x&0x1FFF)); TDFXWriteLong(pTDFX, SST_2D_CLIP1MAX, (((y+h)&0x1FFF)<<16)|((x+w)&0x1FFF)); - TDFXWriteLong(pTDFX, SST_2D_SRCFORMAT, (((w+31)/32)*4) & 0x3FFF); - pTDFX->sst2DSrcFmtShadow = (((w+31)/32)*4) & 0x3FFF; + TDFXWriteLong(pTDFX, SST_2D_SRCFORMAT, src_fmt); + pTDFX->sst2DSrcFmtShadow = src_fmt; TDFXWriteLong(pTDFX, SST_2D_SRCXY, skipleft&0x1F); TDFXWriteLong(pTDFX, SST_2D_DSTSIZE, ((w-skipleft)&0x1FFF)|((h&0x1FFF)<<16)); TDFXWriteLong(pTDFX, SST_2D_DSTXY, ((x+skipleft)&0x1FFF) | ((y&0x1FFF)<<16)); @@ -922,16 +922,16 @@ static void TDFXSubsequentColorExpandScanline(ScrnInfoPtr pScrn, int bufno) TDFXTRACEACCEL("SubsequentColorExpandScanline bufno=%d\n", bufno); pTDFX = TDFXPTR(pScrn); - cnt=(pTDFX->scanlineWidth+31)/32; - pos=(CARD32 *)pTDFX->scanlineColorExpandBuffers[bufno]; - while (cnt>0) { - if (cnt>64) size=64; - else size=cnt; + cnt = (pTDFX->scanlineWidth+31)/32; /* #src words */ + pos = (CARD32 *) pTDFX->scanlineColorExpandBuffers[bufno]; + while (cnt > 0) { + if (cnt > 64) size = 64; + else size = cnt; TDFXMakeRoom(pTDFX, size); DECLARE_LAUNCH(size, 0); - for (i=0; i<size; i++, pos++) { + for (i = 0; i < size; i++, pos++) { TDFXWriteLong(pTDFX, SST_2D_LAUNCH, *pos); } - cnt-=size; + cnt -= size; } } diff --git a/xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx_driver.c b/xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx_driver.c index c00e3f1e2..bc3754b26 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx_driver.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx_driver.c @@ -137,12 +137,13 @@ static void TDFXDisplayPowerManagementSet(ScrnInfoPtr pScrn, int PowerManagermentMode, int flags); #endif +static int calcBufferStrideInTiles(int xres, int cpp); +static int calcBufferStrideInBytes(int xres, Bool tiled, int cpp); + + #define PCI_SUBDEVICE_ID_VOODOO3_2000 0x0036 #define PCI_SUBDEVICE_ID_VOODOO3_3000 0x003a -#define TILE_WIDTH 128 -#define TILE_HEIGHT 32 - DriverRec TDFX = { TDFX_VERSION, TDFX_DRIVER_NAME, @@ -678,7 +679,7 @@ TDFXPreInit(ScrnInfoPtr pScrn, int flags) { TDFXPtr pTDFX; ClockRangePtr clockRanges; - int i, pitchIncr; + int nfound, pitchIncr, foundTiledPitch, resultingPitch; MessageType from; int flags24; rgb defaultWeight = {0, 0, 0}; @@ -788,8 +789,6 @@ TDFXPreInit(ScrnInfoPtr pScrn, int flags) /* We use a programamble clock */ pScrn->progClock = TRUE; - pTDFX->cpp = pScrn->bitsPerPixel/8; - #ifdef XF86DRI /* * We don't start out in full screen mode. @@ -1119,25 +1118,60 @@ TDFXPreInit(ScrnInfoPtr pScrn, int flags) clockRanges->doubleScanAllowed = TRUE; #ifdef TDFX_DESKTOP_IS_TILED - pitchIncr = TILE_WIDTH * 8; /* width of tile in bits */ + pTDFX->desktopIsTiled = 1; #else - pitchIncr = 16 * pScrn->bitsPerPixel; /* pitch is multiple of 16 pixels */ + pTDFX->desktopIsTiled = 0; #endif - i = xf86ValidateModes(pScrn, pScrn->monitor->Modes, + + /* Compute cpp */ + pTDFX->cpp = pScrn->bitsPerPixel / 8; + + /* + * Call xf86ValidateModes to cause pScrn->displayWidth to be computed. + * Pass a "pitch increment" arg to force stride to be aligned properly. + */ + if (pTDFX->desktopIsTiled) { + pitchIncr = SST_MIN_SGRAM_TILE_STRIDE * 8; /* #bits in min allowed stride */ + } else { + pitchIncr = 16 * pScrn->bitsPerPixel; /* pitch will be multiple of 16 pixels */ + } + + foundTiledPitch = 0; + do { + nfound = xf86ValidateModes(pScrn, pScrn->monitor->Modes, pScrn->display->modes, clockRanges, 0, 320, 2048, pitchIncr, /* (*lnPitches), minPitch, maxPitch, incr */ 200, 1536, /* minHeight, maxHeight */ - pScrn->virtualX, pScrn->virtualY, + 0, 0, /* requested virtX, virtY */ pTDFX->FbMapSize, LOOKUP_BEST_REFRESH); + if (nfound > 0 && pTDFX->desktopIsTiled) { + int validPitch; + + /* + * Check that pScrn->displayWidth is one of 1K, 2K,4K, 8K, 16K. + * If not, multiply pitchIncr by 2 and keep going. + */ + pitchIncr <<= 1; + resultingPitch = pScrn->displayWidth * pTDFX->cpp; + for (validPitch = SST_MIN_SGRAM_TILE_STRIDE; + validPitch <= SST_MAX_SGRAM_TILE_STRIDE; validPitch <<= 1) { + if (resultingPitch == validPitch) { + foundTiledPitch = 1; + break; + } + } + } + } while (pTDFX->desktopIsTiled && nfound > 0 && !foundTiledPitch + && resultingPitch <= SST_MAX_SGRAM_TILE_STRIDE); - if (i==-1) { + if (nfound == -1) { TDFXFreeRec(pScrn); return FALSE; } xf86PruneDriverModes(pScrn); - if (!i || !pScrn->modes) { + if (!nfound || !pScrn->modes) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "No valid modes found\n"); TDFXFreeRec(pScrn); return FALSE; @@ -1149,7 +1183,7 @@ TDFXPreInit(ScrnInfoPtr pScrn, int flags) xf86PrintModes(pScrn); - xf86SetDpi(pScrn, 0, 0); + xf86SetDpi(pScrn, 0, 0); if (!xf86LoadSubModule(pScrn, "fb")) { TDFXFreeRec(pScrn); @@ -1281,7 +1315,7 @@ PrintRegisters(ScrnInfoPtr pScrn, TDFXRegPtr regs) outb(VGA_REG(0x3C4), i); ErrorF("Sequencer[%d]=%d versus %d\n", i, inb(VGA_REG(0x3C5)), regs->std.Sequencer[i]); } -#endif +#endif /* 0 */ #if 1 ErrorF("Banshee Registers\n"); ErrorF("VidCfg = %x versus %x\n", pTDFX->readLong(pTDFX, VIDPROCCFG), regs->vidcfg); @@ -1297,8 +1331,8 @@ PrintRegisters(ScrnInfoPtr pScrn, TDFXRegPtr regs) ErrorF("Input Status 1 = %x\n", pTDFX->readLong(pTDFX, 0xda)); ErrorF("2D Status = %x\n", pTDFX->readLong(pTDFX, SST_2D_OFFSET)); ErrorF("3D Status = %x\n", pTDFX->readLong(pTDFX, SST_3D_OFFSET)); -#endif -#endif +#endif /* 1 */ +#endif /* TRACE */ } /* @@ -1540,13 +1574,10 @@ TDFXInitVGA(ScrnInfoPtr pScrn) tdfxReg->vidcfg = SST_VIDEO_PROCESSOR_EN | SST_CURSOR_X11 | SST_DESKTOP_EN | (pTDFX->cpp-1)<<SST_DESKTOP_PIXEL_FORMAT_SHIFT; + if (pTDFX->desktopIsTiled) + tdfxReg->vidcfg |= BIT(24); /* desktop tile space enable */ -#ifdef TDFX_DESKTOP_IS_TILED - tdfxReg->vidcfg |= BIT(24); /* desktop tile space enable */ - tdfxReg->stride = pTDFX->strideInTiles; -#else tdfxReg->stride = pTDFX->stride; -#endif tdfxReg->clip0min = tdfxReg->clip1min = 0; tdfxReg->clip0max = tdfxReg->clip1max = pTDFX->maxClip; @@ -1970,15 +2001,12 @@ static Bool allocateMemory(ScrnInfoPtr pScrn) hwcursMemSize = 4096; pTDFX->fbHeight = pScrn->virtualY + PIXMAP_CACHE_LINES; - pTDFX->strideInTiles = calcBufferStrideInTiles(pScrn->displayWidth, pTDFX->cpp); -#ifdef TDFX_DESKTOP_IS_TILED - pTDFX->stride = pTDFX->strideInTiles * TILE_WIDTH; - height = calcBufferHeightInTiles(pTDFX->fbHeight) * TILE_HEIGHT; -#else - pTDFX->stride = pScrn->displayWidth * pTDFX->cpp; - height = pTDFX->fbHeight; -#endif /* TDFX_DESKTOP_IS_TILED */ - pTDFX->fbSize = height * pTDFX->stride; + if (pTDFX->desktopIsTiled) { + height = calcBufferHeightInTiles(pTDFX->fbHeight) * TILE_HEIGHT; + } else { + height = pTDFX->fbHeight; + } + pTDFX->fbSize = height * pTDFX->strideInBytes; /* * Figure out how many buffers of each type we need, @@ -2114,8 +2142,7 @@ static Bool allocateMemory(ScrnInfoPtr pScrn) "Cannot allocate front buffer\n"); return(FALSE); } - pTDFX->fbOffset - = (pTDFX->backOffset - (pTDFX->fbHeight)*pTDFX->stride) &~ 0xFFF; + pTDFX->fbOffset = (pTDFX->backOffset - pTDFX->fbSize) &~ 0xfff; /* We give 4096 bytes to the cursor, fifoSize to the */ /* FIFO, and everything to textures. */ texSize = pTDFX->fbOffset - fifoSize - hwcursMemSize; @@ -2137,10 +2164,20 @@ static Bool allocateMemory(ScrnInfoPtr pScrn) "Texture Offset: [0x%08X, 0x%08X)\n", pTDFX->texOffset, pTDFX->texOffset + texSize); +#if defined(TDFX_DESKTOP_IS_TILED) + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Tile Mark: 0x%08X\n", + pTDFX->fbOffset); +#endif /* defined(TDFX_DESKTOP_IS_TILED) */ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Front Buffer Offset: [0x%08X, 0x%08X)\n", pTDFX->fbOffset, pTDFX->fbOffset + pTDFX->fbSize); +#if !defined(TDFX_DESKTOP_IS_TILED) + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Tile Mark: 0x%08X\n", + pTDFX->backOffset); +#endif /* defined(TDFX_DESKTOP_IS_TILED) */ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "BackOffset: [0x%08X, 0x%08X)\n", pTDFX->backOffset, @@ -2177,6 +2214,24 @@ TDFXScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) { vgaHWGetIOBase(hwp); if (!vgaHWMapMem(pScrn)) return FALSE; + /* Find strideInBytes, dependant on whether desktop is tiled */ + pTDFX->strideInBytes = calcBufferStrideInBytes(pScrn->virtualX, + pTDFX->desktopIsTiled, pTDFX->cpp); + /* strideInTiles needed for back & depth buf, even if desktop isn't tiled */ + pTDFX->strideInTiles = calcBufferStrideInTiles(pScrn->virtualX, pTDFX->cpp); + /* + * Compute mapped stride, for XAA. (1K, 2K, etc.) + * Also find pTDFX->stride for WAX, either in units of bytes or tiles. + */ + if (pTDFX->desktopIsTiled) { + pTDFX->stride = pTDFX->strideInTiles; + pTDFX->mappedStride = + TDFXComputeTileAperturePitch(pTDFX, &pTDFX->lg2TileAperturePitch); + } else { + pTDFX->stride = pTDFX->strideInBytes; + pTDFX->mappedStride = pTDFX->strideInBytes; + } + if (!allocateMemory(pScrn)) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, @@ -2193,7 +2248,7 @@ TDFXScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) { return FALSE; } - maxy=pTDFX->fbHeight; + maxy = pTDFX->fbHeight; MemBox.y1 = pScrn->virtualY; MemBox.x1 = 0; MemBox.x2 = pScrn->displayWidth; @@ -2357,7 +2412,7 @@ TDFXAdjustFrame(int scrnIndex, int x, int y, int flags) { pScrn = xf86Screens[scrnIndex]; pTDFX = TDFXPTR(pScrn); tdfxReg = &pTDFX->ModeReg; - tdfxReg->startaddr = pTDFX->fbOffset+y*pTDFX->stride+(x*pTDFX->cpp); + tdfxReg->startaddr = pTDFX->fbOffset + (y*pTDFX->strideInBytes) + (x*pTDFX->cpp); TDFXTRACE("TDFXAdjustFrame to x=%d y=%d offset=%d\n", x, y, tdfxReg->startaddr); pTDFX->writeLong(pTDFX, VIDDESKTOPSTARTADDR, tdfxReg->startaddr); } diff --git a/xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx_priv.c b/xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx_priv.c index f94d1c698..6abea740c 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx_priv.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx_priv.c @@ -20,7 +20,7 @@ C - D-1 : Z buffer */ -void TDFXSendNOPFifo3D(ScrnInfoPtr pScrn) +static void TDFXSendNOPFifo3D(ScrnInfoPtr pScrn) { TDFXPtr pTDFX; @@ -30,7 +30,7 @@ void TDFXSendNOPFifo3D(ScrnInfoPtr pScrn) WRITE_FIFO(pTDFX, 0, 0); } -void TDFXSendNOPFifo2D(ScrnInfoPtr pScrn) +static void TDFXSendNOPFifo2D(ScrnInfoPtr pScrn) { TDFXPtr pTDFX; @@ -50,7 +50,7 @@ void TDFXSendNOPFifo(ScrnInfoPtr pScrn) TDFXSendNOPFifo3D(pScrn); } -void InstallFifo(ScrnInfoPtr pScrn) +static void InstallFifo(ScrnInfoPtr pScrn) { TDFXPtr pTDFX; @@ -115,7 +115,7 @@ void InstallFifo(ScrnInfoPtr pScrn) TDFXSendNOPFifo(pScrn); } -void TDFXResetFifo(ScrnInfoPtr pScrn) +static void TDFXResetFifo(ScrnInfoPtr pScrn) { TDFXPtr pTDFX; int oldValue; diff --git a/xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx_sli.c b/xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx_sli.c index fb418bb3a..f611d756c 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx_sli.c +++ b/xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx_sli.c @@ -41,8 +41,8 @@ Bool TDFXDisableSLI(ScrnInfoPtr pScrn) * to wait until now to change this. */ pTDFX->isFullScreen = FALSE; -#if 0 - DoRestore(pScrn, &hwp->SavedReg, &pTDFX->SavedReg, TRUE); + + DoRestore(pScrn, &pTDFX->prevMode, &pTDFX->ModeReg, FALSE); for (i=0; i<pTDFX->numChips; i++) { pTDFX->writeChipLong(pTDFX, i, SST_3D_SLICTRL, 0); @@ -76,10 +76,10 @@ Bool TDFXDisableSLI(ScrnInfoPtr pScrn) pciWriteLong(pTDFX->PciTag[i], CFG_VIDEO_CTRL2, 0); } - v=pTDFX->readChipLong(pTDFX, i, PCIINIT0); - v = (v &~ (SST_PCI_DISABLE_MEM + v = pTDFX->readChipLong(pTDFX, i, PCIINIT0); + v &= ~(SST_PCI_DISABLE_MEM | SST_PCI_RETRY_INTERVAL - | SST_PCI_DISABLE_IO)); + | SST_PCI_DISABLE_IO); /* * Note: SST_PCI_DISABLE_IO should really be named * SST_PCI_DISABLE_IO_RETRIES. @@ -92,7 +92,6 @@ Bool TDFXDisableSLI(ScrnInfoPtr pScrn) } } VidModeSwitchMode(pScrn->scrnIndex, pScrn->currentMode); -#endif /* 0 */ TDFXInitFifo(pScrn->pScreen); return TRUE; } diff --git a/xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfxdefs.h b/xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfxdefs.h index 8739294c5..44add66d4 100644 --- a/xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfxdefs.h +++ b/xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfxdefs.h @@ -68,12 +68,14 @@ * * FWIW, the right hand column is log2(left hand column)-10 */ -#define SST_RAW_LFB_ADDR_STRIDE_SHIFT 13 +#define SST_MIN_SGRAM_TILE_STRIDE 1024 +#define SST_MAX_SGRAM_TILE_STRIDE 16384 +#define SST_RAW_LFB_ADDR_STRIDE_SHIFT 13 #define SST_RAW_LFB_ADDR_STRIDE(Lg2SizeInK) \ ((Lg2SizeInK)<<SST_RAW_LFB_ADDR_STRIDE_SHIFT) -#define SST_RAW_LFB_ADDR_STRIDE_4K SST_RAW_LFB_ADDR_STRIDE(2) -#define SST_RAW_LFB_ADDR_STRIDE_8K SST_RAW_LFB_ADDR_STRIDE(3) -#define SST_RAW_LFB_ADDR_STRIDE_16K SST_RAW_LFB_ADDR_STRIDE(4) +#define SST_RAW_LFB_ADDR_STRIDE_4K SST_RAW_LFB_ADDR_STRIDE(2) +#define SST_RAW_LFB_ADDR_STRIDE_8K SST_RAW_LFB_ADDR_STRIDE(3) +#define SST_RAW_LFB_ADDR_STRIDE_16K SST_RAW_LFB_ADDR_STRIDE(4) #define SST_RAW_LFB_TILE_STRIDE_SHIFT 16 #define BLIT_LEFT 1 |