Brian Paul <bri...@vmware.com> writes: > > Of course, we _could_ do the comparison with ints but we'd have to > query the number of framebuffer alpha bits, convert the floats to ints > with the right number of bits, then compare (to match the > hardware). It seems to be a lot of extra work for no good reason. > OK, here's a patch doing the same with floats.
> -Brian
From 4158e267659eeff15ef5a6cbc29c6c23cb682ed3 Mon Sep 17 00:00:00 2001 From: Francisco Jerez <curroje...@riseup.net> Date: Tue, 2 Nov 2010 02:49:32 +0100 Subject: [PATCH] meta: Handle bitmaps with alpha test enabled. --- src/mesa/drivers/common/meta.c | 43 ++++++++++++++++++++++++++++++++++----- 1 files changed, 37 insertions(+), 6 deletions(-) diff --git a/src/mesa/drivers/common/meta.c b/src/mesa/drivers/common/meta.c index b154a6d..15c62c0 100644 --- a/src/mesa/drivers/common/meta.c +++ b/src/mesa/drivers/common/meta.c @@ -1980,13 +1980,41 @@ _mesa_meta_DrawPixels(struct gl_context *ctx, _mesa_meta_end(ctx); } +static GLboolean +alpha_test_raster_color(struct gl_context *ctx) +{ + struct gl_colorbuffer_attrib *color = &ctx->Color; + GLenum func = (color->AlphaEnabled ? color->AlphaFunc : GL_ALWAYS); + GLfloat alpha = ctx->Current.RasterColor[ACOMP]; + GLfloat ref = color->AlphaRef; + + switch (func) { + 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 +2038,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 +2047,9 @@ _mesa_meta_Bitmap(struct gl_context *ctx, return; } + if (!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: */ -- 1.6.4.4
pgpi56EkU7NC1.pgp
Description: PGP signature
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev