Merge commit 'origin/mesa_7_7_branch'
[mesa.git] / src / mesa / drivers / glide / fxdrv.h
index 4a9110393c7b1b9e9e9260875d3f801ff5516ff2..bee10de2f49088f35ac6af025cb9ce3e3e96fbfa 100644 (file)
@@ -1,10 +1,8 @@
-/* -*- mode: C; tab-width:8; c-basic-offset:2 -*- */
-
 /*
  * Mesa 3-D graphics library
- * Version:  3.3
+ * Version:  4.0
  *
- * Copyright (C) 1999-2000  Brian Paul   All Rights Reserved.
+ * Copyright (C) 1999-2001  Brian Paul   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"),
  * BRIAN PAUL 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.
- *
- *
- * Original Mesa / 3Dfx device driver (C) 1999 David Bucciarelli, by the
- * terms stated above.
- *
- * Thank you for your contribution, David!
- *
- * Please make note of the above copyright/license statement.  If you
- * contributed code or bug fixes to this code under the previous (GNU
- * Library) license and object to the new license, your code will be
- * removed at your request.  Please see the Mesa docs/COPYRIGHT file
- * for more information.
- *
- * Additional Mesa/3Dfx driver developers:
- *   Daryll Strauss <daryll@precisioninsight.com>
- *   Keith Whitwell <keith@precisioninsight.com>
- *
- * See fxapi.h for more revision/author details.
  */
 
+/* Authors:
+ *    David Bucciarelli
+ *    Brian Paul
+ *    Daryll Strauss
+ *    Keith Whitwell
+ *    Daniel Borca
+ *    Hiroshi Morii
+ */
+
+/* fxsetup.c - 3Dfx VooDoo rendering mode setup functions */
+
 
 #ifndef FXDRV_H
 #define FXDRV_H
  * you turn debugging on/off from the debugger.
  */
 
-#ifndef XFree86Server
-#include <math.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <limits.h>
-#include <assert.h>
-#else 
-#include "GL/xf86glx.h"
-#endif
+#include "glheader.h"
 
 
 #if defined(__linux__)
 #include <signal.h>
 #endif
 
-#include "context.h"
-#include "macros.h"
-#include "matrix.h"
-#include "mem.h"
-#include "texture.h"
-#include "types.h"
-#include "vb.h"
-#include "xform.h"
-#include "clip.h"
-#include "vbrender.h"
-
-#ifdef XF86DRI
-typedef struct tfxMesaContext *fxMesaContext;
-#else
+#include "main/context.h"
+#include "main/imports.h"
+#include "main/macros.h"
+#include "main/matrix.h"
+#include "main/mtypes.h"
+
 #include "GL/fxmesa.h"
-#endif
 #include "fxglidew.h"
-/* use gl/gl.h GLAPI/GLAPIENTRY/GLCALLBACK in place of WINGDIAPI/APIENTRY/CALLBACK, */
-/* these are defined in mesa gl/gl.h - tjump@spgs.com */
-
 
+#include "math/m_vector.h"
 
-#if defined(MESA_DEBUG) && 0
-extern void fx_sanity_triangle( GrVertex *, GrVertex *, GrVertex * );
-#define grDrawTriangle fx_sanity_triangle
-#endif
 
+#define COPY_FLOAT(dst, src)    (dst) = (src)
 
 /* Define some shorter names for these things.
  */
@@ -100,61 +69,13 @@ extern void fx_sanity_triangle( GrVertex *, GrVertex *, GrVertex * );
 #define ZCOORD   GR_VERTEX_OOZ_OFFSET
 #define OOWCOORD GR_VERTEX_OOW_OFFSET
 
-#define RCOORD   GR_VERTEX_R_OFFSET
-#define GCOORD   GR_VERTEX_G_OFFSET
-#define BCOORD   GR_VERTEX_B_OFFSET
-#define ACOORD   GR_VERTEX_A_OFFSET
-
 #define S0COORD  GR_VERTEX_SOW_TMU0_OFFSET
 #define T0COORD  GR_VERTEX_TOW_TMU0_OFFSET
 #define S1COORD  GR_VERTEX_SOW_TMU1_OFFSET
 #define T1COORD  GR_VERTEX_TOW_TMU1_OFFSET
 
 
-#if FX_USE_PARGB
-
-#define CLIP_XCOORD 0          /* normal place */
-#define CLIP_YCOROD 1          /* normal place */
-#define CLIP_ZCOORD 2          /* normal place */
-#define CLIP_WCOORD 3          /* normal place */
-#define CLIP_GCOORD 4          /* GR_VERTEX_PARGB_OFFSET */
-#define CLIP_BCOORD 5          /* GR_VERTEX_SOW_TMU0_OFFSET */
-#define CLIP_RCOORD 6          /* GR_VERTEX_TOW_TMU0_OFFSET */
-#define CLIP_ACOORD 7          /* GR_VERTEX_OOW_TMU0_OFFSET */
-
-#else
-
-#define CLIP_XCOORD 0          /* normal place */
-#define CLIP_YCOROD 1          /* normal place */
-#define CLIP_ZCOORD 2          /* GR_VERTEX_Z_OFFSET */
-#define CLIP_WCOORD 3          /* GR_VERTEX_R_OFFSET */
-#define CLIP_GCOORD 4          /* normal place */
-#define CLIP_BCOORD 5          /* normal place */
-#define CLIP_RCOORD 6          /* GR_VERTEX_OOZ_OFFSET */
-#define CLIP_ACOORD 7          /* normal place */
-
-
-#endif
-
-/* Should have size == 16 * sizeof(float).
- */
-typedef struct {
-   GLfloat f[15];              /* Same layout as GrVertex */
-   GLubyte mask;               /* Unsued  */
-   GLubyte usermask;           /* Unused */
-} fxVertex;
 
-
-
-
-#if defined(FXMESA_USE_ARGB)
-#define FXCOLOR4( c ) (      \
-  ( ((unsigned int)(c[3]))<<24 ) | \
-  ( ((unsigned int)(c[0]))<<16 ) | \
-  ( ((unsigned int)(c[1]))<<8 )  | \
-  (  (unsigned int)(c[2])) )
-  
-#else
 #ifdef __i386__
 #define FXCOLOR4( c )  (* (int *)c)
 #else
