Merge branch 'master' into gallium-texture-transfer
[mesa.git] / src / mesa / drivers / glide / fxglidew.c
index e45dfabcec973b96878660b73841544937c6f3ac..1fedf2ab969d4e650cbdbb6af6b10c134c2f10c7 100644 (file)
@@ -1,5 +1,3 @@
-/* $Id: fxglidew.c,v 1.19 2001/09/23 16:50:01 brianp Exp $ */
-
 /*
  * Mesa 3-D graphics library
  * Version:  4.0
@@ -29,6 +27,8 @@
  *    Brian Paul
  *    Daryll Strauss
  *    Keith Whitwell
+ *    Daniel Borca
+ *    Hiroshi Morii
  */
 
 /* fxsetup.c - 3Dfx VooDoo rendering mode setup functions */
@@ -39,7 +39,6 @@
 #endif
 
 #if defined(FX)
-#include "glide.h"
 #include "fxglidew.h"
 #include "fxdrv.h"
 
 FxI32
 FX_grGetInteger_NoLock(FxU32 pname)
 {
-#if !defined(FX_GLIDE3)
-   switch (pname) {
-   case FX_FOG_TABLE_ENTRIES:
-      return GR_FOG_TABLE_SIZE;
-   case FX_GLIDE_STATE_SIZE:
-      return sizeof(GrState);
-   case FX_LFB_PIXEL_PIPE:
-      return FXFALSE;
-   case FX_PENDING_BUFFERSWAPS:
-      return grBufferNumPending();
-   case FX_TEXTURE_ALIGN:
-      /* This is a guess from reading the glide3 docs */
-      return 8;
-   default:
-      if (MESA_VERBOSE & VERBOSE_DRIVER) {
-        fprintf(stderr, "Wrong parameter in FX_grGetInteger!\n");
-      }
-      return -1;
-   }
-#else
-   FxU32 grname;
-   FxI32 result;
-
-   switch (pname) {
-   case FX_FOG_TABLE_ENTRIES:
-   case FX_GLIDE_STATE_SIZE:
-   case FX_LFB_PIXEL_PIPE:
-   case FX_PENDING_BUFFERSWAPS:
-   case FX_TEXTURE_ALIGN:
-      grname = pname;
-      break;
-   default:
-      if (MESA_VERBOSE & VERBOSE_DRIVER) {
-        fprintf(stderr, "Wrong parameter in FX_grGetInteger!\n");
-      }
-      return -1;
-   }
-
-   grGet(grname, 4, &result);
-   return result;
-#endif
-}
-
-FxI32
-FX_grGetInteger(FxU32 pname)
-{
-   int result;
-
-   BEGIN_BOARD_LOCK();
-   result = FX_grGetInteger_NoLock(pname);
-   END_BOARD_LOCK();
-   return result;
-}
-
-
-FxBool
-FX_grLfbLock(GrLock_t type, GrBuffer_t buffer,
-            GrLfbWriteMode_t writeMode, GrOriginLocation_t origin,
-            FxBool pixelPipeline, GrLfbInfo_t * info)
-{
-   FxBool result;
-
-   BEGIN_BOARD_LOCK();
-   result = grLfbLock(type, buffer, writeMode, origin, pixelPipeline, info);
-   END_BOARD_LOCK();
-   return result;
-}
-
-FxU32
-FX_grTexTextureMemRequired(FxU32 evenOdd, GrTexInfo * info)
-{
-   FxU32 result;
-
-   BEGIN_BOARD_LOCK();
-   result = grTexTextureMemRequired(evenOdd, info);
-   END_BOARD_LOCK();
-   return result;
-}
-
-FxU32
-FX_grTexMinAddress(GrChipID_t tmu)
-{
-   FxU32 result;
-
-   BEGIN_BOARD_LOCK();
-   result = grTexMinAddress(tmu);
-   END_BOARD_LOCK();
-   return result;
-}
+ FxI32 result;
 
-extern FxU32
-FX_grTexMaxAddress(GrChipID_t tmu)
-{
-   FxU32 result;
+ if (grGet(pname, 4, &result)) {
+    return result;
+ }
 
-   BEGIN_BOARD_LOCK();
-   result = grTexMaxAddress(tmu);
-   END_BOARD_LOCK();
  return result;
+ if (TDFX_DEBUG & VERBOSE_DRIVER) {
+    fprintf(stderr, "FX_grGetInteger_NoLock: wrong parameter (%lx)\n", pname);
+ }
return -1;
 }
 
 FxBool
 FX_grSstControl(FxU32 code)
 {
-#if defined(FX_GLIDE3)
    /* The glide 3 sources call for grEnable/grDisable to be called in exchange
     * for grSstControl. */
    switch (code) {
@@ -166,46 +75,8 @@ FX_grSstControl(FxU32 code)
    }
    /* Appearently GR_CONTROL_RESIZE can be ignored. */
    return 1;                   /* OK? */
-#else
-   FxU32 result;
-   BEGIN_BOARD_LOCK();
-   result = grSstControl(code);
-   END_BOARD_LOCK();
-   return result;
-#endif
-}
-
-
-#if defined(FX_GLIDE3)
-
-void
-FX_grGammaCorrectionValue(float val)
-{
-   (void) val;
-/* ToDo */
 }
 
-int
-FX_getFogTableSize(void)
-{
-   int result;
-   BEGIN_BOARD_LOCK();
-   grGet(GR_FOG_TABLE_ENTRIES, sizeof(int), (void *) &result);
-   END_BOARD_LOCK();
-   return result;
-}
-
-int
-FX_getGrStateSize(void)
-{
-   int result;
-   BEGIN_BOARD_LOCK();
-   grGet(GR_GLIDE_STATE_SIZE, sizeof(int), (void *) &result);
-   END_BOARD_LOCK();
-
-   return result;
-
-}
 
 int
 FX_grSstScreenWidth()
@@ -231,14 +102,6 @@ FX_grSstScreenHeight()
    return result[3];
 }
 
-void
-FX_grGlideGetVersion(char *buf)
-{
-   BEGIN_BOARD_LOCK();
-   strcpy(buf, grGetString(GR_VERSION));
-   END_BOARD_LOCK();
-}
-
 void
 FX_grSstPerfStats(GrSstPerfStats_t * st)
 {
@@ -255,31 +118,6 @@ FX_grSstPerfStats(GrSstPerfStats_t * st)
    st->pixelsOut = n;
 }
 
-void
-FX_grAADrawLine(GrVertex * a, GrVertex * b)
-{
-   /* ToDo */
-   BEGIN_CLIP_LOOP();
-   grDrawLine(a, b);
-   END_CLIP_LOOP();
-}
-
-void
-FX_grAADrawPoint(GrVertex * a)
-{
-   BEGIN_CLIP_LOOP();
-   grDrawPoint(a);
-   END_CLIP_LOOP();
-}
-
-void
-FX_grDrawPolygonVertexList(int n, GrVertex * verts)
-{
-   BEGIN_CLIP_LOOP();
-   grDrawVertexArrayContiguous(GR_POLYGON, n, verts, sizeof(GrVertex));
-   END_CLIP_LOOP();
-}
-
 void
 FX_setupGrVertexLayout(void)
 {
@@ -288,8 +126,12 @@ FX_setupGrVertexLayout(void)
 
    grCoordinateSpace(GR_WINDOW_COORDS);
    grVertexLayout(GR_PARAM_XY, GR_VERTEX_X_OFFSET << 2, GR_PARAM_ENABLE);
-   grVertexLayout(GR_PARAM_RGB, GR_VERTEX_R_OFFSET << 2, GR_PARAM_ENABLE);
+#if FX_PACKEDCOLOR
+   grVertexLayout(GR_PARAM_PARGB, GR_VERTEX_PARGB_OFFSET << 2, GR_PARAM_ENABLE);
+#else  /* !FX_PACKEDCOLOR */
+   grVertexLayout(GR_PARAM_RGB, GR_VERTEX_RGB_OFFSET << 2, GR_PARAM_ENABLE);
    grVertexLayout(GR_PARAM_A, GR_VERTEX_A_OFFSET << 2, GR_PARAM_ENABLE);
+#endif /* !FX_PACKEDCOLOR */
    grVertexLayout(GR_PARAM_Q, GR_VERTEX_OOW_OFFSET << 2, GR_PARAM_ENABLE);
    grVertexLayout(GR_PARAM_Z, GR_VERTEX_OOZ_OFFSET << 2, GR_PARAM_ENABLE);
    grVertexLayout(GR_PARAM_ST0, GR_VERTEX_SOW_TMU0_OFFSET << 2,
@@ -334,14 +176,6 @@ FX_grHints_NoLock(GrHint_t hintType, FxU32 hintMask)
    }
 }
 
