Software fallback for glColorMask. Can be avoided on Savage4 when all
authorFelix Kuehling <fxkuehl@gmx.de>
Sun, 24 Apr 2005 20:55:57 +0000 (20:55 +0000)
committerFelix Kuehling <fxkuehl@gmx.de>
Sun, 24 Apr 2005 20:55:57 +0000 (20:55 +0000)
channels are masked (disable draw update). Bumped driver date to
reflect recent correctness fixes. The driver now passes all glean
tests except exactRGBA on both Savage4 and Savage3D-based cards.

src/mesa/drivers/dri/savage/savagedd.c
src/mesa/drivers/dri/savage/savagestate.c

index b1fb3955dee91a38e54d953f567b1992970e2d91..6bc9d3df8fc438345adc0321e58ff3dc7b8fbc6f 100644 (file)
@@ -41,7 +41,7 @@
 #include "utils.h"
 
 
-#define DRIVER_DATE "20050305"
+#define DRIVER_DATE "20050424"
 
 /***************************************
  * Mesa's Driver Functions
index c772a2484487bfdcf9c6994c706deb0311b56c6c..1a6a7f45794d507e5e30f30e584f0a2cceef32c7 100644 (file)
@@ -845,64 +845,45 @@ static void savageUpdateCull( GLcontext *ctx )
  * Color masks
  */
 
-/* Mesa calls this from the wrong place - it is called a very large
- * number of redundant times.
- *
- * Colormask can be simulated by multipass or multitexture techniques.
+/* Savage4 can disable draw updates when all channels are
+ * masked. Savage3D has a bit called drawUpdateEn, but it doesn't seem
+ * to have any effect. If only some channels are masked we need a
+ * software fallback on all chips.
  */
 static void savageDDColorMask_s4(GLcontext *ctx, 
                                 GLboolean r, GLboolean g, 
                                 GLboolean b, GLboolean a )
 {
     savageContextPtr imesa = SAVAGE_CONTEXT( ctx );
-    GLuint enable;
+    GLboolean passAny, passAll;
 
-    if (ctx->Visual.alphaBits)
-    {
-        enable = b | g | r | a;
-    }
-    else
-    {
-        enable = b | g | r;
+    if (ctx->Visual.alphaBits) {
+       passAny = b || g || r || a;
+       passAll = r && g && b && a;
+    } else {
+       passAny = b || g || r;
+       passAll = r && g && b;
     }
 
-    if (enable)
-    {
-       imesa->regs.s4.drawLocalCtrl.ni.drawUpdateEn = GL_TRUE;
-    }
-    else
-    {
+    if (passAny) {
+       if (!imesa->regs.s4.drawLocalCtrl.ni.drawUpdateEn) {
+           imesa->regs.s4.drawLocalCtrl.ni.drawUpdateEn = GL_TRUE;
+           imesa->dirty |= SAVAGE_UPLOAD_LOCAL;
+       }
+       FALLBACK (ctx, SAVAGE_FALLBACK_COLORMASK, !passAll);
+    } else if (imesa->regs.s4.drawLocalCtrl.ni.drawUpdateEn) {
        imesa->regs.s4.drawLocalCtrl.ni.drawUpdateEn = GL_FALSE;
+       imesa->dirty |= SAVAGE_UPLOAD_LOCAL;
     }
-    imesa->dirty |= SAVAGE_UPLOAD_LOCAL;
-    /* TODO: need a software fallback */
 }
 static void savageDDColorMask_s3d(GLcontext *ctx, 
                                  GLboolean r, GLboolean g, 
                                  GLboolean b, GLboolean a )
 {
-    savageContextPtr imesa = SAVAGE_CONTEXT( ctx );
-    GLuint enable;
-
     if (ctx->Visual.alphaBits)
-    {
-        enable = b | g | r | a;
-    }
+       FALLBACK (ctx, SAVAGE_FALLBACK_COLORMASK, !(r && g && b && a));
     else
-    {
-        enable = b | g | r;
-    }
-
-    if (enable)
-    {
-       imesa->regs.s3d.zBufCtrl.ni.drawUpdateEn = GL_TRUE;
-    }
-    else
-    {
-       imesa->regs.s3d.zBufCtrl.ni.drawUpdateEn = GL_FALSE;
-    }
-    imesa->dirty |= SAVAGE_UPLOAD_LOCAL;
-    /* TODO: need a software fallback */
+       FALLBACK (ctx, SAVAGE_FALLBACK_COLORMASK, !(r && g && b));
 }
 
 /* Seperate specular not fully implemented in hardware...  Needs