@@ -164,54 +85,29 @@ typedef struct {
   ( ((unsigned int)(c[1]))<<8 )  | \
   (  (unsigned int)(c[0])) )
 #endif
-#endif
 
-#define FX_VB_COLOR(fxm, color)                                \
-  do {                                                 \
-    if (sizeof(GLint) == 4*sizeof(GLubyte)) {          \
-      if (fxm->constColor != *(GLuint*)color) {                \
-       fxm->constColor = *(GLuint*)color;              \
-       FX_grConstantColorValue(FXCOLOR4(color));       \
-      }                                                        \
-    } else {                                           \
-      FX_grConstantColorValue(FXCOLOR4(color));                \
-    }                                                  \
-  } while (0)
-
-#define GOURAUD(x) {                                   \
-  GLubyte *col = VB->ColorPtr->data[(x)];              \
-  gWin[(x)].v.r=UBYTE_COLOR_TO_FLOAT_255_COLOR(col[0]);        \
-  gWin[(x)].v.g=UBYTE_COLOR_TO_FLOAT_255_COLOR(col[1]);        \
-  gWin[(x)].v.b=UBYTE_COLOR_TO_FLOAT_255_COLOR(col[2]);        \
-  gWin[(x)].v.a=UBYTE_COLOR_TO_FLOAT_255_COLOR(col[3]);        \
-}
+#define TDFXPACKCOLOR1555( r, g, b, a )                                           \
+   ((((r) & 0xf8) << 7) | (((g) & 0xf8) << 2) | (((b) & 0xf8) >> 3) |     \
+    ((a) ? 0x8000 : 0))
+#define TDFXPACKCOLOR565( r, g, b )                                       \
+   ((((r) & 0xf8) << 8) | (((g) & 0xfc) << 3) | (((b) & 0xf8) >> 3))
+#define TDFXPACKCOLOR8888( r, g, b, a )                                           \
+   (((a) << 24) | ((r) << 16) | ((g) << 8) | (b))
 
-#if FX_USE_PARGB
-#define GOURAUD2(v, c) {                                                                                                                               \
-  GLubyte *col = c;                                                                                                                                    \
-  v->argb=MESACOLOR2PARGB(col);                                                                                                                        \
-}
-#else
-#define GOURAUD2(v, c) {                       \
-  GLubyte *col = c;                            \
-  v->r=UBYTE_COLOR_TO_FLOAT_255_COLOR(col[0]); \
-  v->g=UBYTE_COLOR_TO_FLOAT_255_COLOR(col[1]); \
-  v->b=UBYTE_COLOR_TO_FLOAT_255_COLOR(col[2]); \
-  v->a=UBYTE_COLOR_TO_FLOAT_255_COLOR(col[3]); \
-}
-#endif
 
 
-/* Mergable items first
+/* fastpath flags first
  */
-#define SETUP_RGBA 0x1
-#define SETUP_TMU0 0x2
-#define SETUP_TMU1 0x4
-#define SETUP_XY   0x8
-#define SETUP_Z    0x10
-#define SETUP_W    0x20
-
-#define MAX_MERGABLE 0x8
+#define SETUP_TMU0 0x1
+#define SETUP_TMU1 0x2
+#define SETUP_RGBA 0x4
+#define SETUP_SNAP 0x8
+#define SETUP_XYZW 0x10
+#define SETUP_PTEX 0x20
+#define SETUP_PSIZ 0x40
+#define SETUP_SPEC 0x80
+#define SETUP_FOGC 0x100
+#define MAX_SETUP  0x200
 
 
 #define FX_NUM_TMU 2
@@ -230,13 +126,13 @@ typedef struct {
 #define FX_UM_E0_MODULATE           0x00000002
 #define FX_UM_E0_DECAL              0x00000004
 #define FX_UM_E0_BLEND              0x00000008
-#define FX_UM_E0_ADD                           0x00000010
+#define FX_UM_E0_ADD               0x00000010
 
 #define FX_UM_E1_REPLACE            0x00000020
 #define FX_UM_E1_MODULATE           0x00000040
 #define FX_UM_E1_DECAL              0x00000080
 #define FX_UM_E1_BLEND              0x00000100
-#define FX_UM_E1_ADD                           0x00000200
+#define FX_UM_E1_ADD               0x00000200
 
 #define FX_UM_E_ENVMODE             0x000003ff
 
@@ -261,119 +157,201 @@ typedef struct {
 #define FX_UM_ALPHA_ITERATED        0x04000000
 #define FX_UM_ALPHA_CONSTANT        0x08000000
 
-typedef void (*tfxRenderVBFunc)(GLcontext *);
 
-/*
-  Memory range from startAddr to endAddr-1
-*/
-typedef struct MemRange_t {
-  struct MemRange_t *next;
-  FxU32 startAddr, endAddr;
-} MemRange;
+/* for Voodoo3/Banshee's grColorCombine() and grAlphaCombine() */
+struct tdfx_combine {
+   GrCombineFunction_t Function;       /* Combine function */
+   GrCombineFactor_t Factor;           /* Combine scale factor */
+   GrCombineLocal_t Local;             /* Local combine source */
+   GrCombineOther_t Other;             /* Other combine source */
+   FxBool Invert;                      /* Combine result inversion flag */
+};
+
+/* for Voodoo3's grTexCombine() */
+struct tdfx_texcombine {
+   GrCombineFunction_t FunctionRGB;
+   GrCombineFactor_t FactorRGB;
+   GrCombineFunction_t FunctionAlpha;
+   GrCombineFactor_t FactorAlpha;
+   FxBool InvertRGB;
+   FxBool InvertAlpha;
+};
+
+
+/* for Voodoo5's grColorCombineExt() */
+struct tdfx_combine_color_ext {
+   GrCCUColor_t SourceA;
+   GrCombineMode_t ModeA;
+   GrCCUColor_t SourceB;
+   GrCombineMode_t ModeB;
+   GrCCUColor_t SourceC;
+   FxBool InvertC;
+   GrCCUColor_t SourceD;
+   FxBool InvertD;
+   FxU32 Shift;
+   FxBool Invert;
+};
+
+/* for Voodoo5's grAlphaCombineExt() */
+struct tdfx_combine_alpha_ext {
+   GrACUColor_t SourceA;
+   GrCombineMode_t ModeA;
+   GrACUColor_t SourceB;
+   GrCombineMode_t ModeB;
+   GrACUColor_t SourceC;
+   FxBool InvertC;
+   GrACUColor_t SourceD;
+   FxBool InvertD;
+   FxU32 Shift;
+   FxBool Invert;
+};
 
-typedef struct {
-  GLsizei width, height;
-  GLint glideFormat;
+/* for Voodoo5's grTexColorCombineExt() */
+struct tdfx_color_texenv {
+   GrTCCUColor_t SourceA;
+   GrCombineMode_t ModeA;
+   GrTCCUColor_t SourceB;
+   GrCombineMode_t ModeB;
+   GrTCCUColor_t SourceC;
+   FxBool InvertC;
+   GrTCCUColor_t SourceD;
+   FxBool InvertD;
+   FxU32 Shift;
+   FxBool Invert;
+};
 
-  unsigned short *data;
-  GLboolean translated, used;
-} tfxMipMapLevel;
+/* for Voodoo5's grTexAlphaCombineExt() */
+struct tdfx_alpha_texenv {
+   GrTACUColor_t SourceA;
+   GrCombineMode_t ModeA;
+   GrTACUColor_t SourceB;
+   GrCombineMode_t ModeB;
+   GrTACUColor_t SourceC;
+   FxBool InvertC;
+   GrTCCUColor_t SourceD;
+   FxBool InvertD;
+   FxU32 Shift;
+   FxBool Invert;
+};
 
-typedef struct tfxTexInfo_t {
-  struct tfxTexInfo *next;
-  struct gl_texture_object *tObj;
+/* Voodoo5's texture combine environment */
+struct tdfx_texcombine_ext {
+   struct tdfx_alpha_texenv Alpha;
+   struct tdfx_color_texenv Color;
+   GrColor_t EnvColor;
+};
 
-  GLuint lastTimeUsed;
-  FxU32 whichTMU;
-  GLboolean isInTM;
 
-  tfxMipMapLevel mipmapLevel[MAX_TEXTURE_LEVELS];
+/*
+  Memory range from startAddr to endAddr-1
+*/
+typedef struct MemRange_t
+{
+   struct MemRange_t *next;
+   FxU32 startAddr, endAddr;
+}
+MemRange;
 
-  MemRange *tm[FX_NUM_TMU];
+typedef struct
+{
+   GLsizei width, height;      /* image size */
+   GLint wScale, hScale;       /* image scale factor */
+   GrTextureFormat_t glideFormat;      /* Glide image format */
+}
+tfxMipMapLevel;
 
-  GLint minLevel, maxLevel;
-  GLint baseLevelInternalFormat;
+/*
+ * TDFX-specific texture object data.  This hangs off of the
+ * struct gl_texture_object DriverData pointer.
+ */
+typedef struct tfxTexInfo_t
+{
+   struct tfxTexInfo_t *next;
+   struct gl_texture_object *tObj;
 
-  GrTexInfo info;
+   GLuint lastTimeUsed;
+   FxU32 whichTMU;
+   GLboolean isInTM;
 
-  GrTextureFilterMode_t minFilt;
-  GrTextureFilterMode_t maxFilt;
-  FxBool LODblend;
+   MemRange *tm[FX_NUM_TMU];
 
-  GrTextureClampMode_t sClamp;
-  GrTextureClampMode_t tClamp;
+   GLint minLevel, maxLevel;
+   GLint baseLevelInternalFormat;
 
-  GrMipMapMode_t mmMode;
+   GrTexInfo info;
 
-  GLfloat sScale, tScale;
-  GLint int_sScale, int_tScale;        /* x86 floating point trick for
-                                * multiplication by powers of 2.  
-                                * Used in fxfasttmp.h
-                                */
+   GrTextureFilterMode_t minFilt;
+   GrTextureFilterMode_t maxFilt;
+   FxBool LODblend;
 
-  GuTexPalette palette;
+   GrTextureClampMode_t sClamp;
+   GrTextureClampMode_t tClamp;
 
-  GLboolean fixedPalette;
-  GLboolean validated;
-} tfxTexInfo;
+   GrMipMapMode_t mmMode;
 
-typedef struct {
-  GLuint swapBuffer;
-  GLuint reqTexUpload;
-  GLuint texUpload;
-  GLuint memTexUpload;
-} tfxStats;
+   GLfloat sScale, tScale;
 
+   GrTexTable_t paltype;
+   GuTexPalette palette;
 
-typedef void (*tfxTriViewClipFunc)( struct vertex_buffer *VB, 
-                                   GLuint v[],
-                                   GLubyte mask );
+   GLboolean fixedPalette;
+   GLboolean validated;
 
-typedef void (*tfxTriClipFunc)( struct vertex_buffer *VB, 
-                               GLuint v[],
-                               GLuint mask );
+   GLboolean padded;
+}
+tfxTexInfo;
+
+typedef struct
+{
+   GLuint swapBuffer;
+   GLuint reqTexUpload;
+   GLuint texUpload;
+   GLuint memTexUpload;
+}
+tfxStats;
 
 
-typedef void (*tfxLineClipFunc)( struct vertex_buffer *VB, 
-                                GLuint v1, GLuint v2,
-                                GLubyte mask );
 
+typedef struct
+{
+   /* Alpha test */
 
-extern tfxTriViewClipFunc fxTriViewClipTab[0x8];
-extern tfxTriClipFunc fxTriClipStrideTab[0x8];
-extern tfxLineClipFunc fxLineClipTab[0x8];
+   GLboolean alphaTestEnabled;
+   GrCmpFnc_t alphaTestFunc;
+   GLfloat alphaTestRefValue;
 
-typedef struct {
-  /* Alpha test */
+   /* Blend function */
 
-  GLboolean alphaTestEnabled;
-  GrCmpFnc_t alphaTestFunc;
-  GrAlpha_t alphaTestRefValue;
+   GLboolean blendEnabled;
+   GrAlphaBlendFnc_t blendSrcFuncRGB;
+   GrAlphaBlendFnc_t blendDstFuncRGB;
+   GrAlphaBlendFnc_t blendSrcFuncAlpha;
+   GrAlphaBlendFnc_t blendDstFuncAlpha;
+   GrAlphaBlendOp_t blendEqRGB;
+   GrAlphaBlendOp_t blendEqAlpha;
 
-  /* Blend function */
+   /* Depth test */
 
-  GLboolean blendEnabled;
-  GrAlphaBlendFnc_t blendSrcFuncRGB;
-  GrAlphaBlendFnc_t blendDstFuncRGB;
-  GrAlphaBlendFnc_t blendSrcFuncAlpha;
-  GrAlphaBlendFnc_t blendDstFuncAlpha;
+   GLboolean depthTestEnabled;
+   GLboolean depthMask;
+   GrCmpFnc_t depthTestFunc;
+   FxI32 depthBias;
 
-  /* Depth test */
+   /* Stencil */
 
-  GLboolean depthTestEnabled;
-  GLboolean depthMask;
-  GrCmpFnc_t depthTestFunc;
-} tfxUnitsState;
+   GLboolean stencilEnabled;
+   GrCmpFnc_t stencilFunction;         /* Stencil function */
+   GrStencil_t stencilRefValue;                /* Stencil reference value */
+   GrStencil_t stencilValueMask;       /* Value mask */
+   GrStencil_t stencilWriteMask;       /* Write mask */
+   GrCmpFnc_t stencilFailFunc;         /* Stencil fail function */
+   GrCmpFnc_t stencilZFailFunc;                /* Stencil pass, depth fail function */
+   GrCmpFnc_t stencilZPassFunc;                /* Stencil pass, depth pass function */
+   GrStencil_t stencilClear;           /* Buffer clear value */
+}
+tfxUnitsState;
 
 
-/* Flags for render_index.
- */
-#define FX_OFFSET             0x1
-#define FX_TWOSIDE            0x2
-#define FX_FRONT_BACK         0x4 
-#define FX_FLAT               0x8
-#define FX_ANTIALIAS          0x10 
-#define FX_FALLBACK           0x20 
 
 
 /* Flags for fxMesa->new_state
@@ -386,288 +364,410 @@ typedef struct {
 #define FX_NEW_SCISSOR        0x20
 #define FX_NEW_COLOR_MASK     0x40
 #define FX_NEW_CULL           0x80
+#define FX_NEW_STENCIL        0x100
 
-/* FX struct stored in VB->driver_data.
- */
-struct tfxMesaVertexBuffer {
-   GLvector1ui clipped_elements;
-
-   fxVertex *verts;
-   fxVertex *last_vert;
-   void *vert_store;
-#if defined(FX_GLIDE3)
-   GrVertex **triangle_b;      /* Triangle buffer */
-   GrVertex **strips_b;                /* Strips buffer */
-#endif
 
-   GLuint size;
-};
-
-#define FX_DRIVER_DATA(vb) ((struct tfxMesaVertexBuffer *)((vb)->driver_data))
 #define FX_CONTEXT(ctx) ((fxMesaContext)((ctx)->DriverCtx))
-#define FX_TEXTURE_DATA(t) fxTMGetTexInfo((t)->Current)
 
-#if defined(XFree86Server) || defined(GLX_DIRECT_RENDERING)
-#include "tdfx_init.h"
-#else
-#define DRI_FX_CONTEXT
+#define FX_TEXTURE_DATA(texUnit) fxTMGetTexInfo((texUnit)->_Current)
+
+#define fxTMGetTexInfo(o) ((tfxTexInfo*)((o)->DriverData))
+
+#define FX_MIPMAP_DATA(img)  ((tfxMipMapLevel *) (img)->DriverData)
+
 #define BEGIN_BOARD_LOCK()
 #define END_BOARD_LOCK()
 #define BEGIN_CLIP_LOOP()
 #define END_CLIP_LOOP()
-#endif
 
 
-/* These lookup table are used to extract RGB values in [0,255] from
- * 16-bit pixel values.
+
+
+/* Covers the state referenced by IsInHardware:
  */
-extern GLubyte FX_PixelToR[0x10000];
-extern GLubyte FX_PixelToG[0x10000];
-extern GLubyte FX_PixelToB[0x10000];
-
-
-struct tfxMesaContext {
-  GuTexPalette glbPalette;
-
-  GLcontext *glCtx;              /* the core Mesa context */
-  GLvisual *glVis;               /* describes the color buffer */
-  GLframebuffer *glBuffer;       /* the ancillary buffers */
-
-  GLint board;                   /* the board used for this context */
-  GLint width, height;           /* size of color buffer */
-
-  GrBuffer_t currentFB;
-
-  GLboolean bgrOrder;
-  GrColor_t color;
-  GrColor_t clearC;
-  GrAlpha_t clearA;
-  GLuint constColor;
-
-  tfxUnitsState unitsState;
-  tfxUnitsState restoreUnitsState; /* saved during multipass */
-
-  GLuint tmu_source[FX_NUM_TMU];
-  GLuint tex_dest[MAX_TEXTURE_UNITS];
-  GLuint setupindex;
-  GLuint partial_setup_index;
-  GLuint setupdone;
-  GLuint mergeindex;
-  GLuint mergeinputs;
-  GLuint render_index;
-  GLuint last_tri_caps;
-  GLuint stw_hint_state;               /* for grHints */
-  GLuint is_in_hardware;
-  GLuint new_state;   
-  GLuint using_fast_path, passes, multipass;
-
-  tfxLineClipFunc clip_line;
-  tfxTriClipFunc clip_tri_stride;
-  tfxTriViewClipFunc view_clip_tri;
-
-
-  /* Texture Memory Manager Data */
-
-  GLuint texBindNumber;
-  GLint tmuSrc;
-  GLuint lastUnitsMode;
-  GLuint freeTexMem[FX_NUM_TMU];
-  MemRange *tmPool;
-  MemRange *tmFree[FX_NUM_TMU];
-
-  GLenum fogTableMode;
-  GLfloat fogDensity;
-  GrFog_t *fogTable;
-
-  /* Acc. functions */
-
-  points_func PointsFunc;
-  line_func LineFunc;
-  triangle_func TriangleFunc;
-  quad_func QuadFunc;
-
-  render_func **RenderVBTables;
-
-  render_func *RenderVBClippedTab;
-  render_func *RenderVBCulledTab;
-  render_func *RenderVBRawTab;
-
-
-  tfxStats stats;
-
-  void *state;
-
-  /* Options */
-
-  GLboolean verbose;
-  GLboolean haveTwoTMUs;       /* True if we really have 2 tmu's  */
-  GLboolean emulateTwoTMUs;    /* True if we present 2 tmu's to mesa.  */
-  GLboolean haveAlphaBuffer;
-  GLboolean haveZBuffer;
-  GLboolean haveDoubleBuffer;
-  GLboolean haveGlobalPaletteTexture;
-  GLint swapInterval;
-  GLint maxPendingSwapBuffers;
-  
-  FX_GrContext_t glideContext;
-
-  int x_offset;
-  int y_offset;
-  int y_delta;
-  int screen_width;
-  int screen_height;
-  int initDone;
-  int clipMinX;
-  int clipMaxX;
-  int clipMinY;
-  int clipMaxY;
-  int needClip;
-
-  DRI_FX_CONTEXT
+#define _FX_NEW_IS_IN_HARDWARE (_NEW_TEXTURE|          \
+                               _NEW_HINT|              \
+                               _NEW_STENCIL|           \
+                               _NEW_BUFFERS|           \
+                               _NEW_COLOR|             \
+                               _NEW_LIGHT)
+
+/* Covers the state referenced by fxDDChooseRenderState
+ */
+#define _FX_NEW_RENDERSTATE (_FX_NEW_IS_IN_HARDWARE |   \
+                            _DD_NEW_FLATSHADE |        \
+                            _DD_NEW_TRI_LIGHT_TWOSIDE| \
+                            _DD_NEW_TRI_OFFSET |       \
+                            _DD_NEW_TRI_UNFILLED |     \
+                            _DD_NEW_TRI_SMOOTH |       \
+                            _DD_NEW_TRI_STIPPLE |      \
+                            _DD_NEW_LINE_SMOOTH |      \
+                            _DD_NEW_LINE_STIPPLE |     \
+                            _DD_NEW_LINE_WIDTH |       \
+                            _DD_NEW_POINT_SMOOTH |     \
+                            _DD_NEW_POINT_SIZE |       \
+                            _NEW_LINE)
+
+
+/* Covers the state referenced by fxDDChooseSetupFunction.
+ */
+#define _FX_NEW_SETUP_FUNCTION (_NEW_LIGHT|    \
+                               _NEW_FOG|       \
+                               _NEW_TEXTURE|   \
+                               _NEW_COLOR)     \
+
+
+/* lookup table for scaling y bit colors up to 8 bits */
+extern GLuint FX_rgb_scale_4[16];
+extern GLuint FX_rgb_scale_5[32];
+extern GLuint FX_rgb_scale_6[64];
+
+typedef void (*fx_tri_func) (fxMesaContext, GrVertex *, GrVertex *, GrVertex *);
+typedef void (*fx_line_func) (fxMesaContext, GrVertex *, GrVertex *);
+typedef void (*fx_point_func) (fxMesaContext, GrVertex *);
+
+struct tfxMesaContext
+{
+   GrTexTable_t glbPalType;
+   GuTexPalette glbPalette;
+
+   GLcontext *glCtx;           /* the core Mesa context */
+   GLvisual *glVis;            /* describes the color buffer */
+   GLframebuffer *glBuffer;    /* the ancillary buffers */
+
+   GLint board;                        /* the board used for this context */
+   GLint width, height;                /* size of color buffer */
+
+   GrBuffer_t currentFB;
+
+   GLboolean bgrOrder;
+   GrColor_t color;
+   GrColor_t clearC;
+   GrAlpha_t clearA;
+   GLuint constColor;
+   GrCullMode_t cullMode;
+
+   tfxUnitsState unitsState;
+   tfxUnitsState restoreUnitsState;    /* saved during multipass */
+   GLboolean multipass;                        /* true when drawing intermediate pass */
+
+   GLuint new_state;
+   GLuint new_gl_state;
+
+   /* Texture Memory Manager Data
+    */
+   GLuint texBindNumber;
+   GLint tmuSrc;
+   GLuint lastUnitsMode;
+   GLuint freeTexMem[FX_NUM_TMU];
+   MemRange *tmPool;
+   MemRange *tmFree[FX_NUM_TMU];
+
+   GLenum fogTableMode;
+   GLfloat fogDensity;
+   GLfloat fogStart, fogEnd;
+   GrFog_t *fogTable;
+   GLint textureAlign;
+   GLint textureMaxLod;
+
+   /* Vertex building and storage:
+    */
+   GLuint tmu_source[FX_NUM_TMU];
+   GLuint SetupIndex;
+   GLuint stw_hint_state;      /* for grHints */
+   GrVertex *verts;
+   GLboolean snapVertices;      /* needed for older Voodoo hardware */
+
+   /* Rasterization:
+    */
+   GLuint render_index;
+   GLuint fallback;
+   GLenum render_primitive;
+   GLenum raster_primitive;
+
+   /* Current rasterization functions
+    */
+   fx_point_func draw_point;
+   fx_line_func draw_line;
+   fx_tri_func draw_tri;
+
+
+   /* Keep texture scales somewhere handy:
+    */
+   GLfloat s0scale;
+   GLfloat s1scale;
+   GLfloat t0scale;
+   GLfloat t1scale;
+
+   GLfloat inv_s0scale;
+   GLfloat inv_s1scale;
+   GLfloat inv_t0scale;
+   GLfloat inv_t1scale;
+
+   /* Glide stuff
+    */
+   tfxStats stats;
+   void *state;
+
+   /* Options */
+
+   GLboolean verbose;
+   GLboolean haveTwoTMUs;      /* True if we really have 2 tmu's  */
+   GLboolean haveHwAlpha;
+   GLboolean haveHwStencil;
+   GLboolean haveZBuffer;
+   GLboolean haveDoubleBuffer;
+   GLboolean haveGlobalPaletteTexture;
+   GLint swapInterval;
+   GLint maxPendingSwapBuffers;
+
+   GrContext_t glideContext;
+
+   int screen_width;
+   int screen_height;
+   int clipMinX;
+   int clipMaxX;
+   int clipMinY;
+   int clipMaxY;
+
+   int colDepth;
+   GLboolean fsaa;
+
+   /* Glide (per card) capabilities. These get mirrored
+    * from `glbHWConfig' when creating a new context...
+    */
+   GrSstType type;
+   FxBool HavePalExt;  /* PALETTE6666 */
+   FxBool HavePixExt;  /* PIXEXT */
+   FxBool HaveTexFmt;  /* TEXFMT */
+   FxBool HaveCmbExt;  /* COMBINE */
+   FxBool HaveMirExt;  /* TEXMIRROR */
+   FxBool HaveTexUma;  /* TEXUMA */
+   FxBool HaveTexus2;  /* Texus 2 - FXT1 */
+   struct tdfx_glide Glide;
+   char rendererString[64];
 };
 
-typedef void (*tfxSetupFunc)(struct vertex_buffer *, GLuint, GLuint);
-
-extern GrHwConfiguration glbHWConfig;
-extern int glbCurrentBoard;
 
 extern void fxSetupFXUnits(GLcontext *);
 extern void fxSetupDDPointers(GLcontext *);
-extern void fxDDSetNearFar(GLcontext *, GLfloat, GLfloat);
 
-extern void fxDDSetupInit(void);
-extern void fxDDCvaInit(void);
-extern void fxDDTrifuncInit(void);
-extern void fxDDFastPathInit(void);
+/* fxvb.c:
+ */
+extern void fxAllocVB(GLcontext * ctx);
+extern void fxFreeVB(GLcontext * ctx);
+extern void fxPrintSetupFlags(char *msg, GLuint flags );
+extern void fxCheckTexSizes( GLcontext *ctx );
+extern void fxBuildVertices( GLcontext *ctx, GLuint start, GLuint end,
+                            GLuint newinputs );
+extern void fxChooseVertexState( GLcontext *ctx );
 
-extern void fxDDChooseRenderState( GLcontext *ctx );
 
-extern void fxRenderClippedLine( struct vertex_buffer *VB, 
-                                GLuint v1, GLuint v2 );
 
-extern void fxRenderClippedTriangle( struct vertex_buffer *VB,
-                                    GLuint n, GLuint vlist[] );
 
 
-extern tfxSetupFunc fxDDChooseSetupFunction(GLcontext *);
 
