--- src/mesa/drivers/common/meta.c | 55 ++++++++++++++++++++++++++++++++-------- 1 files changed, 44 insertions(+), 11 deletions(-)
diff --git a/src/mesa/drivers/common/meta.c b/src/mesa/drivers/common/meta.c index 9615b52..03c1e66 100644 --- a/src/mesa/drivers/common/meta.c +++ b/src/mesa/drivers/common/meta.c @@ -104,6 +104,8 @@ struct save_state /** META_ALPHA_TEST */ GLboolean AlphaEnabled; + GLenum AlphaFunc; + GLclampf AlphaRef; /** META_BLEND */ GLbitfield BlendEnabled; @@ -328,6 +330,8 @@ _mesa_meta_begin(struct gl_context *ctx, GLbitfield state) if (state & META_ALPHA_TEST) { save->AlphaEnabled = ctx->Color.AlphaEnabled; + save->AlphaFunc = ctx->Color.AlphaFunc; + save->AlphaRef = ctx->Color.AlphaRef; if (ctx->Color.AlphaEnabled) _mesa_set_enable(ctx, GL_ALPHA_TEST, GL_FALSE); } @@ -577,6 +581,7 @@ _mesa_meta_end(struct gl_context *ctx) if (state & META_ALPHA_TEST) { if (ctx->Color.AlphaEnabled != save->AlphaEnabled) _mesa_set_enable(ctx, GL_ALPHA_TEST, save->AlphaEnabled); + _mesa_AlphaFunc(save->AlphaFunc, save->AlphaRef); } if (state & META_BLEND) { @@ -1975,13 +1980,41 @@ _mesa_meta_DrawPixels(struct gl_context *ctx, _mesa_meta_end(ctx); } +static void +setup_bitmap_alpha(struct gl_context *ctx, GLubyte *bg, GLubyte *fg) +{ + struct save_state *save = &ctx->Meta->Save; + GLenum func = (save->AlphaEnabled ? save->AlphaFunc : GL_ALWAYS); + GLubyte ref = FLOAT_TO_UBYTE(save->AlphaRef); + GLfloat rast = ctx->Current.RasterColor[ACOMP]; + + _mesa_set_enable(ctx, GL_ALPHA_TEST, GL_TRUE); + *fg = FLOAT_TO_UBYTE(rast); + + /* Choose a background alpha value that wouldn't pass through. + */ + if (func == GL_NEVER || func == GL_NOTEQUAL || + func == GL_LESS || func == GL_GREATER) { + *bg = ref; + + } else if ((func == GL_EQUAL && *fg != ref) || + (func == GL_LEQUAL && *fg > ref) || + (func == GL_GEQUAL && *fg < ref)) { + *bg = *fg; + + } else { + /* Alpha is supposed to pass, make it accept the current raster + * value, and use something else as background. + */ + _mesa_AlphaFunc(GL_EQUAL, rast); + *bg = ~*fg; + } +} /** - * 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, @@ -1997,6 +2030,7 @@ _mesa_meta_Bitmap(struct gl_context *ctx, GLfloat x, y, z, s, t, r, g, b, a; }; struct vertex verts[4]; + GLubyte bg, fg; GLboolean newTex; GLubyte *bitmap8; @@ -2004,7 +2038,6 @@ _mesa_meta_Bitmap(struct gl_context *ctx, * Check if swrast fallback is needed. */ if (ctx->_ImageTransferState || - ctx->Color.AlphaEnabled || ctx->Fog.Enabled || ctx->Texture._EnabledUnits || width > tex->MaxSize || @@ -2100,16 +2133,16 @@ _mesa_meta_Bitmap(struct gl_context *ctx, return; } - bitmap8 = (GLubyte *) calloc(1, width * height); + bitmap8 = (GLubyte *) malloc(width * height); if (bitmap8) { + setup_bitmap_alpha(ctx, &bg, &fg); + + memset(bitmap8, bg, width * height); _mesa_expand_bitmap(width, height, &unpackSave, bitmap1, - bitmap8, width, 0xff); + bitmap8, width, fg); _mesa_set_enable(ctx, tex->Target, GL_TRUE); - _mesa_set_enable(ctx, GL_ALPHA_TEST, GL_TRUE); - _mesa_AlphaFunc(GL_GREATER, 0.0); - setup_drawpix_texture(ctx, tex, newTex, texIntFormat, width, height, GL_ALPHA, GL_UNSIGNED_BYTE, bitmap8); -- 1.6.4.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev