meta: Handle bitmaps with alpha test enabled.
authorFrancisco Jerez <currojerez@riseup.net>
Tue, 2 Nov 2010 01:49:32 +0000 (02:49 +0100)
committerFrancisco Jerez <currojerez@riseup.net>
Wed, 10 Nov 2010 20:24:31 +0000 (21:24 +0100)
Acked-by: Brian Paul <brianp@vmware.com>
src/mesa/drivers/common/meta.c

index b154a6d..4533d82 100644 (file)
@@ -1980,13 +1980,39 @@ _mesa_meta_DrawPixels(struct gl_context *ctx,
    _mesa_meta_end(ctx);
 }
 
+static GLboolean
+alpha_test_raster_color(struct gl_context *ctx)
+{
+   GLfloat alpha = ctx->Current.RasterColor[ACOMP];
+   GLfloat ref = ctx->Color.AlphaRef;
+
+   switch (ctx->Color.AlphaFunc) {
+      case GL_NEVER:
+        return GL_FALSE;
+      case GL_LESS:
+        return alpha < ref;
+      case GL_EQUAL:
+        return alpha == ref;
+      case GL_LEQUAL:
+        return alpha <= ref;
+      case GL_GREATER:
+        return alpha > ref;
+      case GL_NOTEQUAL:
+        return alpha != ref;
+      case GL_GEQUAL:
+        return alpha >= ref;
+      case GL_ALWAYS:
+        return GL_TRUE;
+      default:
+        assert(0);
+        return GL_FALSE;
+   }
+}
 
 /**
- * Do glBitmap with a alpha texture quad.  Use the alpha test to
- * cull the 'off' bits.  If alpha test is already enabled, fall back
- * to swrast (should be a rare case).
- * A bitmap cache as in the gallium/mesa state tracker would
- * improve performance a lot.
+ * Do glBitmap with a alpha texture quad.  Use the alpha test to cull
+ * the 'off' bits.  A bitmap cache as in the gallium/mesa state
+ * tracker would improve performance a lot.
  */
 void
 _mesa_meta_Bitmap(struct gl_context *ctx,
@@ -2010,7 +2036,7 @@ _mesa_meta_Bitmap(struct gl_context *ctx,
     * Check if swrast fallback is needed.
     */
    if (ctx->_ImageTransferState ||
-       ctx->Color.AlphaEnabled ||
+       ctx->FragmentProgram._Enabled ||
        ctx->Fog.Enabled ||
        ctx->Texture._EnabledUnits ||
        width > tex->MaxSize ||
@@ -2019,6 +2045,9 @@ _mesa_meta_Bitmap(struct gl_context *ctx,
       return;
    }
 
+   if (ctx->Color.AlphaEnabled && !alpha_test_raster_color(ctx))
+      return;
+
    /* Most GL state applies to glBitmap (like blending, stencil, etc),
     * but a there's a few things we need to override:
     */