mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-07 04:58:05 +02:00
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:
parent
215c4c3a9c
commit
4b9f1308e5
3 changed files with 25 additions and 17 deletions
|
|
@ -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 },
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue