Basic work to support deep color channels:
[mesa.git] / src / mesa / drivers / glide / fxdd.c
index 58310cfb33fd2b9c45fce47cee71a88423f3c33a..b69b6999ea6328e402067a659ab16752563ef281 100644 (file)
@@ -102,21 +102,6 @@ void fxInitPixelTables(fxMesaContext fxMesa, GLboolean bgrOrder)
 /*****                 Miscellaneous functions                    *****/
 /**********************************************************************/
 
-/* Enalbe/Disable dithering */
-static void fxDDDither(GLcontext *ctx, GLboolean enable)
-{
-  if (MESA_VERBOSE&VERBOSE_DRIVER) {
-    fprintf(stderr,"fxmesa: fxDDDither()\n");
-  }
-
-  if (enable) {
-    FX_grDitherMode(GR_DITHER_4x4);
-  } else {
-    FX_grDitherMode(GR_DITHER_DISABLE);
-  }
-}
-
-
 /* Return buffer size information */
 static void fxDDBufferSize(GLcontext *ctx, GLuint *width, GLuint *height)
 {
@@ -274,6 +259,8 @@ static GLbitfield fxDDClear(GLcontext *ctx, GLbitfield mask, GLboolean all,
       FX_grColorMask(FXTRUE, ctx->Color.ColorMask[ACOMP] && fxMesa->haveAlphaBuffer);
       if (ctx->Color.DrawDestMask & FRONT_LEFT_BIT)
         FX_grRenderBuffer(GR_BUFFER_FRONTBUFFER);
+      if (!ctx->Depth.Test || !ctx->Depth.Mask)
+        FX_grDepthMask(FXFALSE);
       break;
     default:
       /* error */
@@ -286,7 +273,7 @@ static GLbitfield fxDDClear(GLcontext *ctx, GLbitfield mask, GLboolean all,
 
 /* Set the buffer used for drawing */
 /* XXX support for separate read/draw buffers hasn't been tested */
-static GLboolean fxDDSetDrawBuffer(GLcontext *ctx, GLenum mode )
+static GLboolean fxDDSetDrawBuffer(GLcontext *ctx, GLenum mode)
 {
   fxMesaContext fxMesa=(fxMesaContext)ctx->DriverCtx;
 
@@ -304,6 +291,10 @@ static GLboolean fxDDSetDrawBuffer(GLcontext *ctx, GLenum mode )
     FX_grRenderBuffer(fxMesa->currentFB);
     return GL_TRUE;
   }
+  else if (mode == GL_NONE) {
+    FX_grColorMask(FXFALSE,FXFALSE);
+    return GL_TRUE;
+  }
   else {
     return GL_FALSE;
   }
@@ -529,13 +520,13 @@ static GLboolean fxDDReadPixels( GLcontext *ctx, GLint x, GLint y,
                                  const struct gl_pixelstore_attrib *packing,
                                  GLvoid *dstImage )
 {
-  if (ctx->Pixel.ScaleOrBiasRGBA || ctx->Pixel.MapColorFlag) {
+  if (ctx->ImageTransferState) {
     return GL_FALSE;  /* can't do this */
   }
   else {
     fxMesaContext fxMesa=(fxMesaContext)ctx->DriverCtx;
     GrLfbInfo_t info;
-    GLboolean result;
+    GLboolean result = GL_FALSE;
 
     BEGIN_BOARD_LOCK();
     if (grLfbLock(GR_LFB_READ_ONLY,
@@ -637,7 +628,6 @@ static GLboolean fxDDReadPixels( GLcontext *ctx, GLint x, GLint y,
       grLfbUnlock(GR_LFB_READ_ONLY, fxMesa->currentFB);
     }
     END_BOARD_LOCK();
-
     return result;
   }
 }
@@ -697,7 +687,7 @@ static const GLubyte *fxDDGetString(GLcontext *ctx, GLenum name)
           }
         }
         /* now make the GL_RENDERER string */
-        sprintf(buffer, "Mesa DRI %s 20000329", hardware);
+        sprintf(buffer, "Mesa DRI %s 20000510", hardware);
         return buffer;
       }
     case GL_VENDOR:
@@ -841,7 +831,6 @@ int fxDDInitFxMesaContext( fxMesaContext fxMesa )
    fxMesa->glCtx->Const.MaxTextureLevels=9;
    fxMesa->glCtx->Const.MaxTextureSize=256;
    fxMesa->glCtx->Const.MaxTextureUnits=fxMesa->emulateTwoTMUs ? 2 : 1;
-   fxMesa->glCtx->NewState|=NEW_DRVSTATE1;
    fxMesa->new_state = NEW_ALL;
   
    fxDDSetupInit();
@@ -874,7 +863,7 @@ int fxDDInitFxMesaContext( fxMesaContext fxMesa )
         fxMesa->glCtx->NrPipelineStages);
 
    /* Run the config file */
-   gl_context_initialize( fxMesa->glCtx );
+   _mesa_context_initialize( fxMesa->glCtx );
 
    return 1;
 }
@@ -897,7 +886,7 @@ void fxDDInitExtensions( GLcontext *ctx )
    gl_extensions_disable(ctx, "GL_EXT_blend_minmax");
    gl_extensions_disable(ctx, "GL_EXT_blend_subtract");
    gl_extensions_disable(ctx, "GL_EXT_blend_color");
-   gl_extensions_disable(ctx, "GL_EXT_paletted_texture");
+   gl_extensions_disable(ctx, "GL_EXT_fog_coord");
 
    gl_extensions_add(ctx, DEFAULT_ON, "3DFX_set_global_palette", 0);
    
@@ -944,7 +933,7 @@ static GLboolean fxIsInHardware(GLcontext *ctx)
   if (!ctx->Hint.AllowDrawMem)
      return GL_TRUE;           /* you'll take it and like it */
 
-  if((ctx->RasterMask & STENCIL_BIT) ||
+  if((ctx->RasterMask & (STENCIL_BIT | MULTI_DRAW_BIT)) ||
      ((ctx->Color.BlendEnabled) && (ctx->Color.BlendEquation!=GL_FUNC_ADD_EXT)) ||
      ((ctx->Color.ColorLogicOpEnabled) && (ctx->Color.LogicOp!=GL_COPY)) ||
      (ctx->Light.Model.ColorControl==GL_SEPARATE_SPECULAR_COLOR) ||
@@ -967,8 +956,14 @@ static GLboolean fxIsInHardware(GLcontext *ctx)
     }
 
     if (ctx->Texture.ReallyEnabled & TEXTURE0_2D) {
-      if (ctx->Texture.Unit[0].EnvMode == GL_BLEND)
+      if (ctx->Texture.Unit[0].EnvMode == GL_BLEND &&
+         (ctx->Texture.ReallyEnabled & TEXTURE1_2D ||
+          ctx->Texture.Unit[0].EnvColor[0] != 0 ||
+          ctx->Texture.Unit[0].EnvColor[1] != 0 ||
+          ctx->Texture.Unit[0].EnvColor[2] != 0 ||
+          ctx->Texture.Unit[0].EnvColor[3] != 1)) {
         return GL_FALSE;
+      }
       if (ctx->Texture.Unit[0].Current->Image[0]->Border > 0)
         return GL_FALSE;
     }
@@ -1089,8 +1084,6 @@ void fxSetupDDPointers(GLcontext *ctx)
          
   ctx->Driver.GetString=fxDDGetString;
 
-  ctx->Driver.Dither=fxDDDither;
-
   ctx->Driver.NearFar=fxDDSetNearFar;
 
   ctx->Driver.GetParameteri=fxDDGetParameteri;