summaryrefslogtreecommitdiff
path: root/xc
diff options
context:
space:
mode:
Diffstat (limited to 'xc')
-rw-r--r--xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx.h14
-rw-r--r--xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx_accel.c126
-rw-r--r--xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx_driver.c123
-rw-r--r--xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx_priv.c8
-rw-r--r--xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx_sli.c11
-rw-r--r--xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfxdefs.h10
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