diff options
author | syrjala <syrjala> | 2003-11-12 22:04:40 +0000 |
---|---|---|
committer | syrjala <syrjala> | 2003-11-12 22:04:40 +0000 |
commit | 46d031a4c56801f8bdd551a92847f830e4561769 (patch) | |
tree | 149d2085030dff0aaefa56938fb8f71f5982e587 | |
parent | ad58b82fb750ac92524b694587295b34cb17ff5e (diff) |
Blending and logic op fixes:
- Enable hw logic op (glean is happy), remove the sw fallback
- Don't use a software alpha buffer
- Add a sw fallback for glBlendFunc(GL_SRC_ALPHA_SATURATE, GL_ZERO);
- Advertise EXT_blend_logic_op
-rw-r--r-- | xc/lib/GL/mesa/src/drv/mga/mga_xmesa.c | 3 | ||||
-rw-r--r-- | xc/lib/GL/mesa/src/drv/mga/mgacontext.h | 2 | ||||
-rw-r--r-- | xc/lib/GL/mesa/src/drv/mga/mgastate.c | 74 | ||||
-rw-r--r-- | xc/lib/GL/mesa/src/drv/mga/mgatris.c | 2 |
4 files changed, 29 insertions, 52 deletions
diff --git a/xc/lib/GL/mesa/src/drv/mga/mga_xmesa.c b/xc/lib/GL/mesa/src/drv/mga/mga_xmesa.c index db7fa6bb0..ffe4267c5 100644 --- a/xc/lib/GL/mesa/src/drv/mga/mga_xmesa.c +++ b/xc/lib/GL/mesa/src/drv/mga/mga_xmesa.c @@ -302,6 +302,7 @@ static const char * const card_extensions[] = { "GL_ARB_multisample", "GL_ARB_texture_compression", + "GL_EXT_blend_logic_op", "GL_EXT_fog_coord", /* paletted_textures currently doesn't work, but we could fix them later */ #if 0 @@ -604,7 +605,7 @@ mgaCreateBuffer( __DRIscreenPrivate *driScrnPriv, GL_FALSE, /* software depth buffer? */ swStencil, mesaVis->accumRedBits > 0, - mesaVis->alphaBits > 0 ); + GL_FALSE ); /* software alpha buffer? */ return (driDrawPriv->driverPrivate != NULL); } diff --git a/xc/lib/GL/mesa/src/drv/mga/mgacontext.h b/xc/lib/GL/mesa/src/drv/mga/mgacontext.h index 6a67a4bf1..15cb84531 100644 --- a/xc/lib/GL/mesa/src/drv/mga/mgacontext.h +++ b/xc/lib/GL/mesa/src/drv/mga/mgacontext.h @@ -56,7 +56,7 @@ #define MGA_FALLBACK_TEXTURE 0x1 #define MGA_FALLBACK_DRAW_BUFFER 0x2 #define MGA_FALLBACK_READ_BUFFER 0x4 -#define MGA_FALLBACK_LOGICOP 0x8 +#define MGA_FALLBACK_BLEND 0x8 #define MGA_FALLBACK_RENDERMODE 0x10 #define MGA_FALLBACK_STENCIL 0x20 #define MGA_FALLBACK_DEPTH 0x40 diff --git a/xc/lib/GL/mesa/src/drv/mga/mgastate.c b/xc/lib/GL/mesa/src/drv/mga/mgastate.c index 53de7f715..15bd1a936 100644 --- a/xc/lib/GL/mesa/src/drv/mga/mgastate.c +++ b/xc/lib/GL/mesa/src/drv/mga/mgastate.c @@ -50,13 +50,8 @@ #include "xmlpool.h" - static void updateSpecularLighting( GLcontext *ctx ); - -/* Some outstanding problems with accelerating logic ops... - */ -#if defined(ACCEL_ROP) static const GLuint mgarop_NoBLK[16] = { DC_atype_rpl | 0x00000000, DC_atype_rstr | 0x00080000, DC_atype_rstr | 0x00040000, DC_atype_rpl | 0x000c0000, @@ -67,8 +62,6 @@ static const GLuint mgarop_NoBLK[16] = { DC_atype_rpl | 0x00030000, DC_atype_rstr | 0x000b0000, DC_atype_rstr | 0x00070000, DC_atype_rpl | 0x000f0000 }; -#endif - /* ============================================================= * Alpha blending @@ -117,26 +110,28 @@ static void mgaDDAlphaFunc(GLcontext *ctx, GLenum func, GLfloat ref) mmesa->hw.alpha_func = a | MGA_FIELD( AC_atref, refByte ); } -static void mgaDDBlendEquation(GLcontext *ctx, GLenum mode) +static void updateBlendLogicOp(GLcontext *ctx) { mgaContextPtr mmesa = MGA_CONTEXT(ctx); MGA_STATECHANGE( mmesa, MGA_UPLOAD_CONTEXT ); - /* BlendEquation sets ColorLogicOpEnabled in an unexpected - * manner. - */ -#if !defined(ACCEL_ROP) - FALLBACK( ctx, MGA_FALLBACK_LOGICOP, - (ctx->Color.ColorLogicOpEnabled && - ctx->Color.LogicOp != GL_COPY)); -#endif + mmesa->hw.blend_func_enable = + (ctx->Color.BlendEnabled && !ctx->Color._LogicOpEnabled) ? ~0 : 0; + + FALLBACK( ctx, MGA_FALLBACK_BLEND, + ctx->Color.BlendEnabled && !ctx->Color._LogicOpEnabled && + mmesa->hw.blend_func == (AC_src_src_alpha_sat | AC_dst_zero) ); +} + +static void mgaDDBlendEquation(GLcontext *ctx, GLenum mode) +{ + updateBlendLogicOp( ctx ); } static void mgaDDBlendFunc(GLcontext *ctx, GLenum sfactor, GLenum dfactor) { mgaContextPtr mmesa = MGA_CONTEXT(ctx); - mgaScreenPrivate *mgaScreen = mmesa->mgaScreen; GLuint src; GLuint dst; @@ -155,11 +150,11 @@ static void mgaDDBlendFunc(GLcontext *ctx, GLenum sfactor, GLenum dfactor) case GL_ONE_MINUS_SRC_ALPHA: src = AC_src_om_src_alpha; break; case GL_DST_ALPHA: - src = (mgaScreen->cpp == 4) + src = (ctx->Visual.alphaBits > 0) ? AC_src_dst_alpha : AC_src_one; break; case GL_ONE_MINUS_DST_ALPHA: - src = (mgaScreen->cpp == 4) + src = (ctx->Visual.alphaBits > 0) ? AC_src_om_dst_alpha : AC_src_zero; break; case GL_SRC_ALPHA_SATURATE: @@ -183,17 +178,21 @@ static void mgaDDBlendFunc(GLcontext *ctx, GLenum sfactor, GLenum dfactor) case GL_ONE_MINUS_SRC_COLOR: dst = AC_dst_om_src_color; break; case GL_DST_ALPHA: - dst = (mgaScreen->cpp == 4) + dst = (ctx->Visual.alphaBits > 0) ? AC_dst_dst_alpha : AC_dst_one; break; case GL_ONE_MINUS_DST_ALPHA: - dst = (mgaScreen->cpp == 4) + dst = (ctx->Visual.alphaBits > 0) ? AC_dst_om_dst_alpha : AC_dst_zero; break; } MGA_STATECHANGE( mmesa, MGA_UPLOAD_CONTEXT ); mmesa->hw.blend_func = (src | dst); + + FALLBACK( ctx, MGA_FALLBACK_BLEND, + ctx->Color.BlendEnabled && !ctx->Color._LogicOpEnabled && + mmesa->hw.blend_func == (AC_src_src_alpha_sat | AC_dst_zero) ); } static void mgaDDBlendFuncSeparate( GLcontext *ctx, GLenum sfactorRGB, @@ -203,7 +202,6 @@ static void mgaDDBlendFuncSeparate( GLcontext *ctx, GLenum sfactorRGB, mgaDDBlendFunc( ctx, sfactorRGB, dfactorRGB ); } - /* ============================================================= * Depth testing */ @@ -742,12 +740,7 @@ static void mgaDDLogicOp( GLcontext *ctx, GLenum opcode ) mgaContextPtr mmesa = MGA_CONTEXT( ctx ); MGA_STATECHANGE( mmesa, MGA_UPLOAD_CONTEXT ); -#if defined(ACCEL_ROP) mmesa->hw.rop = mgarop_NoBLK[ opcode & 0x0f ]; -#else - FALLBACK( ctx, MGA_FALLBACK_LOGICOP, - (ctx->Color.ColorLogicOpEnabled && opcode != GL_COPY) ); -#endif } @@ -893,18 +886,6 @@ static void mgaDDEnable(GLcontext *ctx, GLenum cap, GLboolean state) MGA_STATECHANGE( mmesa, MGA_UPLOAD_CONTEXT ); mmesa->hw.alpha_func_enable = (state) ? ~0 : 0; break; - case GL_BLEND: - MGA_STATECHANGE( mmesa, MGA_UPLOAD_CONTEXT ); - mmesa->hw.blend_func_enable = (state) ? ~0 : 0; - - /* For some reason enable(GL_BLEND) affects ColorLogicOpEnabled. - */ -#if !defined(ACCEL_ROP) - FALLBACK( ctx, MGA_FALLBACK_LOGICOP, - (ctx->Color.ColorLogicOpEnabled && - ctx->Color.LogicOp != GL_COPY)); -#endif - break; case GL_DEPTH_TEST: MGA_STATECHANGE( mmesa, MGA_UPLOAD_CONTEXT ); FALLBACK (ctx, MGA_FALLBACK_DEPTH, @@ -939,13 +920,12 @@ static void mgaDDEnable(GLcontext *ctx, GLenum cap, GLboolean state) mmesa->setup.dwgctl |= mmesa->poly_stipple; } break; + + case GL_BLEND: case GL_COLOR_LOGIC_OP: - MGA_STATECHANGE( mmesa, MGA_UPLOAD_CONTEXT ); -#if !defined(ACCEL_ROP) - FALLBACK( ctx, MGA_FALLBACK_LOGICOP, - (state && ctx->Color.LogicOp != GL_COPY)); -#endif + updateBlendLogicOp( ctx ); break; + case GL_STENCIL_TEST: MGA_STATECHANGE( mmesa, MGA_UPLOAD_CONTEXT ); if (mmesa->hw_stencil) { @@ -1012,11 +992,9 @@ void mgaEmitHwStateLocked( mgaContextPtr mmesa ) mmesa->setup.dwgctl |= (ctx->Depth.Test) ? mmesa->hw.zmode : (DC_zmode_nozcmp | DC_atype_i); -#if defined(ACCEL_ROP) mmesa->setup.dwgctl &= DC_bop_MASK; - mmesa->setup.dwgctl |= (ctx->Color.ColorLogicOpEnabled) + mmesa->setup.dwgctl |= (ctx->Color._LogicOpEnabled) ? mmesa->hw.rop : mgarop_NoBLK[ GL_COPY & 0x0f ]; -#endif mmesa->setup.alphactrl &= AC_src_MASK & AC_dst_MASK & AC_atmode_MASK & AC_atref_MASK & AC_alphasel_MASK; @@ -1169,9 +1147,7 @@ void mgaInitState( mgaContextPtr mmesa ) mmesa->hw.blend_func_enable = 0; mmesa->hw.alpha_func = AC_atmode_noacmp | MGA_FIELD( AC_atref, 0x00 ); mmesa->hw.alpha_func_enable = 0; -#if defined(ACCEL_ROP) mmesa->hw.rop = mgarop_NoBLK[ GL_COPY & 0x0f ]; -#endif mmesa->hw.zmode = DC_zmode_zlt | DC_atype_zi; mmesa->hw.stencil = MGA_FIELD( S_sref, 0x00) | MGA_FIELD( S_smsk, 0xff ) | MGA_FIELD( S_swtmsk, 0xff ); diff --git a/xc/lib/GL/mesa/src/drv/mga/mgatris.c b/xc/lib/GL/mesa/src/drv/mga/mgatris.c index 1c193066f..651c93ccd 100644 --- a/xc/lib/GL/mesa/src/drv/mga/mgatris.c +++ b/xc/lib/GL/mesa/src/drv/mga/mgatris.c @@ -830,7 +830,7 @@ static const char * const fallbackStrings[] = { "Texture mode", "glDrawBuffer(GL_FRONT_AND_BACK)", "read buffer", - "LogicOp != GL_COPY", + "glBlendFunc(GL_SRC_ALPHA_SATURATE, GL_ZERO)", "glRenderMode(selection or feedback)", "No hardware stencil", "glDepthFunc( GL_NEVER )", |