-extern points_func fxDDChoosePointsFunction(GLcontext *);
-extern line_func fxDDChooseLineFunction(GLcontext *);
-extern triangle_func fxDDChooseTriangleFunction(GLcontext *);
-extern quad_func fxDDChooseQuadFunction(GLcontext *);
-extern render_func **fxDDChooseRenderVBTables(GLcontext *);
+/* fxtrifuncs:
+ */
+extern void fxDDInitTriFuncs(GLcontext *);
+extern void fxDDChooseRenderState(GLcontext * ctx);
 
-extern void fxDDRenderInit(GLcontext *);
-extern void fxDDClipInit(void);
 
 extern void fxUpdateDDSpanPointers(GLcontext *);
 extern void fxSetupDDSpanPointers(GLcontext *);
 
-extern void fxPrintTextureData(tfxTexInfo *ti);
-extern void fxDDTexEnv(GLcontext *, GLenum, const GLfloat *);
-extern void fxDDTexImg(GLcontext *, GLenum, struct gl_texture_object *,
-                      GLint, GLint, const struct gl_texture_image *);
+extern void fxPrintTextureData(tfxTexInfo * ti);
+
+extern const struct gl_texture_format *
+fxDDChooseTextureFormat( GLcontext *ctx, GLint internalFormat,
+                         GLenum srcFormat, GLenum srcType );
+extern void fxDDTexImage2D(GLcontext * ctx, GLenum target, GLint level,
+                          GLint internalFormat, GLint width, GLint height,
+                          GLint border, GLenum format, GLenum type,
+                          const GLvoid * pixels,
+                          const struct gl_pixelstore_attrib *packing,
+                          struct gl_texture_object *texObj,
+                          struct gl_texture_image *texImage);
+extern void fxDDTexSubImage2D(GLcontext * ctx, GLenum target, GLint level,
+                             GLint xoffset, GLint yoffset,
+                             GLsizei width, GLsizei height,
+                             GLenum format, GLenum type,
+                             const GLvoid * pixels,
+                             const struct gl_pixelstore_attrib *packing,
+                             struct gl_texture_object *texObj,
+                             struct gl_texture_image *texImage);
+extern void fxDDCompressedTexImage2D(GLcontext *ctx, GLenum target,
+                                     GLint level, GLint internalFormat,
+                                     GLsizei width, GLsizei height, GLint border,
+                                     GLsizei imageSize, const GLvoid *data,
+                                     struct gl_texture_object *texObj,
+                                     struct gl_texture_image *texImage);
+extern void fxDDCompressedTexSubImage2D(GLcontext *ctx, GLenum target,
+                                        GLint level, GLint xoffset,
+                                        GLint yoffset, GLsizei width,
+                                        GLint height, GLenum format,
+                                        GLsizei imageSize, const GLvoid *data,
+                                        struct gl_texture_object *texObj,
+                                        struct gl_texture_image *texImage);
+extern void fxDDTexImage1D(GLcontext * ctx, GLenum target, GLint level,
+                          GLint internalFormat, GLint width,
+                          GLint border, GLenum format, GLenum type,
+                          const GLvoid * pixels,
+                          const struct gl_pixelstore_attrib *packing,
+                          struct gl_texture_object *texObj,
+                          struct gl_texture_image *texImage);
+extern void fxDDTexSubImage1D(GLcontext * ctx, GLenum target, GLint level,
+                             GLint xoffset, GLint width,
+                             GLenum format, GLenum type,
+                             const GLvoid * pixels,
+                             const struct gl_pixelstore_attrib *packing,
+                             struct gl_texture_object *texObj,
+                             struct gl_texture_image *texImage);
+extern GLboolean fxDDTestProxyTexImage (GLcontext *ctx, GLenum target,
+                                        GLint level, GLint internalFormat,
+                                        GLenum format, GLenum type,
+                                        GLint width, GLint height,
+                                        GLint depth, GLint border);
+extern void fxDDTexEnv(GLcontext *, GLenum, GLenum, const GLfloat *);
 extern void fxDDTexParam(GLcontext *, GLenum, struct gl_texture_object *,
                         GLenum, const GLfloat *);
 extern void fxDDTexBind(GLcontext *, GLenum, struct gl_texture_object *);
+extern struct gl_texture_object *fxDDNewTextureObject( GLcontext *ctx, GLuint name, GLenum target );
 extern void fxDDTexDel(GLcontext *, struct gl_texture_object *);
+extern GLboolean fxDDIsTextureResident(GLcontext *, struct gl_texture_object *);
 extern void fxDDTexPalette(GLcontext *, struct gl_texture_object *);
-extern void fxDDTexuseGlbPalette(GLcontext *, GLboolean);
-extern void fxDDTexSubImg(GLcontext *, GLenum, struct gl_texture_object *, GLint,
-                         GLint, GLint, GLint, GLint, GLint, const struct gl_texture_image *);
 extern void fxDDTexUseGlbPalette(GLcontext *, GLboolean);
 
 extern void fxDDEnable(GLcontext *, GLenum, GLboolean);
-extern void fxDDAlphaFunc(GLcontext *, GLenum, GLclampf);
-extern void fxDDBlendFunc(GLcontext *, GLenum, GLenum);
+extern void fxDDAlphaFunc(GLcontext *, GLenum, GLfloat);
+extern void fxDDBlendFuncSeparate(GLcontext *, GLenum, GLenum, GLenum, GLenum);
+extern void fxDDBlendEquationSeparate(GLcontext *, GLenum, GLenum);
 extern void fxDDDepthMask(GLcontext *, GLboolean);
 extern void fxDDDepthFunc(GLcontext *, GLenum);
