fix GL_BACK color material bug
[mesa.git] / src / mesa / drivers / glide / fxsetup.c
index a8ca52d62cb8e8137f43c510b068eed23c5a9a5d..f1a56650bdef4a24feeb3f205c870340c0e374e3 100644 (file)
@@ -66,12 +66,10 @@ static void fxSetupTexture_NoLock(GLcontext *ctx);
 static void fxSetupTexture(GLcontext *ctx);
 static void fxSetupBlend(GLcontext *ctx);
 static void fxSetupDepthTest(GLcontext *ctx);
-static void fxFogTableGenerate(GLcontext *ctx);
-static void fxSetupFog(GLcontext *ctx, GLboolean forceTableRebuild);
 static void fxSetupScissor(GLcontext *ctx);
 static void fxSetupCull(GLcontext *ctx);
 static void gl_print_fx_state_flags( const char *msg, GLuint flags);
-static GLboolean fxMultipassBlend(struct vertex_buffer *, GLuint);
+/*static GLboolean fxMultipassBlend(struct vertex_buffer *, GLuint);*/
 static GLboolean fxMultipassTexture( struct vertex_buffer *, GLuint );
 
 static void fxTexValidate(GLcontext *ctx, struct gl_texture_object *tObj)
@@ -185,7 +183,7 @@ static GLuint fxGetTexSetConfiguration(GLcontext *ctx,
   GLuint envmode=0;
   GLuint ifmt=0;
 
-  if((ctx->Light.ShadeModel==GL_SMOOTH) ||
+  if((ctx->Light.ShadeModel==GL_SMOOTH) || 1 ||
      (ctx->Point.SmoothFlag) ||
      (ctx->Line.SmoothFlag) ||
      (ctx->Polygon.SmoothFlag))
@@ -193,11 +191,13 @@ static GLuint fxGetTexSetConfiguration(GLcontext *ctx,
   else
     unitsmode|=FX_UM_ALPHA_CONSTANT;
 
-  if(ctx->Light.ShadeModel==GL_SMOOTH)
+  if(ctx->Light.ShadeModel==GL_SMOOTH || 1)
     unitsmode|=FX_UM_COLOR_ITERATED;
   else
     unitsmode|=FX_UM_COLOR_CONSTANT;
 
+
+
   /* 
      OpenGL Feeds Texture 0 into Texture 1
      Glide Feeds Texture 1 into Texture 0
@@ -407,10 +407,11 @@ static void fxSelectSingleTMUSrc_NoLock(fxMesaContext fxMesa, GLint tmu,
                           GR_COMBINE_FACTOR_ONE_MINUS_LOD_FRACTION,
                           FXFALSE,FXFALSE);
 
-    FX_grTexCombine_NoLock(GR_TMU1,
-                          GR_COMBINE_FUNCTION_LOCAL,GR_COMBINE_FACTOR_NONE,
-                          GR_COMBINE_FUNCTION_LOCAL,GR_COMBINE_FACTOR_NONE,
-                          FXFALSE,FXFALSE);
+    if (fxMesa->haveTwoTMUs)
+      FX_grTexCombine_NoLock(GR_TMU1,
+                            GR_COMBINE_FUNCTION_LOCAL,GR_COMBINE_FACTOR_NONE,
+                            GR_COMBINE_FUNCTION_LOCAL,GR_COMBINE_FACTOR_NONE,
+                            FXFALSE,FXFALSE);
     fxMesa->tmuSrc=FX_TMU_SPLIT;
   }
   else {
@@ -477,8 +478,8 @@ static void fxSetupTextureSingleTMU_NoLock(GLcontext *ctx, GLuint textureset)
   else
     unitsmode=fxGetTexSetConfiguration(ctx,NULL,tObj);
 
-  if(fxMesa->lastUnitsMode==unitsmode)
-    return;
+/*    if(fxMesa->lastUnitsMode==unitsmode) */
+/*      return; */
 
   fxMesa->lastUnitsMode=unitsmode;
 
@@ -556,9 +557,8 @@ static void fxSetupTextureSingleTMU_NoLock(GLcontext *ctx, GLuint textureset)
                               FXTRUE);
     ctx->Driver.MultipassFunc = fxMultipassBlend;
 #else
-#ifndef FX_SILENT
-    fprintf(stderr,"fx Driver: GL_BLEND not yet supported\n");
-#endif
+    if (MESA_VERBOSE&VERBOSE_DRIVER)
+      fprintf(stderr,"fx Driver: GL_BLEND not yet supported\n");
 #endif    
     break;
   case GL_REPLACE:
@@ -589,9 +589,9 @@ static void fxSetupTextureSingleTMU_NoLock(GLcontext *ctx, GLuint textureset)
                               FXFALSE);
     break;
   default:
-#ifndef FX_SILENT
-    fprintf(stderr,"fx Driver: %x Texture.EnvMode not yet supported\n",ctx->Texture.Unit[textureset].EnvMode);
-#endif
+    if (MESA_VERBOSE&VERBOSE_DRIVER)
+      fprintf(stderr, "fx Driver: %x Texture.EnvMode not yet supported\n",
+             ctx->Texture.Unit[textureset].EnvMode);
     break;
   }
 
@@ -765,8 +765,8 @@ static void fxSetupTextureDoubleTMU_NoLock(GLcontext *ctx)
 
   unitsmode=fxGetTexSetConfiguration(ctx,tObj0,tObj1);
 
-  if(fxMesa->lastUnitsMode==unitsmode)
-    return;
+/*    if(fxMesa->lastUnitsMode==unitsmode) */
+/*      return; */
 
   fxMesa->lastUnitsMode=unitsmode;
 
@@ -1031,7 +1031,7 @@ static void fxSetupTextureNone_NoLock(GLcontext *ctx)
      fprintf(stderr,"fxmesa: fxSetupTextureNone(...)\n");
   }
 
-  if((ctx->Light.ShadeModel==GL_SMOOTH) ||
+  if((ctx->Light.ShadeModel==GL_SMOOTH) || 1 ||
      (ctx->Point.SmoothFlag) ||
      (ctx->Line.SmoothFlag) ||
      (ctx->Polygon.SmoothFlag))
@@ -1039,7 +1039,7 @@ static void fxSetupTextureNone_NoLock(GLcontext *ctx)
   else
     locala=GR_COMBINE_LOCAL_CONSTANT;
   
-  if(ctx->Light.ShadeModel==GL_SMOOTH)
+  if(ctx->Light.ShadeModel==GL_SMOOTH || 1)
     localc=GR_COMBINE_LOCAL_ITERATED;
   else
     localc=GR_COMBINE_LOCAL_CONSTANT;
@@ -1384,12 +1384,14 @@ static void fxSetupDepthTest(GLcontext *ctx)
   fxMesaContext fxMesa=(fxMesaContext)ctx->DriverCtx;
   tfxUnitsState *us=&fxMesa->unitsState;
 
-  if(us->depthTestEnabled)
+  if (us->depthTestEnabled) {
      FX_grDepthBufferFunction(us->depthTestFunc);
-  else
+     FX_grDepthMask(us->depthMask);
+  }
+  else {
      FX_grDepthBufferFunction(GR_CMP_ALWAYS);
-
-  FX_grDepthMask(us->depthMask);
+     FX_grDepthMask(FXFALSE);
+  }
 }
 
 /************************************************************************/
@@ -1411,79 +1413,76 @@ static void fxSetupColorMask(GLcontext *ctx)
 {
   fxMesaContext fxMesa = FX_CONTEXT(ctx);
 
-  FX_grColorMask(ctx->Color.ColorMask[RCOMP] ||
-             ctx->Color.ColorMask[GCOMP] ||
-             ctx->Color.ColorMask[BCOMP],
-             ctx->Color.ColorMask[ACOMP] && fxMesa->haveAlphaBuffer);
+  if (ctx->Color.DrawBuffer == GL_NONE) {
+    FX_grColorMask(FXFALSE, FXFALSE);
+  }
+  else {
+    FX_grColorMask(ctx->Color.ColorMask[RCOMP] ||
+                   ctx->Color.ColorMask[GCOMP] ||
+                   ctx->Color.ColorMask[BCOMP],
+                   ctx->Color.ColorMask[ACOMP] && fxMesa->haveAlphaBuffer);
+  }
 }
 
 
 
+
 /************************************************************************/
 /**************************** Fog Mode SetUp ****************************/
 /************************************************************************/
 
