mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 16:08:04 +02:00
Add ATI_separate_stencil and use it in preference to EXT_stencil_two_side
since the former is what's used for OpenGL 2.0.
This commit is contained in:
parent
faba58c447
commit
467c773f79
4 changed files with 58 additions and 57 deletions
|
|
@ -135,6 +135,7 @@ static const struct {
|
|||
{ OFF, "GL_ATI_texture_env_combine3", F(ATI_texture_env_combine3)},
|
||||
{ OFF, "GL_ATI_texture_mirror_once", F(ATI_texture_mirror_once)},
|
||||
{ OFF, "GL_ATI_fragment_shader", F(ATI_fragment_shader)},
|
||||
{ OFF, "GL_ATI_separate_stencil", F(ATI_separate_stencil)},
|
||||
{ OFF, "GL_IBM_multimode_draw_arrays", F(IBM_multimode_draw_arrays) },
|
||||
{ ON, "GL_IBM_rasterpos_clip", F(IBM_rasterpos_clip) },
|
||||
{ OFF, "GL_IBM_texture_mirrored_repeat", F(ARB_texture_mirrored_repeat)},
|
||||
|
|
@ -222,6 +223,7 @@ _mesa_enable_sw_extensions(GLcontext *ctx)
|
|||
#endif
|
||||
ctx->Extensions.ATI_texture_env_combine3 = GL_TRUE;
|
||||
ctx->Extensions.ATI_texture_mirror_once = GL_TRUE;
|
||||
ctx->Extensions.ATI_separate_stencil = GL_TRUE;
|
||||
ctx->Extensions.EXT_blend_color = GL_TRUE;
|
||||
ctx->Extensions.EXT_blend_equation_separate = GL_TRUE;
|
||||
ctx->Extensions.EXT_blend_func_separate = GL_TRUE;
|
||||
|
|
@ -249,7 +251,7 @@ _mesa_enable_sw_extensions(GLcontext *ctx)
|
|||
ctx->Extensions.EXT_secondary_color = GL_TRUE;
|
||||
ctx->Extensions.EXT_shared_texture_palette = GL_TRUE;
|
||||
ctx->Extensions.EXT_stencil_wrap = GL_TRUE;
|
||||
ctx->Extensions.EXT_stencil_two_side = GL_TRUE;
|
||||
ctx->Extensions.EXT_stencil_two_side = GL_FALSE; /* obsolete */
|
||||
ctx->Extensions.EXT_texture_env_add = GL_TRUE;
|
||||
ctx->Extensions.EXT_texture_env_combine = GL_TRUE;
|
||||
ctx->Extensions.EXT_texture_env_dot3 = GL_TRUE;
|
||||
|
|
@ -388,7 +390,8 @@ _mesa_enable_2_0_extensions(GLcontext *ctx)
|
|||
#if FEATURE_ARB_shading_language_100
|
||||
ctx->Extensions.ARB_shading_language_100 = GL_TRUE;
|
||||
#endif
|
||||
ctx->Extensions.EXT_stencil_two_side = GL_FALSE; /* yes, turn it off */
|
||||
ctx->Extensions.ATI_separate_stencil = GL_TRUE;
|
||||
ctx->Extensions.EXT_stencil_two_side = GL_FALSE; /* obsolete */
|
||||
#if FEATURE_ARB_vertex_shader
|
||||
ctx->Extensions.ARB_vertex_shader = GL_TRUE;
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -54,7 +54,7 @@ _mesa_GetString( GLenum name )
|
|||
static const char *version_1_3 = "1.3 Mesa " MESA_VERSION_STRING;
|
||||
static const char *version_1_4 = "1.4 Mesa " MESA_VERSION_STRING;
|
||||
static const char *version_1_5 = "1.5 Mesa " MESA_VERSION_STRING;
|
||||
static const char *version_2_0 = "1.5 Mesa " MESA_VERSION_STRING;/*XXX FIX*/
|
||||
static const char *version_2_0 = "1.5 Mesa " MESA_VERSION_STRING;
|
||||
|
||||
#if FEATURE_ARB_shading_language_100
|
||||
static const char *sl_version_110 = "1.10 Mesa " MESA_VERSION_STRING;
|
||||
|
|
@ -111,7 +111,7 @@ _mesa_GetString( GLenum name )
|
|||
if (ctx->Extensions.ARB_draw_buffers &&
|
||||
ctx->Extensions.ARB_point_sprite &&
|
||||
ctx->Extensions.ARB_texture_non_power_of_two &&
|
||||
ctx->Extensions.EXT_stencil_two_side) {
|
||||
ctx->Extensions.ATI_separate_stencil) {
|
||||
return (const GLubyte *) version_2_0;
|
||||
}
|
||||
else {
|
||||
|
|
|
|||
|
|
@ -2477,6 +2477,7 @@ struct gl_extensions
|
|||
GLboolean ATI_texture_mirror_once;
|
||||
GLboolean ATI_texture_env_combine3;
|
||||
GLboolean ATI_fragment_shader;
|
||||
GLboolean ATI_separate_stencil;
|
||||
GLboolean IBM_rasterpos_clip;
|
||||
GLboolean IBM_multimode_draw_arrays;
|
||||
GLboolean MESA_pack_invert;
|
||||
|
|
|
|||
|
|
@ -115,23 +115,7 @@ _mesa_StencilFunc( GLenum func, GLint ref, GLuint mask )
|
|||
|
||||
ref = CLAMP( ref, 0, stencilMax );
|
||||
|
||||
if (ctx->Extensions.EXT_stencil_two_side) {
|
||||
/* only set active face state */
|
||||
const GLint face = ctx->Stencil.ActiveFace;
|
||||
if (ctx->Stencil.Function[face] == func &&
|
||||
ctx->Stencil.ValueMask[face] == mask &&
|
||||
ctx->Stencil.Ref[face] == ref)
|
||||
return;
|
||||
FLUSH_VERTICES(ctx, _NEW_STENCIL);
|
||||
ctx->Stencil.Function[face] = func;
|
||||
ctx->Stencil.Ref[face] = ref;
|
||||
ctx->Stencil.ValueMask[face] = mask;
|
||||
if (ctx->Driver.StencilFuncSeparate) {
|
||||
ctx->Driver.StencilFuncSeparate(ctx, face ? GL_BACK : GL_FRONT,
|
||||
func, ref, mask);
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (ctx->Extensions.ATI_separate_stencil) {
|
||||
/* set both front and back state */
|
||||
if (ctx->Stencil.Function[0] == func &&
|
||||
ctx->Stencil.Function[1] == func &&
|
||||
|
|
@ -149,6 +133,22 @@ _mesa_StencilFunc( GLenum func, GLint ref, GLuint mask )
|
|||
func, ref, mask);
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* only set active face state */
|
||||
const GLint face = ctx->Stencil.ActiveFace;
|
||||
if (ctx->Stencil.Function[face] == func &&
|
||||
ctx->Stencil.ValueMask[face] == mask &&
|
||||
ctx->Stencil.Ref[face] == ref)
|
||||
return;
|
||||
FLUSH_VERTICES(ctx, _NEW_STENCIL);
|
||||
ctx->Stencil.Function[face] = func;
|
||||
ctx->Stencil.Ref[face] = ref;
|
||||
ctx->Stencil.ValueMask[face] = mask;
|
||||
if (ctx->Driver.StencilFuncSeparate) {
|
||||
ctx->Driver.StencilFuncSeparate(ctx, face ? GL_BACK : GL_FRONT,
|
||||
func, ref, mask);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -169,18 +169,7 @@ _mesa_StencilMask( GLuint mask )
|
|||
GET_CURRENT_CONTEXT(ctx);
|
||||
ASSERT_OUTSIDE_BEGIN_END(ctx);
|
||||
|
||||
if (ctx->Extensions.EXT_stencil_two_side) {
|
||||
/* only set active face state */
|
||||
const GLint face = ctx->Stencil.ActiveFace;
|
||||
if (ctx->Stencil.WriteMask[face] == mask)
|
||||
return;
|
||||
FLUSH_VERTICES(ctx, _NEW_STENCIL);
|
||||
ctx->Stencil.WriteMask[face] = mask;
|
||||
if (ctx->Driver.StencilMaskSeparate) {
|
||||
ctx->Driver.StencilMaskSeparate(ctx, face ? GL_BACK : GL_FRONT, mask);
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (ctx->Extensions.ATI_separate_stencil) {
|
||||
/* set both front and back state */
|
||||
if (ctx->Stencil.WriteMask[0] == mask &&
|
||||
ctx->Stencil.WriteMask[1] == mask)
|
||||
|
|
@ -191,6 +180,17 @@ _mesa_StencilMask( GLuint mask )
|
|||
ctx->Driver.StencilMaskSeparate(ctx, GL_FRONT_AND_BACK, mask);
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* only set active face state */
|
||||
const GLint face = ctx->Stencil.ActiveFace;
|
||||
if (ctx->Stencil.WriteMask[face] == mask)
|
||||
return;
|
||||
FLUSH_VERTICES(ctx, _NEW_STENCIL);
|
||||
ctx->Stencil.WriteMask[face] = mask;
|
||||
if (ctx->Driver.StencilMaskSeparate) {
|
||||
ctx->Driver.StencilMaskSeparate(ctx, face ? GL_BACK : GL_FRONT, mask);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -269,23 +269,7 @@ _mesa_StencilOp(GLenum fail, GLenum zfail, GLenum zpass)
|
|||
return;
|
||||
}
|
||||
|
||||
if (ctx->Extensions.EXT_stencil_two_side) {
|
||||
/* only set active face state */
|
||||
const GLint face = ctx->Stencil.ActiveFace;
|
||||
if (ctx->Stencil.ZFailFunc[face] == zfail &&
|
||||
ctx->Stencil.ZPassFunc[face] == zpass &&
|
||||
ctx->Stencil.FailFunc[face] == fail)
|
||||
return;
|
||||
FLUSH_VERTICES(ctx, _NEW_STENCIL);
|
||||
ctx->Stencil.ZFailFunc[face] = zfail;
|
||||
ctx->Stencil.ZPassFunc[face] = zpass;
|
||||
ctx->Stencil.FailFunc[face] = fail;
|
||||
if (ctx->Driver.StencilOpSeparate) {
|
||||
ctx->Driver.StencilOpSeparate(ctx, face ? GL_BACK : GL_FRONT,
|
||||
fail, zfail, zpass);
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (ctx->Extensions.ATI_separate_stencil) {
|
||||
/* set both front and back state */
|
||||
if (ctx->Stencil.ZFailFunc[0] == zfail &&
|
||||
ctx->Stencil.ZFailFunc[1] == zfail &&
|
||||
|
|
@ -303,6 +287,22 @@ _mesa_StencilOp(GLenum fail, GLenum zfail, GLenum zpass)
|
|||
fail, zfail, zpass);
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* only set active face state */
|
||||
const GLint face = ctx->Stencil.ActiveFace;
|
||||
if (ctx->Stencil.ZFailFunc[face] == zfail &&
|
||||
ctx->Stencil.ZPassFunc[face] == zpass &&
|
||||
ctx->Stencil.FailFunc[face] == fail)
|
||||
return;
|
||||
FLUSH_VERTICES(ctx, _NEW_STENCIL);
|
||||
ctx->Stencil.ZFailFunc[face] = zfail;
|
||||
ctx->Stencil.ZPassFunc[face] = zpass;
|
||||
ctx->Stencil.FailFunc[face] = fail;
|
||||
if (ctx->Driver.StencilOpSeparate) {
|
||||
ctx->Driver.StencilOpSeparate(ctx, face ? GL_BACK : GL_FRONT,
|
||||
fail, zfail, zpass);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -406,17 +406,16 @@ _mesa_StencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
|
|||
|
||||
FLUSH_VERTICES(ctx, _NEW_STENCIL);
|
||||
|
||||
if (face == GL_FRONT || face == GL_FRONT_AND_BACK) {
|
||||
if (face != GL_BACK) {
|
||||
ctx->Stencil.FailFunc[0] = fail;
|
||||
ctx->Stencil.ZFailFunc[0] = zfail;
|
||||
ctx->Stencil.ZPassFunc[0] = zpass;
|
||||
}
|
||||
if (face == GL_BACK || face == GL_FRONT_AND_BACK) {
|
||||
if (face != GL_FRONT) {
|
||||
ctx->Stencil.FailFunc[1] = fail;
|
||||
ctx->Stencil.ZFailFunc[1] = zfail;
|
||||
ctx->Stencil.ZPassFunc[1] = zpass;
|
||||
}
|
||||
|
||||
if (ctx->Driver.StencilOpSeparate) {
|
||||
ctx->Driver.StencilOpSeparate(ctx, face, fail, zfail, zpass);
|
||||
}
|
||||
|
|
@ -465,7 +464,6 @@ _mesa_StencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
|
|||
ctx->Stencil.Ref[1] = ref;
|
||||
ctx->Stencil.ValueMask[1] = mask;
|
||||
}
|
||||
|
||||
if (ctx->Driver.StencilFuncSeparate) {
|
||||
ctx->Driver.StencilFuncSeparate(ctx, face, func, ref, mask);
|
||||
}
|
||||
|
|
@ -486,13 +484,12 @@ _mesa_StencilMaskSeparate(GLenum face, GLuint mask)
|
|||
|
||||
FLUSH_VERTICES(ctx, _NEW_STENCIL);
|
||||
|
||||
if (face == GL_FRONT || face == GL_FRONT_AND_BACK) {
|
||||
if (face != GL_BACK) {
|
||||
ctx->Stencil.WriteMask[0] = mask;
|
||||
}
|
||||
if (face == GL_BACK || face == GL_FRONT_AND_BACK) {
|
||||
if (face != GL_FRONT) {
|
||||
ctx->Stencil.WriteMask[1] = mask;
|
||||
}
|
||||
|
||||
if (ctx->Driver.StencilMaskSeparate) {
|
||||
ctx->Driver.StencilMaskSeparate(ctx, face, mask);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue