Add support for GL_EXT_stencil_wrap, from hearing that the windows drivers did

it, and guessing that the two remaining entries in the 3-bit values were the
new funcs.  Tested with modified stencilwrap test.  Also, remove the commented
fallback stuff -- more modification to stencilwrap suggests that those issues
were just from span readback, not stencil implementation.
This commit is contained in:
Eric Anholt 2005-10-27 21:21:05 +00:00
parent 215c4c3a9c
commit 4b9f1308e5
3 changed files with 25 additions and 17 deletions

View file

@ -84,6 +84,7 @@ const struct dri_extension card_extensions[] =
{ "GL_EXT_fog_coord", GL_EXT_fog_coord_functions },
{ "GL_EXT_texture_edge_clamp", NULL },
{ "GL_EXT_secondary_color", GL_EXT_secondary_color_functions },
{ "GL_EXT_stencil_wrap", NULL },
{ "GL_MESA_ycbcr_texture", NULL },
{ "GL_NV_blend_square", NULL },
{ "GL_SGIS_generate_mipmap", NULL },

View file

@ -322,7 +322,6 @@ static void r128DDStencilOpSeparate( GLcontext *ctx, GLenum face, GLenum fail,
{
r128ContextPtr rmesa = R128_CONTEXT(ctx);
GLuint z = rmesa->setup.z_sten_cntl_c;
GLboolean ok = 1;
if (!( ctx->Visual.stencilBits > 0 && ctx->Visual.depthBits == 24 ))
return;
@ -336,11 +335,9 @@ static void r128DDStencilOpSeparate( GLcontext *ctx, GLenum face, GLenum fail,
break;
case GL_ZERO:
z |= R128_STENCIL_S_FAIL_ZERO;
ok = 0; /* Hardware bug? ZERO maps to KEEP */
break;
case GL_REPLACE:
z |= R128_STENCIL_S_FAIL_REPLACE;
ok = 0; /* Hardware bug? REPLACE maps to KEEP */
break;
case GL_INCR:
z |= R128_STENCIL_S_FAIL_INC;
@ -350,14 +347,18 @@ static void r128DDStencilOpSeparate( GLcontext *ctx, GLenum face, GLenum fail,
break;
case GL_INVERT:
z |= R128_STENCIL_S_FAIL_INV;
ok = 0; /* Hardware bug? INV maps to ZERO */
break;
case GL_INCR_WRAP:
z |= R128_STENCIL_S_FAIL_INC_WRAP;
break;
case GL_DECR_WRAP:
z |= R128_STENCIL_S_FAIL_DEC_WRAP;
break;
}
switch ( ctx->Stencil.ZFailFunc[0] ) {
case GL_KEEP:
z |= R128_STENCIL_ZFAIL_KEEP;
ok = 0; /* Hardware bug? KEEP maps to ZERO */
break;
case GL_ZERO:
z |= R128_STENCIL_ZFAIL_ZERO;
@ -373,14 +374,18 @@ static void r128DDStencilOpSeparate( GLcontext *ctx, GLenum face, GLenum fail,
break;
case GL_INVERT:
z |= R128_STENCIL_ZFAIL_INV;
ok = 0; /* Hardware bug? INV maps to ZERO */
break;
case GL_INCR_WRAP:
z |= R128_STENCIL_ZFAIL_INC_WRAP;
break;
case GL_DECR_WRAP:
z |= R128_STENCIL_ZFAIL_DEC_WRAP;
break;
}
switch ( ctx->Stencil.ZPassFunc[0] ) {
case GL_KEEP:
z |= R128_STENCIL_ZPASS_KEEP;
ok = 0; /* Hardware bug? KEEP maps to ZERO */
break;
case GL_ZERO:
z |= R128_STENCIL_ZPASS_ZERO;
@ -393,22 +398,18 @@ static void r128DDStencilOpSeparate( GLcontext *ctx, GLenum face, GLenum fail,
break;
case GL_DECR:
z |= R128_STENCIL_ZPASS_DEC;
ok = 0; /* Hardware bug? DEC maps to INCR_WRAP */
break;
case GL_INVERT:
z |= R128_STENCIL_ZPASS_INV;
ok = 0; /* Hardware bug? INV maps to ZERO */
break;
case GL_INCR_WRAP:
z |= R128_STENCIL_ZPASS_INC_WRAP;
break;
case GL_DECR_WRAP:
z |= R128_STENCIL_ZPASS_DEC_WRAP;
break;
}
/* XXX: Now that we know whether we can do the given funcs successfully
* (according to testing done with a modified stencilwrap test), go
* ahead and drop that knowledge on the floor. While fallbacks remain
* broken, they make the situation even worse (in test apps, at least) than
* failing in just the stencil part.
*/
/*FALLBACK( rmesa, R128_FALLBACK_STENCIL, !ok );*/
if ( rmesa->setup.z_sten_cntl_c != z ) {
rmesa->setup.z_sten_cntl_c = z;
rmesa->dirty |= R128_UPLOAD_CONTEXT;

View file

@ -1075,6 +1075,8 @@
# define R128_STENCIL_S_FAIL_INC (3 << 16)
# define R128_STENCIL_S_FAIL_DEC (4 << 16)
# define R128_STENCIL_S_FAIL_INV (5 << 16)
# define R128_STENCIL_S_FAIL_INC_WRAP (6 << 16) /* GUESS */
# define R128_STENCIL_S_FAIL_DEC_WRAP (7 << 16) /* GUESS */
# define R128_STENCIL_S_FAIL_MASK (7 << 16)
# define R128_STENCIL_ZPASS_KEEP (0 << 20)
# define R128_STENCIL_ZPASS_ZERO (1 << 20)
@ -1082,6 +1084,8 @@
# define R128_STENCIL_ZPASS_INC (3 << 20)
# define R128_STENCIL_ZPASS_DEC (4 << 20)
# define R128_STENCIL_ZPASS_INV (5 << 20)
# define R128_STENCIL_ZPASS_INC_WRAP (6 << 20) /* GUESS */
# define R128_STENCIL_ZPASS_DEC_WRAP (7 << 20) /* GUESS */
# define R128_STENCIL_ZPASS_MASK (7 << 20)
# define R128_STENCIL_ZFAIL_KEEP (0 << 24)
# define R128_STENCIL_ZFAIL_ZERO (1 << 24)
@ -1089,6 +1093,8 @@
# define R128_STENCIL_ZFAIL_INC (3 << 24)
# define R128_STENCIL_ZFAIL_DEC (4 << 24)
# define R128_STENCIL_ZFAIL_INV (5 << 24)
# define R128_STENCIL_ZFAIL_INC_WRAP (6 << 24) /* GUESS */
# define R128_STENCIL_ZFAIL_DEC_WRAP (7 << 24) /* GUESS */
# define R128_STENCIL_ZFAIL_MASK (7 << 24)
#define R128_TEX_CNTL_C 0x1c9c
# define R128_Z_ENABLE (1 << 0)