i965: Remove BRW_WM_LOCK dirty bit, introduced to work around lack of relocs.
[mesa.git] / src / mesa / drivers / glide / fxglidew.h
index c02045f4597f373a7f477aa5ba7ef34964f5501c..a19d0b58c73ea99a8527e0a59e51178538556147 100644 (file)
@@ -1,19 +1,19 @@
 /*
  * Mesa 3-D graphics library
- * Version:  3.1
- * 
- * Copyright (C) 1999  Brian Paul   All Rights Reserved.
- * 
+ * Version:  4.0
+ *
+ * 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"),
  * to deal in the Software without restriction, including without limitation
  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  * 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 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 NONINFRINGEMENT.  IN NO EVENT SHALL
  * 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.
  */
+
+/* Authors:
+ *    David Bucciarelli
+ *    Brian Paul
+ *    Daryll Strauss
+ *    Keith Whitwell
+ *    Daniel Borca
+ *    Hiroshi Morii
+ */
+
+
 #ifndef __FX_GLIDE_WARPER__
 #define __FX_GLIDE_WARPER__
 
-#include <glide.h>
 
-/* 
- * General context: 
- */
-#if !defined(FX_GLIDE3)
-     typedef FxU32      FX_GrContext_t;        /* Not used in Glide2 */
-#else
-     typedef GrContext_t FX_GrContext_t;
-#endif
+#include "fxg.h"
 
-/* 
- * Glide3 emulation on Glide2: 
- */
-#if !defined(FX_GLIDE3)
-       /* Constanst for FX_grGetInteger( ) */
-       #define FX_FOG_TABLE_ENTRIES            0x0004    /* The number of entries in the hardware fog table. */
-       #define FX_GLIDE_STATE_SIZE             0x0006    /* Size of buffer, in bytes, needed to save Glide state. */
-       #define FX_LFB_PIXEL_PIPE               0x0009    /* 1 if LFB writes can go through the 3D pixel pipe. */               
-       #define FX_PENDING_BUFFERSWAPS          0x0014    /* The number of buffer swaps pending. */
-#else
-        #define FX_FOG_TABLE_ENTRIES            GR_FOG_TABLE_ENTRIES  
-       #define FX_GLIDE_STATE_SIZE             GR_GLIDE_STATE_SIZE
-       #define FX_LFB_PIXEL_PIPE               GR_LFB_PIXEL_PIPE               
-       #define FX_PENDING_BUFFERSWAPS          GR_PENDING_BUFFERSWAPS  
+#ifndef FX_PACKEDCOLOR
+#define FX_PACKEDCOLOR 1
 #endif
 
-/*
- * Genral warper functions for Glide2/Glide3:
- */ 
-extern FxI32 FX_grGetInteger(FxU32 pname);
+#define MAX_NUM_SST             4
 
-/*
- * Glide2 emulation on Glide3:
- */
-#if defined(FX_GLIDE3)
-
-#define GR_ASPECT_1x1 GR_ASPECT_LOG2_1x1
-#define GR_ASPECT_2x1 GR_ASPECT_LOG2_2x1
-#define GR_ASPECT_4x1 GR_ASPECT_LOG2_4x1
-#define GR_ASPECT_8x1 GR_ASPECT_LOG2_8x1
-#define GR_ASPECT_1x2 GR_ASPECT_LOG2_1x2
-#define GR_ASPECT_1x4 GR_ASPECT_LOG2_1x4
-#define GR_ASPECT_1x8 GR_ASPECT_LOG2_1x8
-
-#define GR_LOD_256     GR_LOD_LOG2_256
-#define GR_LOD_128     GR_LOD_LOG2_128
-#define GR_LOD_64      GR_LOD_LOG2_64
-#define GR_LOD_32      GR_LOD_LOG2_32  
-#define GR_LOD_16      GR_LOD_LOG2_16
-#define GR_LOD_8       GR_LOD_LOG2_8
-#define GR_LOD_4       GR_LOD_LOG2_4
-#define GR_LOD_2       GR_LOD_LOG2_2
-#define GR_LOD_1       GR_LOD_LOG2_1
-
-#define GR_FOG_WITH_TABLE GR_FOG_WITH_TABLE_ON_Q
+enum {
+      GR_SSTTYPE_VOODOO  = 0,
+      GR_SSTTYPE_SST96   = 1,
+      GR_SSTTYPE_AT3D    = 2,
+      GR_SSTTYPE_Voodoo2 = 3,
+      GR_SSTTYPE_Banshee = 4,
+      GR_SSTTYPE_Voodoo3 = 5,
+      GR_SSTTYPE_Voodoo4 = 6,
+      GR_SSTTYPE_Voodoo5 = 7
+};
 