-void
-FX_grHints(GrHint_t hintType, FxU32 hintMask)
-{
-   BEGIN_BOARD_LOCK();
-   FX_grHints_NoLock(hintType, hintMask);
-   END_BOARD_LOCK();
-}
-
 /*
  * Glide3 doesn't have the grSstQueryHardware function anymore.
  * Instead, we call grGet() and fill in the data structures ourselves.
@@ -360,104 +194,61 @@ FX_grSstQueryHardware(GrHwConfiguration * config)
 
    for (i = 0; i < config->num_sst; i++) {
       FxI32 result;
+      const char *extension;
 
-      config->SSTs[i].type = GR_SSTTYPE_VOODOO;
       grSstSelect(i);
 
+      extension = grGetString(GR_HARDWARE);
+      if (strstr(extension, "Rush")) {
+         config->SSTs[i].type = GR_SSTTYPE_SST96;
+      } else if (strstr(extension, "Voodoo2")) {
+         config->SSTs[i].type = GR_SSTTYPE_Voodoo2;
+      } else if (strstr(extension, "Voodoo Banshee")) {
+         config->SSTs[i].type = GR_SSTTYPE_Banshee;
+      } else if (strstr(extension, "Voodoo3")) {
+         config->SSTs[i].type = GR_SSTTYPE_Voodoo3;
+      } else if (strstr(extension, "Voodoo4")) {
+         config->SSTs[i].type = GR_SSTTYPE_Voodoo4;
+      } else if (strstr(extension, "Voodoo5")) {
+         config->SSTs[i].type = GR_SSTTYPE_Voodoo5;
+      } else {
+         config->SSTs[i].type = GR_SSTTYPE_VOODOO;
+      }
+
       grGet(GR_MEMORY_FB, 4, &result);
-      config->SSTs[i].sstBoard.VoodooConfig.fbRam = result / (1024 * 1024);
+      config->SSTs[i].fbRam = result / (1024 * 1024);
 
       grGet(GR_NUM_TMU, 4, &result);
-      config->SSTs[i].sstBoard.VoodooConfig.nTexelfx = result;
+      config->SSTs[i].nTexelfx = result;
 
       grGet(GR_REVISION_FB, 4, &result);
-      config->SSTs[i].sstBoard.VoodooConfig.fbiRev = result;
-
-      grGet(GR_NUM_FB, 4, (void *) &numFB);
-      if (numFB > 1)
-        config->SSTs[i].sstBoard.VoodooConfig.sliDetect = FXTRUE;
-      else
-        config->SSTs[i].sstBoard.VoodooConfig.sliDetect = FXFALSE;
+      config->SSTs[i].fbiRev = result;
 
-      for (j = 0; j < config->SSTs[i].sstBoard.VoodooConfig.nTexelfx; j++) {
+      for (j = 0; j < config->SSTs[i].nTexelfx; j++) {
         grGet(GR_MEMORY_TMU, 4, &result);
-        config->SSTs[i].sstBoard.VoodooConfig.tmuConfig[j].tmuRam =
-           result / (1024 * 1024);
+        config->SSTs[i].tmuConfig[j].tmuRam = result / (1024 * 1024);
         grGet(GR_REVISION_TMU, 4, &result);
-        config->SSTs[i].sstBoard.VoodooConfig.tmuConfig[j].tmuRev = result;
+        config->SSTs[i].tmuConfig[j].tmuRev = result;
       }
-   }
-   END_BOARD_LOCK();
-   return 1;
-}
-
-#else
 
-int
-FX_grSstScreenWidth()
-{
-   int i;
-   BEGIN_BOARD_LOCK();
-   i = grSstScreenWidth();
-   END_BOARD_LOCK();
-   return i;
-}
-
-int
-FX_grSstScreenHeight()
-{
-   int i;
-   BEGIN_BOARD_LOCK();
-   i = grSstScreenHeight();
-   END_BOARD_LOCK();
-   return i;
-}
+      extension = grGetString(GR_EXTENSION);
+      config->SSTs[i].HavePalExt = (strstr(extension, " PALETTE6666 ") != NULL);
+      config->SSTs[i].HavePixExt = (strstr(extension, " PIXEXT ") != NULL);
+      config->SSTs[i].HaveTexFmt = (strstr(extension, " TEXFMT ") != NULL);
+      config->SSTs[i].HaveCmbExt = (strstr(extension, " COMBINE ") != NULL);
+      config->SSTs[i].HaveMirExt = (strstr(extension, " TEXMIRROR ") != NULL);
+      config->SSTs[i].HaveTexUma = (strstr(extension, " TEXUMA ") != NULL);
 
-int
-FX_grSstQueryHardware(GrHwConfiguration * c)
-{
-   int i;
-   BEGIN_BOARD_LOCK();
-   i = grSstQueryHardware(c);
-   END_BOARD_LOCK();
-   return i;
-}
+      /* number of Voodoo chips */
+      grGet(GR_NUM_FB, 4, (void *) &numFB);
+      config->SSTs[i].numChips = numFB;
 
+   }
 
-#endif /* FX_GLIDE3 */
+   tdfx_hook_glide(&config->Glide, getenv("MESA_FX_POINTCAST") != NULL);
 
-/* It appears to me that this function is needed either way. */
-FX_GrContext_t
-FX_grSstWinOpen(FxU32 hWnd,
-               GrScreenResolution_t screen_resolution,
-               GrScreenRefresh_t refresh_rate,
-               GrColorFormat_t color_format,
-               GrOriginLocation_t origin_location,
-               int nColBuffers, int nAuxBuffers)
-{
-   FX_GrContext_t i;
-   BEGIN_BOARD_LOCK();
-   i = grSstWinOpen(hWnd,
-                   screen_resolution,
-                   refresh_rate,
-                   color_format, origin_location, nColBuffers, nAuxBuffers);
-
-   /*
-      fprintf(stderr, 
-      "grSstWinOpen( win %d res %d ref %d fmt %d\n"
-      "              org %d ncol %d naux %d )\n"
-      " ==> %d\n",
-      hWnd,
-      screen_resolution,
-      refresh_rate,
-      color_format,
-      origin_location,
-      nColBuffers,
-      nAuxBuffers,
-      i);
-    */
    END_BOARD_LOCK();
-   return i;
+   return 1;
 }