summaryrefslogtreecommitdiff
path: root/src/mesa/drivers/dri/savage/savage_3d_reg.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa/drivers/dri/savage/savage_3d_reg.h')
-rw-r--r--src/mesa/drivers/dri/savage/savage_3d_reg.h1063
1 files changed, 1063 insertions, 0 deletions
diff --git a/src/mesa/drivers/dri/savage/savage_3d_reg.h b/src/mesa/drivers/dri/savage/savage_3d_reg.h
new file mode 100644
index 0000000000..b56a9004f3
--- /dev/null
+++ b/src/mesa/drivers/dri/savage/savage_3d_reg.h
@@ -0,0 +1,1063 @@
+/*
+ * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved.
+ * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sub license,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
+ * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+
+#ifndef SAVAGE_3D_REG_H
+#define SAVAGE_3D_REG_H
+
+#define uint32 unsigned long
+#define uint16 unsigned short
+
+#define VIDEO_MEM_ADR 0x02
+#define SYSTEM_MEM_ADR 0x01
+#define AGP_MEM_ADR 0x03
+
+/***********************************************************
+
+ ----------- 3D ENGINE UNIT Registers -------------
+
+ *********************************************************/
+
+typedef union
+{
+ struct
+ {
+ unsigned int reserved : 4;
+ unsigned int ofs : 28;
+ }ni;
+ unsigned int ui;
+} Reg_ZPixelOffset;
+
+typedef union
+{
+ /* This reg exists only on Savage4. */
+ struct
+ {
+ unsigned int cmpFunc : 3;
+ unsigned int stencilEn : 1;
+ unsigned int readMask : 8;
+ unsigned int writeMask : 8;
+ unsigned int failOp : 3;
+ unsigned int passZfailOp : 3;
+ unsigned int passZpassOp : 3;
+ unsigned int reserved : 3;
+ }ni;
+ unsigned int ui;
+} Reg_StencilCtrl;
+
+/**************************
+ Texture Registers
+**************************/
+typedef union
+{
+ /* The layout of this reg differs between Savage4 and Savage3D. */
+ struct
+ {
+ unsigned int tex0Width : 4;
+ unsigned int tex0Height : 4;
+ unsigned int tex0Fmt : 4;
+ unsigned int tex1Width : 4;
+ unsigned int tex1Height : 4;
+ unsigned int tex1Fmt : 4;
+ unsigned int texBLoopEn : 1;
+ unsigned int tex0En : 1;
+ unsigned int tex1En : 1;
+ unsigned int orthProjEn : 1;
+ unsigned int reserved : 1;
+ unsigned int palSize : 2;
+ unsigned int newPal : 1;
+ }s4;
+ struct
+ {
+ unsigned int texWidth : 4;
+ unsigned int reserved1 : 4;
+ unsigned int texHeight : 4;
+ unsigned int reserved2 : 4;
+ /* Savage3D supports only the first 8 texture formats defined in
+ enum TexFmt in savge_bci.h. */
+ unsigned int texFmt : 3;
+ unsigned int palSize : 2;
+ unsigned int reserved3 : 10;
+ unsigned int newPal : 1;
+ }s3d;
+ unsigned int ui;
+} Reg_TexDescr;
+
+typedef union
+{
+ /* The layout of this reg is the same on Savage4 and Savage3D,
+ but the Savage4 has two of them, Savage3D has only one. */
+ struct
+ {
+ unsigned int inSysTex : 1;
+ unsigned int inAGPTex : 1;
+ unsigned int reserved : 1;
+ unsigned int addr : 29;
+ }ni;
+ unsigned int ui;
+} Reg_TexAddr;
+
+typedef union
+{
+ /* The layout of this reg is the same on Savage4 and Savage3D,
+ but the Savage4 has two of them, Savage3D has only one. */
+ struct
+ {
+ unsigned int reserved : 3;
+ unsigned int addr : 29;
+ }ni;
+ unsigned int ui;
+} Reg_TexPalAddr;
+
+typedef union
+{
+ /* The layout of this reg on Savage4 and Savage3D are very similar. */
+ struct
+ {
+ unsigned int xprClr0 : 16;
+ unsigned int xprClr1 : 16; /* this is reserved on Savage3D */
+ }ni;
+ unsigned int ui;
+} Reg_TexXprClr; /* transparency color in RGB565 format*/
+
+typedef union
+{
+ /* The layout of this reg differs between Savage4 and Savage3D.
+ * Savage4 has two of them, Savage3D has only one. */
+ struct
+ {
+ unsigned int filterMode : 2;
+ unsigned int mipmapEnable : 1;
+ unsigned int dBias : 9;
+ unsigned int dMax : 4;
+ unsigned int uMode : 2;
+ unsigned int vMode : 2;
+ unsigned int useDFraction : 1;
+ unsigned int texXprEn : 1;
+ unsigned int clrBlendAlphaSel : 2;
+ unsigned int clrArg1CopyAlpha : 1;
+ unsigned int clrArg2CopyAlpha : 1;
+ unsigned int clrArg1Invert : 1;
+ unsigned int clrArg2Invert : 1;
+ unsigned int alphaBlendAlphaSel : 2;
+ unsigned int alphaArg1Invert : 1;
+ unsigned int alphaArg2Invert : 1;
+ }s4;
+ struct
+ {
+ unsigned int filterMode : 2;
+ unsigned int mipmapDisable : 1;
+ unsigned int dBias : 9;
+ unsigned int uWrapEn : 1;
+ unsigned int vWrapEn : 1;
+ unsigned int wrapMode : 2;
+ unsigned int texEn : 1;
+ unsigned int useDFraction : 1;
+ unsigned int reserved1 : 1;
+ /* Color Compare Alpha Blend Control
+ 0 - reduce dest alpha to 0 or 1
+ 1 - blend with destination
+ The Utah-Driver doesn't know how to use it and sets it to 0. */
+ unsigned int CCA : 1;
+ unsigned int texXprEn : 1;
+ unsigned int reserved2 : 11;
+ }s3d;
+ unsigned int ui;
+} Reg_TexCtrl;
+
+typedef union
+{
+ /* This reg exists only on Savage4. */
+ struct
+ {
+ unsigned int colorArg1Sel : 2;
+ unsigned int colorArg2Sel : 3;
+ unsigned int colorInvAlphaEn : 1;
+ unsigned int colorInvArg2En : 1;
+ unsigned int colorPremodSel : 1;
+ unsigned int colorMod1Sel : 1;
+ unsigned int colorMod2Sel : 2;
+ unsigned int colorAddSel : 2;
+ unsigned int colorDoBlend : 1;
+ unsigned int colorDo2sCompl : 1;
+ unsigned int colorAddBiasEn : 1;
+ unsigned int alphaArg1Sel : 2;
+ unsigned int alphaArg2Sel : 3;
+ unsigned int alphaMod1Sel : 1;
+ unsigned int alphaMod2Sel : 2;
+ unsigned int alphaAdd0Sel : 1;
+ unsigned int alphaDoBlend : 1;
+ unsigned int alphaDo2sCompl : 1;
+ unsigned int colorStageClamp : 1;
+ unsigned int alphaStageClamp : 1;
+ unsigned int colorDoDiffMul : 1;
+ unsigned int LeftShiftVal : 2;
+ }ni;
+ unsigned int ui;
+} Reg_TexBlendCtrl;
+
+typedef union
+{
+ /* This reg exists only on Savage4. */
+ struct
+ {
+ unsigned int blue : 8;
+ unsigned int green : 8;
+ unsigned int red : 8;
+ unsigned int alpha : 8;
+ }ni;
+ unsigned int ui;
+} Reg_TexBlendColor;
+
+/********************************
+ Tiled Surface Registers
+**********************************/
+
+typedef union
+{
+ struct
+ {
+ unsigned int frmBufOffset : 13;
+ unsigned int reserved : 12;
+ unsigned int widthInTile : 6;
+ unsigned int bitPerPixel : 1;
+ }ni;
+ unsigned int ui;
+} Reg_TiledSurface;
+
+/********************************
+ Draw/Shading Control Registers
+**********************************/
+
+typedef union
+{
+ /* This reg exists only on Savage4. */
+ struct
+ {
+ unsigned int scissorXStart : 11;
+ unsigned int DPerfAccelEn : 1;
+ unsigned int scissorYStart : 12;
+ unsigned int alphaRefVal : 8;
+ }ni;
+ unsigned int ui;
+} Reg_DrawCtrl0;
+
+typedef union
+{
+ /* This reg exists only on Savage4. */
+ struct
+ {
+ unsigned int scissorXEnd : 11;
+ unsigned int XYOffsetEn : 1;
+ unsigned int scissorYEnd : 12;
+ unsigned int ditherEn : 1;
+ unsigned int nonNormTexCoord : 1;
+ unsigned int cullMode : 2;
+ unsigned int alphaTestCmpFunc : 3;
+ unsigned int alphaTestEn : 1;
+ }ni;
+ unsigned int ui;
+} Reg_DrawCtrl1;
+
+typedef union
+{
+ /* This reg exists only on Savage4. */
+ struct
+ {
+ unsigned int dstAlphaMode : 3;
+ unsigned int DstMinusSrc : 1;
+ unsigned int srcAlphaMode : 3;
+ unsigned int binaryFinalAlpha : 1;
+ unsigned int dstAlphaModeHighBit : 1;
+ unsigned int srcAlphaModeHighBit : 1;
+ unsigned int reserved1 : 15;
+ unsigned int wrZafterAlphaTst : 1;
+ unsigned int drawUpdateEn : 1;
+ unsigned int zUpdateEn : 1;
+ unsigned int flatShadeEn : 1;
+ unsigned int specShadeEn : 1;
+ unsigned int flushPdDestWrites : 1;
+ unsigned int flushPdZbufWrites : 1;
+ }ni;
+ unsigned int ui;
+} Reg_DrawLocalCtrl;
+
+typedef union
+{
+ /* This reg exists only on Savage3D. */
+ struct
+ {
+ unsigned int ditherEn : 1;
+ unsigned int XYOffsetEn : 1;
+ unsigned int cullMode : 2;
+ unsigned int vertexCountReset : 1;
+ unsigned int flatShadeEn : 1;
+ unsigned int specShadeEn : 1;
+ unsigned int dstAlphaMode : 3;
+ unsigned int srcAlphaMode : 3;
+ unsigned int reserved1 : 1;
+ unsigned int alphaTestCmpFunc : 3;
+ unsigned int alphaTestEn : 1;
+ unsigned int alphaRefVal : 8;
+ unsigned int texBlendCtrl : 3;
+ unsigned int flushPdDestWrites : 1;
+ unsigned int flushPdZbufWrites : 1;
+ /* havn't found an equivalent for Savage4. Utah-driver sets it to 0. */
+ unsigned int interpMode : 1;
+ }ni;
+ unsigned int ui;
+} Reg_DrawCtrl;
+
+#define SAVAGETBC_DECAL_S3D 0
+#define SAVAGETBC_MODULATE_S3D 1
+#define SAVAGETBC_DECALALPHA_S3D 2
+#define SAVAGETBC_MODULATEALPHA_S3D 3
+#define SAVAGETBC_4_S3D 4
+#define SAVAGETBC_5_S3D 5
+#define SAVAGETBC_COPY_S3D 6
+#define SAVAGETBC_7_S3D 7
+
+typedef union
+{
+ /* This reg exists only on Savage3D. */
+ struct
+ {
+ unsigned int scissorXStart : 11;
+ unsigned int reserved1 : 5;
+ unsigned int scissorYStart : 11;
+ unsigned int reserved2 : 5;
+ } ni;
+ unsigned int ui;
+} Reg_ScissorsStart;
+
+typedef union
+{
+ /* This reg exists only on Savage3D. */
+ struct
+ {
+ unsigned int scissorXEnd : 11;
+ unsigned int reserved1 : 5;
+ unsigned int scissorYEnd : 11;
+ unsigned int reserved2 : 5;
+ } ni;
+ unsigned int ui;
+} Reg_ScissorsEnd;
+
+/********************************
+ Address Registers
+**********************************/
+
+typedef union
+{
+ /* I havn't found a Savage3D equivalent of this reg in the Utah-driver.
+ * But Tim Roberts claims that the Savage3D supports DMA vertex and
+ * command buffers. */
+ struct
+ {
+ unsigned int isSys : 1;
+ unsigned int isAGP : 1;
+ unsigned int reserved : 1;
+ unsigned int addr : 29; /*quad word aligned*/
+ }ni;
+ unsigned int ui;
+} Reg_VertBufAddr;
+
+typedef union
+{
+ /* I havn't found a Savage3D equivalent of this reg in the Utah-driver.
+ * But Tim Roberts claims that the Savage3D supports DMA vertex and
+ * command buffers. */
+ struct
+ {
+ unsigned int isSys : 1;
+ unsigned int isAGP : 1;
+ unsigned int reserved : 1;
+ unsigned int addr : 29; /*4-quad word aligned*/
+ }ni;
+ unsigned int ui;
+} Reg_DMABufAddr;
+
+/********************************
+ H/W Debug Registers
+**********************************/
+typedef union
+{
+ /* The layout of this reg is the same on Savage4 and Savage3D. */
+ struct
+ {
+ unsigned int y01 : 1;
+ unsigned int y12 : 1;
+ unsigned int y20 : 1;
+ unsigned int u01 : 1;
+ unsigned int u12 : 1;
+ unsigned int u20 : 1;
+ unsigned int v01 : 1;
+ unsigned int v12 : 1;
+ unsigned int v20 : 1;
+ unsigned int cullEn : 1;
+ unsigned int cullOrient : 1;
+ unsigned int loadNewTex : 1;
+ unsigned int loadNewPal : 1;
+ unsigned int doDSetup : 1;
+ unsigned int reserved : 17;
+ unsigned int kickOff : 1;
+ }ni;
+ unsigned int ui;
+} Reg_Flag;
+
+/********************************
+ Z Buffer Registers -- Global
+**********************************/
+
+typedef union
+{
+ /* The layout of this reg differs between Savage4 and Savage3D. */
+ struct
+ {
+ unsigned int zCmpFunc : 3;
+ unsigned int reserved1 : 2;
+ unsigned int zBufEn : 1;
+ unsigned int reserved2 : 1;
+ unsigned int zExpOffset : 8;
+ unsigned int reserved3 : 1;
+ unsigned int stencilRefVal : 8;
+ unsigned int autoZEnable : 1;
+ unsigned int frameID : 1;
+ unsigned int reserved4 : 4;
+ unsigned int floatZEn : 1;
+ unsigned int wToZEn : 1;
+ }s4;
+ struct {
+ unsigned int zCmpFunc : 3;
+ unsigned int drawUpdateEn : 1;
+ unsigned int zUpdateEn : 1;
+ unsigned int zBufEn : 1;
+ unsigned int reserved1 : 2;
+ unsigned int zExpOffset : 8;
+ unsigned int wrZafterAlphaTst : 1;
+ unsigned int reserved2 : 15;
+ }s3d;
+ GLuint ui;
+}Reg_ZBufCtrl;
+
+typedef union
+{
+ /* The layout of this reg on Savage4 and Savage3D are very similar. */
+ struct
+ {
+ /* In the Utah-Driver the offset is defined as 13-bit, 2k-aligned. */
+ unsigned int offset : 14;
+ unsigned int reserved : 11; /* 12-bits in Utah-driver */
+ unsigned int zBufWidthInTiles : 6;
+ unsigned int zDepthSelect : 1;
+ }ni;
+ unsigned int ui;
+} Reg_ZBufOffset;
+
+typedef union
+{
+ /* The layout of this reg is the same on Savage4 and Savage3D. */
+ struct
+ {
+ unsigned int rLow : 6;
+ unsigned int reserved1 : 2;
+ unsigned int rHigh : 6;
+ unsigned int reserved2 : 2;
+ unsigned int wLow : 6;
+ unsigned int reserved3 : 2;
+ unsigned int wHigh : 6;
+ unsigned int reserved4 : 2;
+ }ni;
+ unsigned int ui;
+} Reg_ZWatermarks;
+
+/********************************
+ Fog Registers -- Global
+**********************************/
+typedef union
+{
+ /* The layout of this reg is the same on Savage4 and Savage3D. */
+ struct
+ {
+ unsigned int fogClr : 24;
+ unsigned int expShift : 3;
+ unsigned int reserved : 1;
+ unsigned int fogEn : 1;
+ unsigned int fogMode : 1;
+ unsigned int fogEndShift : 2;
+ }ni;
+ unsigned int ui;
+}Reg_FogCtrl;
+
+typedef struct
+{
+ /* According to the Utah-driver the fog table has 64 entries on
+ Savage3D. Savage4 uses only 32 entries. */
+ union
+ {
+ unsigned char ucEntry[64];
+ uint32 ulEntry[16];
+ }ni;
+} Reg_FogTable;
+
+/*not in spec, but tempo for pp and driver*/
+typedef union
+{
+ struct
+ {
+ unsigned int fogDensity : 16;
+ unsigned int fogStart : 16;
+ }ni;
+ unsigned int ui;
+}Reg_FogParam;
+
+/**************************************
+ Destination Buffer Registers -- Global
+***************************************/
+
+typedef union
+{
+ /* The layout of this reg on Savage4 and Savage3D are very similar. */
+ struct
+ {
+ unsigned int dstWidthInTile : 7;
+ unsigned int reserved : 1;
+ /* In the Utah-Driver the offset is defined as 13-bit, 2k-aligned. */
+ unsigned int offset : 14;
+ unsigned int reserved1 : 7;
+ /* antiAliasMode does not exist in the Utah-driver. But it includes the
+ * high bit of this in the destPixFmt. However, only values 0 and 2
+ * are used as dstPixFmt, so antiAliasMode is effectively always 0
+ * in the Utah-driver. In other words, treat as reserved on SavageIX.*/
+ unsigned int antiAliasMode : 2;
+ unsigned int dstPixFmt : 1;
+ }ni;
+ unsigned int ui;
+}Reg_DestCtrl;
+
+typedef union
+{
+ /* The layout of this reg on Savage4 and Savage3D are very similar. */
+ struct
+ {
+ unsigned int destReadLow : 6;
+ unsigned int destReadHigh : 6;
+ unsigned int destWriteLow : 6;
+ unsigned int destWriteHigh : 6;
+ unsigned int texRead : 4;
+ unsigned int reserved4 : 2;
+ /* The Utah-driver calls this pixel FIFO length:
+ * 00 - 240, 01 - 180, 10 - 120, 11 - 60
+ * However, it is not used in either driver. */
+ unsigned int destFlush : 2;
+ }ni;
+ unsigned int ui;
+}Reg_DestTexWatermarks;
+
+typedef struct _REGISTERS_
+{
+ union
+ {
+ struct
+ {
+ unsigned int fDrawLocalCtrlChanged : 1;
+ unsigned int fTexPalAddrChanged : 1;
+ unsigned int fTex0CtrlChanged : 1;
+ unsigned int fTex1CtrlChanged : 1;
+
+ unsigned int fTex0AddrChanged : 1;
+ unsigned int fTex1AddrChanged : 1;
+ unsigned int fTex0BlendCtrlChanged : 1;
+ unsigned int fTex1BlendCtrlChanged : 1;
+
+ unsigned int fTexXprClrChanged : 1;
+ unsigned int fTexDescrChanged : 1;
+ unsigned int fFogTableChanged : 1;
+ unsigned int fFogCtrlChanged : 1;
+
+ unsigned int fStencilCtrlChanged : 1;
+ unsigned int fZBufCtrlChanged : 1;
+ unsigned int fZBufOffsetChanged : 1;
+ unsigned int fDestCtrlChanged : 1;
+
+ unsigned int fDrawCtrl0Changed : 1;
+ unsigned int fDrawCtrl1Changed : 1;
+ unsigned int fZWatermarksChanged : 1;
+ unsigned int fDestTexWatermarksChanged : 1;
+
+ unsigned int fTexBlendColorChanged : 1;
+ unsigned int fDrawCtrlChanged : 1;
+ unsigned int fScissorsStartChanged : 1;
+ unsigned int fScissorsEndChanged : 1;
+
+ unsigned int fScissorsChanged : 1; /* doesn't correspond to
+ a real register. */
+
+ unsigned int fReserved : 7;
+ }ni;
+ GLuint uiRegistersChanged;
+ }changed;
+
+ Reg_DrawLocalCtrl DrawLocalCtrl; /* Savage4 only */
+
+ Reg_TexPalAddr TexPalAddr;
+ Reg_TexCtrl TexCtrl[2]; /* Savage3D uses only one */
+ Reg_TexAddr TexAddr[2]; /* Savage3D uses only one */
+ Reg_TexBlendCtrl TexBlendCtrl[2]; /* Savage4 only */
+
+ Reg_TexXprClr TexXprClr;
+ Reg_TexDescr TexDescr;
+
+ Reg_FogTable FogTable; /* Savage4 uses only 32 entries */
+
+ Reg_FogCtrl FogCtrl;
+
+ Reg_StencilCtrl StencilCtrl; /* Savage4 only */
+ Reg_ZBufCtrl ZBufCtrl;
+ Reg_ZBufOffset ZBufOffset;
+ Reg_DestCtrl DestCtrl;
+ Reg_DrawCtrl0 DrawCtrl0; /* Savage4 only */
+ Reg_DrawCtrl1 DrawCtrl1; /* Savage4 only */
+ Reg_ZWatermarks ZWatermarks;
+ Reg_DestTexWatermarks DestTexWatermarks;
+ Reg_TexBlendColor TexBlendColor; /* Savage4 only */
+
+ Reg_DrawCtrl DrawCtrl; /* Savage3D only */
+ Reg_ScissorsStart ScissorsStart; /* Savage3D only */
+ Reg_ScissorsEnd ScissorsEnd; /* Savage3D only */
+} REGISTERS;
+
+/* All registers that affect textures */
+#define SAVAGE_TEXTURE_CHANGED 0x000002FE
+/* Engine must be idle when global registers are changed */
+#define SAVAGE_GLOBAL_CHANGED 0x00FFFC00
+
+/* Savage4/Twister/ProSavage register BCI addresses */
+#define SAVAGE_DRAWLOCALCTRL_S4 0x1e
+#define SAVAGE_TEXPALADDR_S4 0x1f
+#define SAVAGE_TEXCTRL0_S4 0x20
+#define SAVAGE_TEXCTRL1_S4 0x21
+#define SAVAGE_TEXADDR0_S4 0x22
+#define SAVAGE_TEXADDR1_S4 0x23
+#define SAVAGE_TEXBLEND0_S4 0x24
+#define SAVAGE_TEXBLEND1_S4 0x25
+#define SAVAGE_TEXXPRCLR_S4 0x26 /* never used */
+#define SAVAGE_TEXDESCR_S4 0x27
+#define SAVAGE_FOGTABLE_S4 0x28
+#define SAVAGE_FOGCTRL_S4 0x30
+#define SAVAGE_STENCILCTRL_S4 0x31
+#define SAVAGE_ZBUFCTRL_S4 0x32
+#define SAVAGE_ZBUFOFF_S4 0x33
+#define SAVAGE_DESTCTRL_S4 0x34
+#define SAVAGE_DRAWCTRLGLOBAL0_S4 0x35
+#define SAVAGE_DRAWCTRLGLOBAL1_S4 0x36
+#define SAVAGE_ZWATERMARK_S4 0x37
+#define SAVAGE_DESTTEXRWWATERMARK_S4 0x38
+#define SAVAGE_TEXBLENDCOLOR_S4 0x39
+/* Savage3D/MX/IC register BCI addresses */
+#define SAVAGE_TEXPALADDR_S3D 0x18
+#define SAVAGE_TEXXPRCLR_S3D 0x19 /* never used */
+#define SAVAGE_TEXADDR_S3D 0x1A
+#define SAVAGE_TEXDESCR_S3D 0x1B
+#define SAVAGE_TEXCTRL_S3D 0x1C
+#define SAVAGE_FOGTABLE_S3D 0x20
+#define SAVAGE_FOGCTRL_S3D 0x30
+#define SAVAGE_DRAWCTRL_S3D 0x31
+#define SAVAGE_ZBUFCTRL_S3D 0x32
+#define SAVAGE_ZBUFOFF_S3D 0x33
+#define SAVAGE_DESTCTRL_S3D 0x34
+#define SAVAGE_SCSTART_S3D 0x35
+#define SAVAGE_SCEND_S3D 0x36
+#define SAVAGE_ZWATERMARK_S3D 0x37
+#define SAVAGE_DESTTEXRWWATERMARK_S3D 0x38
+
+#define DV_PF_555 (0x1<<8)
+#define DV_PF_565 (0x2<<8)
+#define DV_PF_8888 (0x4<<8)
+
+#define SAVAGEPACKCOLORA4L4(l,a) \
+ ((l >> 4) | (a & 0xf0))
+
+#define SAVAGEPACKCOLOR4444(r,g,b,a) \
+ ((((a) & 0xf0) << 8) | (((r) & 0xf0) << 4) | ((g) & 0xf0) | ((b) >> 4))
+
+#define SAVAGEPACKCOLOR1555(r,g,b,a) \
+ ((((r) & 0xf8) << 7) | (((g) & 0xf8) << 2) | (((b) & 0xf8) >> 3) | \
+ ((a) ? 0x8000 : 0))
+
+#define SAVAGEPACKCOLOR8888(r,g,b,a) \
+ (((a) << 24) | ((r) << 16) | ((g) << 8) | (b))
+
+#define SAVAGEPACKCOLOR565(r,g,b) \
+ ((((r) & 0xf8) << 8) | (((g) & 0xfc) << 3) | (((b) & 0xf8) >> 3))
+
+
+
+/*AlphaFunc*/
+#define LCS_A_NEVER 0x0200
+#define LCS_A_LESS 0x0201
+#define LCS_A_EQUAL 0x0202
+#define LCS_A_LEQUAL 0x0203
+#define LCS_A_GREATER 0x0204
+#define LCS_A_NOTEQUAL 0x0205
+#define LCS_A_GEQUAL 0x0206
+#define LCS_A_ALWAYS 0x0207
+/*stencilFunc*/
+#define LCS_S_NEVER 0x0200
+#define LCS_S_LESS 0x0201
+#define LCS_S_EQUAL 0x0202
+#define LCS_S_LEQUAL 0x0203
+#define LCS_S_GREATER 0x0204
+#define LCS_S_NOTEQUAL 0x0205
+#define LCS_S_GEQUAL 0x0206
+#define LCS_S_ALWAYS 0x0207
+/*depthFunc*/
+
+#define LCS_Z_NEVER 0x0200
+#define LCS_Z_LESS 0x0201
+#define LCS_Z_EQUAL 0x0202
+#define LCS_Z_LEQUAL 0x0203
+#define LCS_Z_GREATER 0x0204
+#define LCS_Z_NOTEQUAL 0x0205
+#define LCS_Z_GEQUAL 0x0206
+#define LCS_Z_ALWAYS 0x0207
+#if 0
+#define LCS_UPDATE_LINEWIDTH (0x1<<15)
+#define LCS_LINEWIDTH_MASK (0x7<<12)
+#define LCS_LINEWIDTH_SHIFT 12
+#define LCS_LINEWIDTH_0_5 (0x1<<12)
+#define LCS_LINEWIDTH_1_0 (0x2<<12)
+#define LCS_LINEWIDTH_2_0 (0x4<<12)
+#define LCS_LINEWIDTH_3_0 (0x6<<12)
+#define LCS_UPDATE_ALPHA_INTERP (0x1<<11)
+#define LCS_ALPHA_FLAT (0x1<<10)
+#define LCS_ALPHA_INTERP (0x0<<10)
+#define LCS_UPDATE_FOG_INTERP (0x1<<9)
+#define LCS_FOG_INTERP (0x0<<8)
+#define LCS_FOG_FLAT (0x1<<8)
+#define LCS_UPDATE_SPEC_INTERP (0x1<<7)
+#define LCS_SPEC_INTERP (0x0<<6)
+#define LCS_SPEC_FLAT (0x1<<6)
+#define LCS_UPDATE_RGB_INTERP (0x1<<5)
+#define LCS_RGB_INTERP (0x0<<4)
+#define LCS_RGB_FLAT (0x1<<4)
+#define LCS_UPDATE_CULL_MODE (0x1<<3)
+#define LCS_CULL_MASK (0x7<<0)
+#define LCS_CULL_DISABLE (0x1<<0)
+#define LCS_CULL_CW (0x2<<0)
+#define LCS_CULL_CCW (0x3<<0)
+#define LCS_CULL_BOTH (0x4<<0)
+
+#define LCS_INTERP_FLAT (LCS_ALPHA_FLAT|LCS_RGB_FLAT|LCS_SPEC_FLAT)
+#define LCS_UPDATE_INTERP (LCS_UPDATE_ALPHA_INTERP| \
+ LCS_UPDATE_RGB_INTERP| \
+ LCS_UPDATE_SPEC_INTERP)
+
+#endif
+
+/*#define GFX_OP_PRIMITIVE ((0x3<<29)|(0x1f<<24))*/
+#define PR_TRIANGLES (0x0<<18)
+/*#define PR_TRISTRIP_0 (0x1<<18)*/
+/*#define PR_TRISTRIP_1 (0x2<<18)*/
+/*#define PR_TRIFAN (0x3<<18)*/
+#define PR_POLYGON (0x4<<18)
+#define PR_LINES (0x5<<18)
+/*#define PR_LINESTRIP (0x6<<18)*/
+/*#define PR_RECTS (0x7<<18)*/
+
+/* GFXRENDERSTATE_MAP_COORD_SETS, p116
+ */
+#define GFX_OP_MAP_COORD_SETS ((0x3<<29)|(0x1c<<24)|(0x1<<19))
+#define MCS_COORD_ID_SHIFT 16
+#define MCS_COORD_0 (0<<16)
+#define MCS_COORD_1 (1<<16)
+#define MCS_UPDATE_NORMALIZED (1<<15)
+#define MCS_NORMALIZED_COORDS_MASK (1<<14)
+#define MCS_NORMALIZED_COORDS (1<<14)
+#define MCS_UPDATE_V_STATE (1<<7)
+#define MCS_V_STATE_MASK (0x3<<4)
+#define MCS_V_WRAP (0x0<<4)
+#define MCS_V_MIRROR (0x1<<4)
+#define MCS_V_CLAMP (0x2<<4)
+#define MCS_V_WRAP_SHORTEST (0x3<<4)
+#define MCS_UPDATE_U_STATE (1<<3)
+#define MCS_U_STATE_MASK (0x3<<0)
+#define MCS_U_WRAP (0x0<<0)
+#define MCS_U_MIRROR (0x1<<0)
+#define MCS_U_CLAMP (0x2<<0)
+#define MCS_U_WRAP_SHORTEST (0x3<<0)
+
+#define GFX_OP_MAP_TEXELS ((0x3<<29)|(0x1c<<24)|(0x0<<19))
+#define MT_UPDATE_TEXEL1_STATE (1<<15)
+#define MT_TEXEL1_DISABLE (0<<14)
+#define MT_TEXEL1_ENABLE (1<<14)
+#define MT_TEXEL1_COORD0 (0<<11)
+#define MT_TEXEL1_COORD1 (1<<11)
+#define MT_TEXEL1_MAP0 (0<<8)
+#define MT_TEXEL1_MAP1 (1<<8)
+#define MT_UPDATE_TEXEL0_STATE (1<<7)
+#define MT_TEXEL0_DISABLE (0<<6)
+#define MT_TEXEL0_ENABLE (1<<6)
+#define MT_TEXEL0_COORD0 (0<<3)
+#define MT_TEXEL0_COORD1 (1<<3)
+#define MT_TEXEL0_MAP0 (0<<0)
+#define MT_TEXEL0_MAP1 (1<<0)
+
+#define GFX_OP_COLOR_FACTOR ((0x3<<29)|(0x1d<<24)|(0x1<<16)|0x0)
+
+/* GFXRENDERSTATE_MAP_ALPHA_BLEND_STAGES, p132
+ */
+#define GFX_OP_MAP_ALPHA_STAGES ((0x3<<29)|(0x1<<24))
+#define MA_STAGE_SHIFT 20
+#define MA_STAGE_0 (0<<20)
+#define MA_STAGE_1 (1<<20)
+#define MA_STAGE_2 (2<<20)
+#define MA_UPDATE_ARG1 (1<<18)
+#define MA_ARG1_MASK ((0x7<<15)|(0x1<<13))
+#define MA_ARG1_ALPHA_FACTOR (0x1<<15)
+#define MA_ARG1_ITERATED_ALPHA (0x3<<15)
+#define MA_ARG1_CURRENT_ALPHA (0x5<<15)
+#define MA_ARG1_TEX0_ALPHA (0x6<<15)
+#define MA_ARG1_TEX1_ALPHA (0x7<<15)
+#define MA_ARG1_INVERT (0x1<<13)
+#define MA_ARG1_DONT_INVERT (0x0<<13)
+#define MA_UPDATE_ARG2 (1<<12)
+#define MA_ARG2_MASK ((0x7<<8)|(0x1<<6))
+#define MA_ARG2_ALPHA_FACTOR (0x1<<8)
+#define MA_ARG2_ITERATED_ALPHA (0x3<<8)
+#define MA_ARG2_CURRENT_ALPHA (0x5<<8)
+#define MA_ARG2_TEX0_ALPHA (0x6<<8)
+#define MA_ARG2_TEX1_ALPHA (0x7<<8)
+#define MA_ARG2_INVERT (0x1<<6)
+#define MA_ARG2_DONT_INVERT (0x0<<6)
+#define MA_UPDATE_OP (1<<5)
+#define MA_OP_MASK (0xf)
+#define MA_OP_ARG1 (0x1)
+#define MA_OP_ARG2 (0x2)
+#define MA_OP_MODULATE (0x3)
+#define MA_OP_MODULATE_X2 (0x4)
+#define MA_OP_MODULATE_X4 (0x5)
+#define MA_OP_ADD (0x6)
+#define MA_OP_ADD_SIGNED (0x7)
+#define MA_OP_LIN_BLEND_ITER_ALPHA (0x8)
+#define MA_OP_LIN_BLEND_ALPHA_FACTOR (0xa)
+#define MA_OP_LIN_BLEND_TEX0_ALPHA (0x10)
+#define MA_OP_LIN_BLEND_TEX1_ALPHA (0x11)
+
+
+/* GFXRENDERSTATE_MAP_COLOR_BLEND_STAGES, p129
+ */
+#define GFX_OP_MAP_COLOR_STAGES ((0x3<<29)|(0x0<<24))
+#define MC_STAGE_SHIFT 20
+#define MC_STAGE_0 (0<<20)
+#define MC_STAGE_1 (1<<20)
+#define MC_STAGE_2 (2<<20)
+#define MC_UPDATE_DEST (1<<19)
+#define MC_DEST_MASK (1<<18)
+#define MC_DEST_CURRENT (0<<18)
+#define MC_DEST_ACCUMULATOR (1<<18)
+#define MC_UPDATE_ARG1 (1<<17)
+#define MC_ARG1_MASK ((0x7<<14)|(0x1<<13)|(0x1<<12))
+#define MC_ARG1_ONE (0x0<<14)
+#define MC_ARG1_COLOR_FACTOR (0x1<<14)
+#define MC_ARG1_ACCUMULATOR (0x2<<14)
+#define MC_ARG1_ITERATED_COLOR (0x3<<14)
+#define MC_ARG1_SPECULAR_COLOR (0x4<<14)
+#define MC_ARG1_CURRENT_COLOR (0x5<<14)
+#define MC_ARG1_TEX0_COLOR (0x6<<14)
+#define MC_ARG1_TEX1_COLOR (0x7<<14)
+#define MC_ARG1_DONT_REPLICATE_ALPHA (0x0<<13)
+#define MC_ARG1_REPLICATE_ALPHA (0x1<<13)
+#define MC_ARG1_DONT_INVERT (0x0<<12)
+#define MC_ARG1_INVERT (0x1<<12)
+#define MC_UPDATE_ARG2 (1<<11)
+#define MC_ARG2_MASK ((0x7<<8)|(0x1<<7)|(0x1<<6))
+#define MC_ARG2_ONE (0x0<<8)
+#define MC_ARG2_COLOR_FACTOR (0x1<<8)
+#define MC_ARG2_ACCUMULATOR (0x2<<8)
+#define MC_ARG2_ITERATED_COLOR (0x3<<8)
+#define MC_ARG2_SPECULAR_COLOR (0x4<<8)
+#define MC_ARG2_CURRENT_COLOR (0x5<<8)
+#define MC_ARG2_TEX0_COLOR (0x6<<8)
+#define MC_ARG2_TEX1_COLOR (0x7<<8)
+#define MC_ARG2_DONT_REPLICATE_ALPHA (0x0<<7)
+#define MC_ARG2_REPLICATE_ALPHA (0x1<<7)
+#define MC_ARG2_DONT_INVERT (0x0<<6)
+#define MC_ARG2_INVERT (0x1<<6)
+#define MC_UPDATE_OP (1<<5)
+#define MC_OP_MASK (0xf)
+#define MC_OP_DISABLE (0x0)
+#define MC_OP_ARG1 (0x1)
+#define MC_OP_ARG2 (0x2)
+#define MC_OP_MODULATE (0x3)
+#define MC_OP_MODULATE_X2 (0x4)
+#define MC_OP_MODULATE_X4 (0x5)
+#define MC_OP_ADD (0x6)
+#define MC_OP_ADD_SIGNED (0x7)
+#define MC_OP_LIN_BLEND_ITER_ALPHA (0x8)
+#define MC_OP_LIN_BLEND_ALPHA_FACTOR (0xa)
+#define MC_OP_LIN_BLEND_TEX0_ALPHA (0x10)
+#define MC_OP_LIN_BLEND_TEX1_ALPHA (0x11)
+#define MC_OP_LIN_BLEND_TEX0_COLOR (0x12)
+#define MC_OP_LIN_BLEND_TEX1_COLOR (0x13)
+#define MC_OP_SUBTRACT (0x14)
+
+/* GFXRENDERSTATE_MAP_PALETTE_LOAD, p128
+ *
+ * Format:
+ * 0: GFX_OP_MAP_PALETTE_LOAD
+ * 1: 16bpp color[0]
+ * ...
+ * 256: 16bpp color[255]
+ */
+#define GFX_OP_MAP_PALETTE_LOAD ((0x3<<29)|(0x1d<<24)|(0x82<<16)|0xff)
+
+/* GFXRENDERSTATE_MAP_LOD_CONTROL, p127
+ */
+#define GFX_OP_MAP_LOD_CTL ((0x3<<29)|(0x1c<<24)|(0x4<<19))
+#define MLC_MAP_ID_SHIFT 16
+#define MLC_MAP_0 (0<<16)
+#define MLC_MAP_1 (1<<16)
+#define MLC_UPDATE_DITHER_WEIGHT (1<<10)
+#define MLC_DITHER_WEIGHT_MASK (0x3<<8)
+#define MLC_DITHER_WEIGHT_FULL (0x0<<8)
+#define MLC_DITHER_WEIGHT_50 (0x1<<8)
+#define MLC_DITHER_WEIGHT_25 (0x2<<8)
+#define MLC_DITHER_WEIGHT_12 (0x3<<8)
+#define MLC_UPDATE_LOD_BIAS (1<<7)
+#define MLC_LOD_BIAS_MASK ((1<<7)-1)
+
+/* GFXRENDERSTATE_MAP_LOD_LIMITS, p126
+ */
+#define GFX_OP_MAP_LOD_LIMITS ((0x3<<29)|(0x1c<<24)|(0x3<<19))
+#define MLL_MAP_ID_SHIFT 16
+#define MLL_MAP_0 (0<<16)
+#define MLL_MAP_1 (1<<16)
+#define MLL_UPDATE_MAX_MIP (1<<13)
+#define MLL_MAX_MIP_SHIFT 5
+#define MLL_MAX_MIP_MASK (0xff<<5)
+#define MLL_MAX_MIP_ONE (0x10<<5)
+#define MLL_UPDATE_MIN_MIP (1<<4)
+#define MLL_MIN_MIP_SHIFT 0
+#define MLL_MIN_MIP_MASK (0xf<<0)
+
+/* GFXRENDERSTATE_MAP_FILTER, p124
+ */
+#define GFX_OP_MAP_FILTER ((0x3<<29)|(0x1c<<24)|(0x2<<19))
+#define MF_MAP_ID_SHIFT 16
+#define MF_MAP_0 (0<<16)
+#define MF_MAP_1 (1<<16)
+#define MF_UPDATE_ANISOTROPIC (1<<12)
+#define MF_ANISOTROPIC_MASK (1<<10)
+#define MF_ANISOTROPIC_ENABLE (1<<10)
+#define MF_UPDATE_MIP_FILTER (1<<9)
+#define MF_MIP_MASK (0x3<<6)
+#define MF_MIP_NONE (0x0<<6)
+#define MF_MIP_NEAREST (0x1<<6)
+#define MF_MIP_DITHER (0x2<<6)
+#define MF_MIP_LINEAR (0x3<<6)
+#define MF_UPDATE_MAG_FILTER (1<<5)
+#define MF_MAG_MASK (1<<3)
+#define MF_MAG_LINEAR (1<<3)
+#define MF_MAG_NEAREST (0<<3)
+#define MF_UPDATE_MIN_FILTER (1<<2)
+#define MF_MIN_MASK (1<<0)
+#define MF_MIN_LINEAR (1<<0)
+#define MF_MIN_NEAREST (0<<0)
+
+/* GFXRENDERSTATE_MAP_INFO, p118
+ */
+#define GFX_OP_MAP_INFO ((0x3<<29)|(0x1d<<24)|0x2)
+#define MI1_MAP_ID_SHIFT 28
+#define MI1_MAP_0 (0<<28)
+#define MI1_MAP_1 (1<<28)
+#define MI1_FMT_MASK (0x7<<24)
+#define MI1_FMT_8CI (0x0<<24)
+#define MI1_FMT_8BPP (0x1<<24)
+#define MI1_FMT_16BPP (0x2<<24)
+#define MI1_FMT_422 (0x5<<24)
+#define MI1_PF_MASK (0x3<<21)
+#define MI1_PF_8CI_RGB565 (0x0<<21)
+#define MI1_PF_8CI_ARGB1555 (0x1<<21)
+#define MI1_PF_8CI_ARGB4444 (0x2<<21)
+#define MI1_PF_8CI_AY88 (0x3<<21)
+#define MI1_PF_16BPP_RGB565 (0x0<<21)
+#define MI1_PF_16BPP_ARGB1555 (0x1<<21)
+#define MI1_PF_16BPP_ARGB4444 (0x2<<21)
+#define MI1_PF_16BPP_AY88 (0x3<<21)
+#define MI1_PF_422_YCRCB_SWAP_Y (0x0<<21)
+#define MI1_PF_422_YCRCB (0x1<<21)
+#define MI1_PF_422_YCRCB_SWAP_UV (0x2<<21)
+#define MI1_PF_422_YCRCB_SWAP_YUV (0x3<<21)
+#define MI1_OUTPUT_CHANNEL_MASK (0x3<<19)
+#define MI1_COLOR_CONV_ENABLE (1<<18)
+#define MI1_VERT_STRIDE_MASK (1<<17)
+#define MI1_VERT_STRIDE_1 (1<<17)
+#define MI1_VERT_OFFSET_MASK (1<<16)
+#define MI1_VERT_OFFSET_1 (1<<16)
+#define MI1_ENABLE_FENCE_REGS (1<<10)
+#define MI1_TILED_SURFACE (1<<9)
+#define MI1_TILE_WALK_X (0<<8)
+#define MI1_TILE_WALK_Y (1<<8)
+#define MI1_PITCH_MASK (0xf<<0)
+#define MI2_DIMENSIONS_ARE_LOG2 (1<<31)
+#define MI2_DIMENSIONS_ARE_EXACT (0<<31)
+#define MI2_HEIGHT_SHIFT 16
+#define MI2_HEIGHT_MASK (0x1ff<<16)
+#define MI2_WIDTH_SHIFT 0
+#define MI2_WIDTH_MASK (0x1ff<<0)
+#define MI3_BASE_ADDR_MASK (~0xf)
+
+#define SAVAGE_VFMT_T0 (GFX_OP_VERTEX_FMT | \
+ VF_TEXCOORD_COUNT_1 | \
+ VF_SPEC_FOG_ENABLE | \
+ VF_RGBA_ENABLE | \
+ VF_XYZW)
+
+#define SAVAGE_VFMT_T0T1 (GFX_OP_VERTEX_FMT | \
+ VF_TEXCOORD_COUNT_2 | \
+ VF_SPEC_FOG_ENABLE | \
+ VF_RGBA_ENABLE | \
+ VF_XYZW)
+
+#define GFX_OP_VERTEX_FMT ((0x3<<29)|(0x5<<24))
+#define VF_TEXCOORD_COUNT_SHIFT 8
+#define VF_TEXCOORD_COUNT_0 (0<<8)
+#define VF_TEXCOORD_COUNT_1 (1<<8)
+#define VF_TEXCOORD_COUNT_2 (2<<8)
+#define VF_SPEC_FOG_ENABLE (1<<7)
+#define VF_RGBA_ENABLE (1<<6)
+#define VF_Z_OFFSET_ENABLE (1<<5)
+#define VF_XYZ (0x1<<1)
+#define VF_XYZW (0x2<<1)
+#define VF_XY (0x3<<1)
+#define VF_XYW (0x4<<1)
+
+/* Master data transfer engine */
+#define MDT_SRCADD_ALIGMENT (~0x1fUL)
+#define MDT_SRC_PCI 0x1
+#define MDT_SRC_AGP 0x3
+#endif
+
+