+extern void fxDDStencilFuncSeparate (GLcontext *ctx, GLenum face, GLenum func, GLint ref, GLuint mask);
+extern void fxDDStencilMaskSeparate (GLcontext *ctx, GLenum face, GLuint mask);
+extern void fxDDStencilOpSeparate (GLcontext *ctx, GLenum face, GLenum sfail, GLenum zfail, GLenum zpass);
 
-extern void fxDDRegisterVB( struct vertex_buffer *VB );
-extern void fxDDUnregisterVB( struct vertex_buffer *VB );
-extern void fxDDResizeVB( struct vertex_buffer *VB, GLuint size );
-
-extern void fxDDCheckMergeAndRender( GLcontext *ctx, 
-                                    struct gl_pipeline_stage *d );
-
-extern void fxDDMergeAndRender( struct vertex_buffer *VB );
-
-extern void fxDDCheckPartialRasterSetup( GLcontext *ctx, 
-                                        struct gl_pipeline_stage *d );
-
-extern void fxDDPartialRasterSetup( struct vertex_buffer *VB );
-
-extern void fxDDDoRasterSetup( struct vertex_buffer *VB );
-
-extern GLuint fxDDRegisterPipelineStages( struct gl_pipeline_stage *out,
-                                         const struct gl_pipeline_stage *in,
-                                         GLuint nr );
-
-extern GLboolean fxDDBuildPrecalcPipeline( GLcontext *ctx );
-
-extern void fxDDOptimizePrecalcPipeline( GLcontext *ctx, 
-                                        struct gl_pipeline *pipe );
+extern void fxDDInitExtensions(GLcontext * ctx);
 
-extern void fxDDRenderElementsDirect( struct vertex_buffer *VB );
-extern void fxDDRenderVBIndirectDirect( struct vertex_buffer *VB );
-
-extern void fxDDInitExtensions( GLcontext *ctx );
-
-#define fxTMGetTexInfo(o) ((tfxTexInfo*)((o)->DriverData))
 extern void fxTMInit(fxMesaContext ctx);
 extern void fxTMClose(fxMesaContext ctx);
+extern void fxTMRestoreTextures_NoLock(fxMesaContext ctx);
 extern void fxTMMoveInTM(fxMesaContext, struct gl_texture_object *, GLint);
 extern void fxTMMoveOutTM(fxMesaContext, struct gl_texture_object *);
 #define fxTMMoveOutTM_NoLock fxTMMoveOutTM
 extern void fxTMFreeTexture(fxMesaContext, struct gl_texture_object *);
-extern void fxTMReloadMipMapLevel(fxMesaContext, struct gl_texture_object *, GLint);
-extern void fxTMReloadSubMipMapLevel(fxMesaContext, struct gl_texture_object *,
-                                    GLint, GLint, GLint);
+extern void fxTMReloadMipMapLevel(fxMesaContext, struct gl_texture_object *,
+                                 GLint);
+extern void fxTMReloadSubMipMapLevel(fxMesaContext,
+                                    struct gl_texture_object *, GLint, GLint,
+                                    GLint);
+extern int fxTMCheckStartAddr (fxMesaContext fxMesa, GLint tmu, tfxTexInfo *ti);
+
+extern void fxTexGetFormat(GLcontext *, GLenum, GrTextureFormat_t *, GLint *); /* [koolsmoky] */
 
-extern void fxTexGetFormat(GLenum, GrTextureFormat_t *, GLint *);
 extern int fxTexGetInfo(int, int, GrLOD_t *, GrAspectRatio_t *,
-                       float *, float *, int *, int *, int *, int *);
+                       float *, float *, int *, int *);
+
+extern void fxDDScissor(GLcontext * ctx,
+                       GLint x, GLint y, GLsizei w, GLsizei h);
+extern void fxDDFogfv(GLcontext * ctx, GLenum pname, const GLfloat * params);
+extern void fxDDColorMask(GLcontext * ctx,
+                         GLboolean r, GLboolean g, GLboolean b, GLboolean a);
+
+extern void fxDDWriteDepthSpan(GLcontext * ctx, GLuint n, GLint x, GLint y,
+                              const GLuint depth[], const GLubyte mask[]);
 