-static void fxFogTableGenerate(GLcontext *ctx)
-{
-  int i;
-  float f,eyez;
-  fxMesaContext fxMesa=(fxMesaContext)ctx->DriverCtx;
-
-  for(i=0;i<FX_grGetInteger(FX_FOG_TABLE_ENTRIES);i++) {
-    eyez=guFogTableIndexToW(i);
-
-    switch(ctx->Fog.Mode) {
-    case GL_LINEAR:
-      f=(ctx->Fog.End-eyez)/(ctx->Fog.End-ctx->Fog.Start);
-      break;
-    case GL_EXP:
-      f=exp(-ctx->Fog.Density*eyez);  
-      break;
-    case GL_EXP2:
-      f=exp(-ctx->Fog.Density*ctx->Fog.Density*eyez*eyez);
-      break;
-    default: /* That should never happen */
-      f=0.0f;
-      break; 
-    }
-
-    fxMesa->fogTable[i]=(GrFog_t)((1.0f-CLAMP(f,0.0f,1.0f))*255.0f);
-  }
-}
-
-static void fxSetupFog(GLcontext *ctx, GLboolean forceTableRebuild)
+/*
+ * This is called during state update in order to update the Glide fog state.
+ */
+static void fxSetupFog(GLcontext *ctx)
 {
-  fxMesaContext fxMesa=(fxMesaContext)ctx->DriverCtx;
+  if (ctx->Fog.Enabled && ctx->FogMode==FOG_FRAGMENT) {
+    fxMesaContext fxMesa = FX_CONTEXT(ctx);
 
-  if(ctx->Fog.Enabled && ctx->FogMode==FOG_FRAGMENT) {
+    /* update fog color */
     GLubyte col[4];
-    FX_grFogMode(GR_FOG_WITH_TABLE);
-
     col[0]=(unsigned int)(255*ctx->Fog.Color[0]);
     col[1]=(unsigned int)(255*ctx->Fog.Color[1]);
     col[2]=(unsigned int)(255*ctx->Fog.Color[2]); 
     col[3]=(unsigned int)(255*ctx->Fog.Color[3]);
-
     FX_grFogColorValue(FXCOLOR4(col));
 
-    if(forceTableRebuild ||
-       (fxMesa->fogTableMode!=ctx->Fog.Mode) ||
-       (fxMesa->fogDensity!=ctx->Fog.Density)) {
-      fxFogTableGenerate(ctx);
-         
-      fxMesa->fogTableMode=ctx->Fog.Mode;
-      fxMesa->fogDensity=ctx->Fog.Density;
+    if(fxMesa->fogTableMode != ctx->Fog.Mode ||
+       fxMesa->fogDensity != ctx->Fog.Density ||
+       fxMesa->fogStart != ctx->Fog.Start ||
+       fxMesa->fogEnd != ctx->Fog.End) {
+      /* reload the fog table */
+      switch (ctx->Fog.Mode) {
+        case GL_LINEAR:
+          guFogGenerateLinear(fxMesa->fogTable, ctx->Fog.Start, ctx->Fog.End);
+          break;
+        case GL_EXP:
+          guFogGenerateExp(fxMesa->fogTable, ctx->Fog.Density);
+          break;
+        case GL_EXP2:
+          guFogGenerateExp2(fxMesa->fogTable, ctx->Fog.Density);
+          break;
+        default:
+          ;
+      }
+      fxMesa->fogTableMode = ctx->Fog.Mode;
+      fxMesa->fogDensity = ctx->Fog.Density;
+      fxMesa->fogStart = ctx->Fog.Start;
+      fxMesa->fogEnd = ctx->Fog.End;
     }
-      
+
     FX_grFogTable(fxMesa->fogTable);
-  } else
+    FX_grFogMode(GR_FOG_WITH_TABLE);
+  }
+  else {
     FX_grFogMode(GR_FOG_DISABLE);
+  }
 }
 
 void fxDDFogfv( GLcontext *ctx, GLenum pname, const GLfloat *params )
 {
    FX_CONTEXT(ctx)->new_state |= FX_NEW_FOG;
-   ctx->Driver.RenderStart = fxSetupFXUnits;
+   ctx->Driver.RenderStart = fxSetupFXUnits;  /* XXX why is this here? */
 }
 
 /************************************************************************/
@@ -1561,28 +1560,28 @@ void fxDDFrontFace(GLcontext *ctx, GLenum mode)
 
 static void fxSetupCull(GLcontext *ctx)
 {
-   if(ctx->Polygon.CullFlag) {
-      switch(ctx->Polygon.CullFaceMode) {
-      case GL_BACK:
-        if(ctx->Polygon.FrontFace==GL_CCW)
-           FX_grCullMode(GR_CULL_NEGATIVE);
-        else
-           FX_grCullMode(GR_CULL_POSITIVE);
-        break;
-      case GL_FRONT:
-        if(ctx->Polygon.FrontFace==GL_CCW)
-           FX_grCullMode(GR_CULL_POSITIVE);
-        else
-           FX_grCullMode(GR_CULL_NEGATIVE);
-        break;
-      case GL_FRONT_AND_BACK:
-        FX_grCullMode(GR_CULL_DISABLE);
-        break;
-      default:
-        break;
-      }
-   } else
-      FX_grCullMode(GR_CULL_DISABLE);
+  if (ctx->Polygon.CullFlag) {
+    switch (ctx->Polygon.CullFaceMode) {
+    case GL_BACK:
+      if (ctx->Polygon.FrontFace==GL_CCW)
+       FX_CONTEXT(ctx)->cullMode=GR_CULL_NEGATIVE;
+      else
+       FX_CONTEXT(ctx)->cullMode=GR_CULL_POSITIVE;
+      break;
+    case GL_FRONT:
+      if(ctx->Polygon.FrontFace==GL_CCW)
+       FX_CONTEXT(ctx)->cullMode=GR_CULL_POSITIVE;
+      else
+       FX_CONTEXT(ctx)->cullMode=GR_CULL_NEGATIVE;
+      break;
+    case GL_FRONT_AND_BACK:
+      FX_CONTEXT(ctx)->cullMode=GR_CULL_DISABLE;
+      break;
+    default:
+      break;
+    }
+  } else FX_CONTEXT(ctx)->cullMode=GR_CULL_DISABLE;
+  FX_grCullMode(FX_CONTEXT(ctx)->cullMode);
 }
 
 
@@ -1625,6 +1624,9 @@ void fxDDEnable(GLcontext *ctx, GLenum cap, GLboolean state)
      fxMesa->new_state |= FX_NEW_SCISSOR;
      ctx->Driver.RenderStart = fxSetupFXUnits;
      break;
+  case GL_SHARED_TEXTURE_PALETTE_EXT:
+     fxDDTexUseGlbPalette(ctx, state);
+     break;
   case GL_FOG:
      fxMesa->new_state |= FX_NEW_FOG;
      ctx->Driver.RenderStart = fxSetupFXUnits;
@@ -1634,6 +1636,7 @@ void fxDDEnable(GLcontext *ctx, GLenum cap, GLboolean state)
      ctx->Driver.RenderStart = fxSetupFXUnits;
      break;
   case GL_LINE_SMOOTH:
+  case GL_LINE_STIPPLE:
   case GL_POINT_SMOOTH:
   case GL_POLYGON_SMOOTH:
   case GL_TEXTURE_2D:
@@ -1641,7 +1644,7 @@ void fxDDEnable(GLcontext *ctx, GLenum cap, GLboolean state)
       ctx->Driver.RenderStart = fxSetupFXUnits;
       break;
   default:
-    ;  /* XXX no-op??? */
+    ;  /* XXX no-op? */
   }    
 }
 
