diff options
author | Francisco Jerez <currojerez@riseup.net> | 2010-11-02 02:49:32 +0100 |
---|---|---|
committer | Francisco Jerez <currojerez@riseup.net> | 2010-11-10 21:24:31 +0100 |
commit | 47c471f2818bb0d82bc670a4cb0a7e0616231a6d (patch) | |
tree | b591040a072949fb1f5f4780c1a4efed38bdaa37 | |
parent | f623d0c1c217d990f207306eb968172af79fa969 (diff) |
meta: Handle bitmaps with alpha test enabled.
Acked-by: Brian Paul <brianp@vmware.com>
-rw-r--r-- | src/mesa/drivers/common/meta.c | 41 |
1 files changed, 35 insertions, 6 deletions
diff --git a/src/mesa/drivers/common/meta.c b/src/mesa/drivers/common/meta.c index b154a6df95..4533d82743 100644 --- a/src/mesa/drivers/common/meta.c +++ b/src/mesa/drivers/common/meta.c @@ -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: */ |