-typedef int GrSstType;
-
-#define MAX_NUM_SST            4
+#define GrState                 void
 
-#define GR_SSTTYPE_VOODOO    0
-#define GR_SSTTYPE_SST96     1
-#define GR_SSTTYPE_AT3D      2
-#define GR_SSTTYPE_Voodoo2   3
+typedef int GrSstType;
 
 typedef struct GrTMUConfig_St {
-  int    tmuRev;                /* Rev of Texelfx chip */
-  int    tmuRam;                /* 1, 2, or 4 MB */
+        int tmuRev;            /* Rev of Texelfx chip */
+        int tmuRam;            /* 1, 2, or 4 MB */
 } GrTMUConfig_t;
 
-typedef struct GrVoodooConfig_St {
-  int    fbRam;                         /* 1, 2, or 4 MB */
-  int    fbiRev;                        /* Rev of Pixelfx chip */
-  int    nTexelfx;                      /* How many texelFX chips are there? */
-  FxBool sliDetect;                     /* Is it a scan-line interleaved board? */
-  GrTMUConfig_t tmuConfig[GLIDE_NUM_TMU];   /* Configuration of the Texelfx chips */
-} GrVoodooConfig_t;
-
-typedef struct GrSst96Config_St {
-  int   fbRam;                  /* How much? */
-  int   nTexelfx;
-  GrTMUConfig_t tmuConfig;
-} GrSst96Config_t;
-
-typedef GrVoodooConfig_t GrVoodoo2Config_t;
-
-typedef struct GrAT3DConfig_St {
-  int   rev;
-} GrAT3DConfig_t;
-
 typedef struct {
-  int num_sst;                  /* # of HW units in the system */
-  struct {
-    GrSstType type;             /* Which hardware is it? */
-    union SstBoard_u {
-      GrVoodooConfig_t  VoodooConfig;
-      GrSst96Config_t   SST96Config;
-      GrAT3DConfig_t    AT3DConfig;
-      GrVoodoo2Config_t Voodoo2Config;
-    } sstBoard;
-  } SSTs[MAX_NUM_SST];          /* configuration for each board */
+        int num_sst;           /* # of HW units in the system */
+        struct SstCard_St {
+               GrSstType type; /* Which hardware is it? */
+               int fbRam;      /* 1, 2, or 4 MB */
+               int fbiRev;     /* Rev of Pixelfx chip */
+               int nTexelfx;   /* How many texelFX chips are there? */
+               int numChips;   /* Number of Voodoo chips */
+               GrTMUConfig_t tmuConfig[GLIDE_NUM_TMU]; /* Configuration of the Texelfx chips */
+               /* Glide3 extensions */
+               FxBool HavePalExt;      /* PALETTE6666 */
+               FxBool HavePixExt;      /* PIXEXT */
+               FxBool HaveTexFmt;      /* TEXFMT */
+               FxBool HaveCmbExt;      /* COMBINE */
+               FxBool HaveMirExt;      /* TEXMIRROR */
+               FxBool HaveTexUma;      /* TEXUMA */
+        }
+        SSTs[MAX_NUM_SST];     /* configuration for each board */
+        struct tdfx_glide Glide;
 } GrHwConfiguration;
 
+
+
 typedef FxU32 GrHint_t;
-#define GR_HINTTYPE_MIN                 0
-#define GR_HINT_STWHINT                 0
+#define GR_HINTTYPE_MIN         0
+#define GR_HINT_STWHINT         0
 
 typedef FxU32 GrSTWHint_t;
 #define GR_STWHINT_W_DIFF_FBI   FXBIT(0)
@@ -141,31 +100,31 @@ typedef FxU32 GrSTWHint_t;
 #define GR_STWHINT_W_DIFF_TMU2  FXBIT(5)
 #define GR_STWHINT_ST_DIFF_TMU2 FXBIT(6)
 
-#define GR_CONTROL_ACTIVATE            1
-#define GR_CONTROL_DEACTIVATE          0
+#define GR_CONTROL_ACTIVATE     1
+#define GR_CONTROL_DEACTIVATE   0
+
 
-#define GrState                                void
 
 /*
 ** move the vertex layout defintion to application
 */
 typedef struct {
-  float  sow;                   /* s texture ordinate (s over w) */
-  float  tow;                   /* t texture ordinate (t over w) */  
-  float  oow;                   /* 1/w (used mipmapping - really 0xfff/w) */
-}  GrTmuVertex;
-
-
-#if FX_USE_PARGB
-
-typedef struct
-{
-  float x, y;         /* X and Y in screen space */
-  float ooz;          /* 65535/Z (used for Z-buffering) */
-  float oow;          /* 1/W (used for W-buffering, texturing) */
-  FxU32 argb;         /* R, G, B, A [0..255.0] */
-  GrTmuVertex         tmuvtx[GLIDE_NUM_TMU];
-  float z;            /* Z is ignored */
+        float sow;             /* s texture ordinate (s over w) */
+        float tow;             /* t texture ordinate (t over w) */
+        float oow;             /* 1/w (used mipmapping - really 0xfff/w) */
+} GrTmuVertex;
+
+#if FX_PACKEDCOLOR
+typedef struct {
+        float x, y;            /* X and Y in screen space */
+        float ooz;             /* 65535/Z (used for Z-buffering) */
+        float oow;             /* 1/W (used for W-buffering, texturing) */
+        unsigned char pargb[4];        /* B, G, R, A [0..255] */
+        GrTmuVertex tmuvtx[GLIDE_NUM_TMU];
+        float fog;             /* fog coordinate */
+        unsigned char pspec[4];        /* B, G, R, A [0..255] */
+        float psize;           /* point size */
+        long pad[16 - 14];     /* ensure 64b structure */
 } GrVertex;
 
 #define GR_VERTEX_X_OFFSET              0
@@ -179,225 +138,91 @@ typedef struct
 #define GR_VERTEX_SOW_TMU1_OFFSET       8
 #define GR_VERTEX_TOW_TMU1_OFFSET       9
 #define GR_VERTEX_OOW_TMU1_OFFSET       10
-#define GR_VERTEX_Z_OFFSET             11
-
-#define GET_PARGB(v)   ((FxU32*)(v))[GR_VERTEX_PARGB_OFFSET]
-/* GET_PA: returns the alpha component */
-#if GLIDE_ENDIAN == GLIDE_ENDIAN_BIG
-   #define GET_PA(v)           ((FxU8*)(v))[GR_VERTEX_PARGB_OFFSET*4]
-#else 
-   #define GET_PA(v)           ((FxU8*)(v))[GR_VERTEX_PARGB_OFFSET*4+3]
-#endif 
-#define MESACOLOR2PARGB(c)     (c[ACOMP] << 24 | c[GCOMP] << 16 | c[GCOMP] << 8 | c[BCOMP])
-#define PACK_4F_ARGB(dest,a,r,g,b) {                                                           \
-                                            const GLuint cr = (int)r;                          \
-                                            const GLuint cg = (int)g;                          \
-                                            const GLuint ca = (int)a;                          \
-                                            const GLuint cb = (int)b;                          \
-                                            dest = ca << 24 | cr << 16 | cg << 8 | cb;         \
-                                       }
-
-#else /* FX_USE_PARGB */
-
-typedef struct
-{
-  float x, y;         /* X and Y in screen space */
-  float ooz;          /* 65535/Z (used for Z-buffering) */
-  float oow;          /* 1/W (used for W-buffering, texturing) */
-  float r, g, b, a;   /* R, G, B, A [0..255.0] */
-  float z;            /* Z is ignored */
-  GrTmuVertex  tmuvtx[GLIDE_NUM_TMU];
+#define GR_VERTEX_FOG_OFFSET            11
+#define GR_VERTEX_PSPEC_OFFSET          12
+#else  /* !FX_PACKEDCOLOR */
+typedef struct {
+        float x, y;            /* X and Y in screen space */
+        float ooz;             /* 65535/Z (used for Z-buffering) */
+        float oow;             /* 1/W (used for W-buffering, texturing) */
+        float r, g, b, a;      /* R, G, B, A [0..255] */
+        GrTmuVertex tmuvtx[GLIDE_NUM_TMU];
+        float fog;             /* fog coordinate */
+        float r1, g1, b1;      /* R, G, B [0..255] */
+        float psize;           /* point size */
+        long pad[20 - 19];     /* ensure multiple of 16 */
 } GrVertex;
 
 #define GR_VERTEX_X_OFFSET              0
 #define GR_VERTEX_Y_OFFSET              1
 #define GR_VERTEX_OOZ_OFFSET            2
 #define GR_VERTEX_OOW_OFFSET            3
-#define GR_VERTEX_R_OFFSET              4
-#define GR_VERTEX_G_OFFSET              5
-#define GR_VERTEX_B_OFFSET              6
+#define GR_VERTEX_RGB_OFFSET            4
 #define GR_VERTEX_A_OFFSET              7
-#define GR_VERTEX_Z_OFFSET              8
-#define GR_VERTEX_SOW_TMU0_OFFSET       9
-#define GR_VERTEX_TOW_TMU0_OFFSET       10
-#define GR_VERTEX_OOW_TMU0_OFFSET       11
-#define GR_VERTEX_SOW_TMU1_OFFSET       12
-#define GR_VERTEX_TOW_TMU1_OFFSET       13
-#define GR_VERTEX_OOW_TMU1_OFFSET       14
-#endif /* FX_USE_PARGB */
+#define GR_VERTEX_SOW_TMU0_OFFSET       8
+#define GR_VERTEX_TOW_TMU0_OFFSET       9
+#define GR_VERTEX_OOW_TMU0_OFFSET       10
+#define GR_VERTEX_SOW_TMU1_OFFSET       11
+#define GR_VERTEX_TOW_TMU1_OFFSET       12
+#define GR_VERTEX_OOW_TMU1_OFFSET       13
+#define GR_VERTEX_FOG_OFFSET            14
+#define GR_VERTEX_SPEC_OFFSET           15
+#endif /* !FX_PACKEDCOLOR */
 
-#endif
 
 
-/*
- * Glide2 functions for Glide3
- */
-#if defined(FX_GLIDE3)
-#define FX_grTexDownloadTable(TMU,type,data)           grTexDownloadTable(type,data)
-#else
-#define FX_grTexDownloadTable(TMU,type,data)           grTexDownloadTable(TMU,type,data)
-#endif
-
-/*
- * Flush
- */
-#if defined(FX_GLIDE3)
-#define FX_grFlush             grFlush
-#else
-#define FX_grFlush             grSstIdle
-#endif 
-/*
- * Write region: ToDo possible exploit the PixelPipe parameter.
- */
-#if defined(FX_GLIDE3)
-#define FX_grLfbWriteRegion(dst_buffer,dst_x,dst_y,src_format,src_width,src_height,src_stride,src_data)        \
-       grLfbWriteRegion(dst_buffer,dst_x,dst_y,src_format,src_width,src_height,FXFALSE,src_stride,src_data)
-#else
-#define FX_grLfbWriteRegion(dst_buffer,dst_x,dst_y,src_format,src_width,src_height,src_stride,src_data)        \
-       grLfbWriteRegion(dst_buffer,dst_x,dst_y,src_format,src_width,src_height,src_stride,src_data)
-#endif
 /*
  * For Lod/LodLog2 conversion.
  */
-#if defined(FX_GLIDE3)
-       #define FX_largeLodLog2(info)           (info).largeLodLog2
-#else
-       #define FX_largeLodLog2(info)           (info).largeLod 
-#endif
+#define FX_largeLodLog2(info)          (info).largeLodLog2
+#define FX_aspectRatioLog2(info)       (info).aspectRatioLog2
+#define FX_smallLodLog2(info)          (info).smallLodLog2
+#define FX_lodToValue(val)             ((int)(GR_LOD_LOG2_256-val))
+#define FX_largeLodValue(info)         ((int)(GR_LOD_LOG2_256-(info).largeLodLog2))
+#define FX_smallLodValue(info)         ((int)(GR_LOD_LOG2_256-(info).smallLodLog2))
+#define FX_valueToLod(val)             ((GrLOD_t)(GR_LOD_LOG2_256-val))
 
-#if defined(FX_GLIDE3)
-       #define FX_aspectRatioLog2(info)                (info).aspectRatioLog2
-#else
-       #define FX_aspectRatioLog2(info)                (info).aspectRatio
-#endif
 
-#if defined(FX_GLIDE3)
-       #define FX_smallLodLog2(info)           (info).smallLodLog2
-#else
-       #define FX_smallLodLog2(info)           (info).smallLod
-#endif
-
-#if defined(FX_GLIDE3)
-       #define FX_lodToValue(val)              ((int)(GR_LOD_256-val))
-#else
-       #define FX_lodToValue(val)              ((int)(val))
-#endif
-
-#if defined(FX_GLIDE3)
-       #define FX_largeLodValue(info)          ((int)(GR_LOD_256-(info).largeLodLog2))
-#else
-       #define FX_largeLodValue(info)          ((int)(info).largeLod)
-#endif
-
-#if defined(FX_GLIDE3)
-       #define FX_smallLodValue(info)          ((int)(GR_LOD_256-(info).smallLodLog2))
-#else
-       #define FX_smallLodValue(info)          ((int)(info).smallLod)
-#endif
-
-#if defined(FX_GLIDE3)
-       #define FX_valueToLod(val)              ((GrLOD_t)(GR_LOD_256-val))
-#else
-       #define FX_valueToLod(val)              ((GrLOD_t)(val))
-#endif
 
 /*
- * ScreenWidth/Height stuff.
+ * Query
  */
-#if defined(FX_GLIDE3)
-       extern int FX_grSstScreenWidth();
-       extern int FX_grSstScreenHeight();
-#else
-       #define FX_grSstScreenWidth()           grSstScreenWidth()
-       #define FX_grSstScreenHeight()          grSstScreenHeight()
-#endif
-
+extern int FX_grSstScreenWidth(void);
+extern int FX_grSstScreenHeight(void);
+extern void FX_grSstPerfStats(GrSstPerfStats_t *st);
+extern int FX_grSstQueryHardware(GrHwConfiguration *config);
+#define FX_grGetInteger FX_grGetInteger_NoLock
+extern FxI32 FX_grGetInteger_NoLock(FxU32 pname);
 
-/*
- * Version string.
- */
-#if defined(FX_GLIDE3)
-       extern void FX_grGlideGetVersion(char *buf);
-#else
-       #define FX_grGlideGetVersion            grGlideGetVersion       
-#endif
-/*
- * Performance statistics
- */
-#if defined(FX_GLIDE3)
-        extern void FX_grSstPerfStats(GrSstPerfStats_t *st);
-#else
-       #define FX_grSstPerfStats               grSstPerfStats
-#endif
 
-/*
- * Hardware Query
- */
-#if defined(FX_GLIDE3)
-       extern int FX_grSstQueryHardware(GrHwConfiguration *config);
-#else
-       #define FX_grSstQueryHardware           grSstQueryHardware              
-#endif
 
 /*
  * GrHints
  */
-#if defined(FX_GLIDE3)
-       extern void FX_grHints(GrHint_t hintType, FxU32 hintMask);
-#else
-       #define FX_grHints                      grHints
-#endif
-/*
- * Antialiashed line+point drawing.
- */
-#if defined(FX_GLIDE3)
-       extern void FX_grAADrawLine(GrVertex *a,GrVertex *b);
-#else
-       #define FX_grAADrawLine                 grAADrawLine
-#endif
+#define FX_grHints FX_grHints_NoLock
+extern void FX_grHints_NoLock(GrHint_t hintType, FxU32 hintMask);
+
 
-#if defined(FX_GLIDE3)
-       extern void FX_grAADrawPoint(GrVertex *a);
-#else
-       #define FX_grAADrawPoint                grAADrawPoint
-#endif
 
 /*
  * Needed for Glide3 only, to set up Glide2 compatible vertex layout.
  */
-#if defined(FX_GLIDE3)
-       extern void FX_setupGrVertexLayout(void);
-#else
-       #define FX_setupGrVertexLayout()                do {} while (0)
-#endif
+extern void FX_setupGrVertexLayout(void);
+
+
+
 /*
  * grSstControl stuff
  */
-#if defined(FX_GLIDE3)
-       extern void FX_grSstControl(int par);
-#else
-       #define FX_grSstControl                         grSstControl
-#endif
-/*
- * grGammaCorrectionValue
- */
-#if defined(FX_GLIDE3)
-      extern void FX_grGammaCorrectionValue(float val);
-#else
-      #define FX_grGammaCorrectionValue                        grGammaCorrectionValue
-#endif
+extern FxBool FX_grSstControl(FxU32 code);
+
+#define FX_grBufferClear(c, a, d)      \
+  do {                                 \
+    BEGIN_CLIP_LOOP();                 \
+    grBufferClear(c, a, d);            \
+    END_CLIP_LOOP();                   \
+  } while (0)
 
-/*
- * WinOpen/Close.
- */
-#if defined(FX_GLIDE3)
-       #define FX_grSstWinOpen(hWnd,screen_resolution,refresh_rate,color_format,origin_location,nColBuffers,nAuxBuffers) \
-                 grSstWinOpen(-1,screen_resolution,refresh_rate,color_format,origin_location,nColBuffers,nAuxBuffers)
-       #define FX_grSstWinClose                grSstWinClose
-#else
-       #define FX_grSstWinOpen         grSstWinOpen
-       #define FX_grSstWinClose(win)   grSstWinClose()
-#endif
 
 
 #endif /* __FX_GLIDE_WARPER__ */