@@ -1674,10 +1677,10 @@ static GLboolean fxMultipassBlend(struct vertex_buffer *VB, GLuint pass)
       fxDDDepthMask(ctx, FALSE);
     }
     /* Enable Cc*Ct mode */
-    /* ??? Set the Constant Color ??? */
+    /* XXX Set the Constant Color ? */
     fxDDEnable(ctx, GL_BLEND, GL_TRUE);
-    fxDDBlendFunc(ctx, ???, ???);
-    fxSetupTextureSingleTMU(ctx, ???);
+    fxDDBlendFunc(ctx, XXX, XXX);
+    fxSetupTextureSingleTMU(ctx, XXX);
     fxSetupBlend(ctx);
     fxSetupDepthTest(ctx);
     break;
@@ -1685,8 +1688,8 @@ static GLboolean fxMultipassBlend(struct vertex_buffer *VB, GLuint pass)
   case 2:
     /* Reset everything back to normal */
     fxMesa->unitsState = fxMesa->restoreUnitsState;
-    fxMesa->setupdone &= ???;
-    fxSetupTextureSingleTMU(ctx, ???);
+    fxMesa->setupdone &= XXX;
+    fxSetupTextureSingleTMU(ctx, XXX);
     fxSetupBlend(ctx);
     fxSetupDepthTest(ctx);
     break;
@@ -1822,7 +1825,7 @@ void fxSetupFXUnits( GLcontext *ctx )
        fxSetupDepthTest(ctx);
 
      if (newstate & FX_NEW_FOG)
-       fxSetupFog(ctx,GL_FALSE);
+       fxSetupFog(ctx);
 
      if (newstate & FX_NEW_SCISSOR)
        fxSetupScissor(ctx);