-extern void fxDDScissor( GLcontext *ctx,
-                             GLint x, GLint y, GLsizei w, GLsizei h );
-extern void fxDDFogfv( GLcontext *ctx, GLenum pname, const GLfloat *params );
-extern GLboolean fxDDColorMask(GLcontext *ctx, 
-                              GLboolean r, GLboolean g, 
-                              GLboolean b, GLboolean a );
+extern void fxDDReadDepthSpan(GLcontext * ctx, GLuint n, GLint x, GLint y,
+                             GLuint depth[]);
 
-extern void fxDDWriteDepthSpan(GLcontext *ctx, GLuint n, GLint x, GLint y,
-                               const GLdepth depth[], const GLubyte mask[]);
+extern void fxDDWriteDepthPixels(GLcontext * ctx, GLuint n,
+                                const GLint x[], const GLint y[],
+                                const GLuint depth[], const GLubyte mask[]);
 
-extern void fxDDReadDepthSpan(GLcontext *ctx, GLuint n, GLint x, GLint y,
-                              GLdepth depth[]);
+extern void fxDDReadDepthPixels(GLcontext * ctx, GLuint n,
+                               const GLint x[], const GLint y[],
+                               GLuint depth[]);
 
-extern void fxDDWriteDepthPixels(GLcontext *ctx, GLuint n,
-                                 const GLint x[], const GLint y[],
-                                 const GLdepth depth[], const GLubyte mask[]);
+extern void fxDDShadeModel(GLcontext * ctx, GLenum mode);
 
-extern void fxDDReadDepthPixels(GLcontext *ctx, GLuint n,
-                                const GLint x[], const GLint y[],
-                                GLdepth depth[]);
+extern void fxDDCullFace(GLcontext * ctx, GLenum mode);
+extern void fxDDFrontFace(GLcontext * ctx, GLenum mode);
 
-extern void fxDDFastPath( struct vertex_buffer *VB );
+extern void fxPrintRenderState(const char *msg, GLuint state);
+extern void fxPrintHintState(const char *msg, GLuint state);
 
-extern void fxDDShadeModel(GLcontext *ctx, GLenum mode);
+extern int fxDDInitFxMesaContext(fxMesaContext fxMesa);
+extern void fxDDDestroyFxMesaContext(fxMesaContext fxMesa);
 
-extern void fxDDCullFace(GLcontext *ctx, GLenum mode);
-extern void fxDDFrontFace(GLcontext *ctx, GLenum mode);
 
-extern void fxPrintRenderState( const char *msg, GLuint state );
-extern void fxPrintHintState( const char *msg, GLuint state );
+extern void fxSetScissorValues(GLcontext * ctx);
+extern void fxTMMoveInTM_NoLock(fxMesaContext fxMesa,
+                               struct gl_texture_object *tObj, GLint where);
 
-extern void fxDDDoRenderVB( struct vertex_buffer *VB );
+extern void fxCheckIsInHardware(GLcontext *ctx);
 
-extern int fxDDInitFxMesaContext( fxMesaContext fxMesa );
+/* fxsetup:
+ * semi-private functions
+ */
+void fxSetupCull (GLcontext * ctx);
+void fxSetupScissor (GLcontext * ctx);
+void fxSetupColorMask (GLcontext * ctx);
+void fxSetupBlend (GLcontext *ctx);
+void fxSetupDepthTest (GLcontext *ctx);
+void fxSetupTexture (GLcontext *ctx);
+void fxSetupStencil (GLcontext *ctx);
+void fxSetupStencilFace (GLcontext *ctx, GLint face);
+
+/* Flags for software fallback cases */
+#define FX_FALLBACK_TEXTURE_MAP                0x0001
+#define FX_FALLBACK_DRAW_BUFFER                0x0002
+#define FX_FALLBACK_SPECULAR           0x0004
+#define FX_FALLBACK_STENCIL            0x0008
+#define FX_FALLBACK_RENDER_MODE                0x0010
+#define FX_FALLBACK_LOGICOP            0x0020
+#define FX_FALLBACK_TEXTURE_ENV                0x0040
+#define FX_FALLBACK_TEXTURE_BORDER     0x0080
+#define FX_FALLBACK_COLORMASK          0x0100
+#define FX_FALLBACK_BLEND              0x0200
+#define FX_FALLBACK_TEXTURE_MULTI      0x0400
+
+extern GLuint fx_check_IsInHardware(GLcontext *ctx);
+
+/***
+ *** CNORM: clamp float to [0,1] and map to float in [0,255]
+ ***/
+#if defined(USE_IEEE) && !defined(DEBUG)
+#define IEEE_0996 0x3f7f0000   /* 0.996 or so */
+#define CNORM(N, F)                            \
+        do {                                   \
+           fi_type __tmp;                      \
+           __tmp.f = (F);                      \
+           if (__tmp.i < 0)                    \
+              N = 0;                           \
+           else if (__tmp.i >= IEEE_0996)      \
+              N = 255.0f;                      \
+           else {                              \
+              N = (F) * 255.0f;                        \
+           }                                   \
+        } while (0)
+#else
+#define CNORM(n, f) \
+       n = (CLAMP((f), 0.0F, 1.0F) * 255.0F)
+#endif
 
+/* run-time debugging */
+#ifndef FX_DEBUG
+#define FX_DEBUG 0
+#endif
+#if FX_DEBUG
+extern int TDFX_DEBUG;
+#else
+#define TDFX_DEBUG             0
+#endif
 
-extern void fxSetScissorValues(GLcontext *ctx);
-extern void fxTMMoveInTM_NoLock(fxMesaContext fxMesa, 
-                               struct gl_texture_object *tObj, 
-                               GLint where);
-extern void fxInitPixelTables(fxMesaContext fxMesa, GLboolean bgrOrder);
+/* dirty hacks */
+#define FX_RESCALE_BIG_TEXURES_HACK   1
+#define FX_COMPRESS_S3TC_AS_FXT1_HACK 1
 
 #endif