fix GL_BACK color material bug
[mesa.git] / src / mesa / drivers / glide / fxglidew.c
index 574136a5cd0773e6654a9c33ddb78d41503d03ec..5155c825a857907bc0e8be5e757764e6705066e5 100644 (file)
@@ -2,9 +2,9 @@
 
 /*
  * Mesa 3-D graphics library
- * Version:  3.1
+ * Version:  3.3
  *
- * Copyright (C) 1999  Brian Paul   All Rights Reserved.
+ * Copyright (C) 1999-2000  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"),
@@ -55,7 +55,7 @@
 #include <stdlib.h>
 #include <string.h>
 
-FxI32 grGetInteger(FxU32 pname)
+FxI32 FX_grGetInteger_NoLock(FxU32 pname)
 {
 #if !defined(FX_GLIDE3)
   switch (pname) 
@@ -68,6 +68,9 @@ FxI32 grGetInteger(FxU32 pname)
        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");
@@ -84,6 +87,7 @@ FxI32 grGetInteger(FxU32 pname)
      case FX_GLIDE_STATE_SIZE:
      case FX_LFB_PIXEL_PIPE:
      case FX_PENDING_BUFFERSWAPS:
+     case FX_TEXTURE_ALIGN:
        grname = pname;
        break;
      default:
@@ -103,7 +107,7 @@ FxI32 FX_grGetInteger(FxU32 pname)
   int result;
 
   BEGIN_BOARD_LOCK();
-  result=grGetInteger(pname);
+  result=FX_grGetInteger_NoLock(pname);
   END_BOARD_LOCK();
   return result;
 }
@@ -150,7 +154,17 @@ extern FxU32 FX_grTexMaxAddress(GrChipID_t tmu) {
 FxBool FX_grSstControl(FxU32 code)
 {
 #if defined(FX_GLIDE3)
-  (void) code;
+  /* The glide 3 sources call for grEnable/grDisable to be called in exchange
+   * for grSstControl. */
+  switch(code) {
+    case GR_CONTROL_ACTIVATE:
+      grEnable(GR_PASSTHRU);
+      break;
+    case GR_CONTROL_DEACTIVATE:
+      grDisable(GR_PASSTHRU);
+      break;
+  }
+  /* Appearently GR_CONTROL_RESIZE can be ignored. */
   return 1;  /* OK? */
 #else
   FxU32 result;
@@ -221,12 +235,12 @@ void FX_grGlideGetVersion(char *buf)
 
 void FX_grSstPerfStats(GrSstPerfStats_t *st)
 {
-  /* ToDo */
-  st->pixelsIn = 0;
-  st->chromaFail = 0;
-  st->zFuncFail = 0;
-  st->aFuncFail = 0;
-  st->pixelsOut = 0;
+  FxI32 n;
+  grGet(GR_STATS_PIXELS_IN, 4, &n);              st->pixelsIn = n;
+  grGet(GR_STATS_PIXELS_CHROMA_FAIL, 4, &n);     st->chromaFail = n;
+  grGet(GR_STATS_PIXELS_DEPTHFUNC_FAIL, 4, &n);  st->zFuncFail = n;
+  grGet(GR_STATS_PIXELS_AFUNC_FAIL, 4, &n);      st->aFuncFail = n;
+  grGet(GR_STATS_PIXELS_OUT, 4, &n);             st->pixelsOut = n;
 }
 
 void FX_grAADrawLine(GrVertex *a,GrVertex *b)
@@ -244,37 +258,47 @@ void FX_grAADrawPoint(GrVertex *a)
   END_CLIP_LOOP();
 }
 
+void FX_grDrawPolygonVertexList(int n, GrVertex *verts) 
+{
+  BEGIN_CLIP_LOOP();
+  grDrawVertexArrayContiguous(GR_POLYGON, n, verts, sizeof(GrVertex));
+  END_CLIP_LOOP();
+}
+
 #if FX_USE_PARGB
 void FX_setupGrVertexLayout(void)
 {
-   grReset(GR_VERTEX_PARAMETER);
+  BEGIN_BOARD_LOCK();
+  grReset(GR_VERTEX_PARAMETER);
    
-   grCoordinateSpace(GR_WINDOW_COORDS);
-   grVertexLayout(GR_PARAM_XY,         GR_VERTEX_X_OFFSET << 2,        GR_PARAM_ENABLE);
-   grVertexLayout(GR_PARAM_PARGB,      GR_VERTEX_PARGB_OFFSET << 2,    GR_PARAM_ENABLE);
-   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, GR_PARAM_ENABLE);       
-   grVertexLayout(GR_PARAM_Q0,         GR_VERTEX_OOW_TMU0_OFFSET << 2, GR_PARAM_DISABLE); 
-   grVertexLayout(GR_PARAM_ST1,        GR_VERTEX_SOW_TMU1_OFFSET << 2, GR_PARAM_DISABLE);      
-   grVertexLayout(GR_PARAM_Q1,         GR_VERTEX_OOW_TMU1_OFFSET << 2, GR_PARAM_DISABLE);      
+  grCoordinateSpace(GR_WINDOW_COORDS);
+  grVertexLayout(GR_PARAM_XY, GR_VERTEX_X_OFFSET << 2, GR_PARAM_ENABLE);
+  grVertexLayout(GR_PARAM_PARGB, GR_VERTEX_PARGB_OFFSET << 2, GR_PARAM_ENABLE);
+  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, GR_PARAM_ENABLE);       
+  grVertexLayout(GR_PARAM_Q0, GR_VERTEX_OOW_TMU0_OFFSET << 2, GR_PARAM_DISABLE); 
+  grVertexLayout(GR_PARAM_ST1, GR_VERTEX_SOW_TMU1_OFFSET << 2, GR_PARAM_DISABLE);      
+  grVertexLayout(GR_PARAM_Q1, GR_VERTEX_OOW_TMU1_OFFSET << 2, GR_PARAM_DISABLE);       
+  END_BOARD_LOCK();
 }
 #else /* FX_USE_PARGB */
 void FX_setupGrVertexLayout(void)
 {
-   grReset(GR_VERTEX_PARAMETER);
+  BEGIN_BOARD_LOCK();
+  grReset(GR_VERTEX_PARAMETER);
    
-   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);
- /*  grVertexLayout(GR_PARAM_Z,        GR_VERTEX_Z_OFFSET << 2,        GR_PARAM_ENABLE); */
-   grVertexLayout(GR_PARAM_A,          GR_VERTEX_A_OFFSET << 2,        GR_PARAM_ENABLE);
-   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, GR_PARAM_ENABLE);       
-   grVertexLayout(GR_PARAM_Q0,         GR_VERTEX_OOW_TMU0_OFFSET << 2, GR_PARAM_DISABLE); 
-   grVertexLayout(GR_PARAM_ST1,        GR_VERTEX_SOW_TMU1_OFFSET << 2, GR_PARAM_DISABLE);      
-   grVertexLayout(GR_PARAM_Q1,         GR_VERTEX_OOW_TMU1_OFFSET << 2, GR_PARAM_DISABLE);      
+  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);
+  grVertexLayout(GR_PARAM_A, GR_VERTEX_A_OFFSET << 2, GR_PARAM_ENABLE);
+  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, GR_PARAM_ENABLE);       
+  grVertexLayout(GR_PARAM_Q0, GR_VERTEX_OOW_TMU0_OFFSET << 2, GR_PARAM_DISABLE);
+  grVertexLayout(GR_PARAM_ST1, GR_VERTEX_SOW_TMU1_OFFSET << 2, GR_PARAM_DISABLE);      
+  grVertexLayout(GR_PARAM_Q1, GR_VERTEX_OOW_TMU1_OFFSET << 2, GR_PARAM_DISABLE);
+  END_BOARD_LOCK();
 }
 #endif
 
@@ -342,7 +366,39 @@ int FX_grSstQueryHardware(GrHwConfiguration *config)
    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;
+}
 
+int FX_grSstQueryHardware(GrHwConfiguration *c)        
+{
+   int i;
+   BEGIN_BOARD_LOCK();
+   i = grSstQueryHardware(c);
+   END_BOARD_LOCK();
+   return i;
+} 
+
+
+#endif  /* FX_GLIDE3 */
+
+/* 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,
@@ -361,6 +417,7 @@ FX_GrContext_t FX_grSstWinOpen( FxU32                hWnd,
                      nColBuffers,
                      nAuxBuffers );
    
+   /*
    fprintf(stderr, 
            "grSstWinOpen( win %d res %d ref %d fmt %d\n"
            "              org %d ncol %d naux %d )\n"
@@ -373,41 +430,12 @@ FX_GrContext_t FX_grSstWinOpen( FxU32                hWnd,
            nColBuffers,
            nAuxBuffers,
            i);
+   */
    END_BOARD_LOCK();
    return i;
 }
 
-#else /* FX_GLIDE3 */
-
-int FX_grSstScreenWidth()
-{
-  return grSstScreenWidth();
-}
-
-int FX_grSstScreenHeight()
-{
-  return grSstScreenHeight();
-}
-
-int FX_grSstQueryHardware(GrHwConfiguration *config)
-{
-  return grSstQueryHardware(config);
-}
-
-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)
-{
-  return grSstWinOpen(hWnd, screen_resolution, refresh_rate,
-                      color_format, origin_location, nColBuffers, nAuxBuffers);
-}
-
 
-#endif /* FX_GLIDE3 */
 
 #else