summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsyrjala <syrjala>2003-11-12 22:04:40 +0000
committersyrjala <syrjala>2003-11-12 22:04:40 +0000
commit46d031a4c56801f8bdd551a92847f830e4561769 (patch)
tree149d2085030dff0aaefa56938fb8f71f5982e587
parentad58b82fb750ac92524b694587295b34cb17ff5e (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.c3
-rw-r--r--xc/lib/GL/mesa/src/drv/mga/mgacontext.h2
-rw-r--r--xc/lib/GL/mesa/src/drv/mga/mgastate.c74
-rw-r--r--xc/lib/GL/mesa/src/drv/mga/mgatris.c2
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 )",