diff options
| -rw-r--r-- | src/mesa/main/extensions.c | 7 | ||||
| -rw-r--r-- | src/mesa/main/getstring.c | 4 | ||||
| -rw-r--r-- | src/mesa/main/mtypes.h | 1 | ||||
| -rw-r--r-- | src/mesa/main/stencil.c | 101 | 
4 files changed, 57 insertions, 56 deletions
diff --git a/src/mesa/main/extensions.c b/src/mesa/main/extensions.c index 5edf9a7dd6..39f8e26f57 100644 --- a/src/mesa/main/extensions.c +++ b/src/mesa/main/extensions.c @@ -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 diff --git a/src/mesa/main/getstring.c b/src/mesa/main/getstring.c index a68bf9ff74..f2989aaefa 100644 --- a/src/mesa/main/getstring.c +++ b/src/mesa/main/getstring.c @@ -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 { diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index 1399dddf50..337b0d2720 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -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; diff --git a/src/mesa/main/stencil.c b/src/mesa/main/stencil.c index 9992ec9b6e..d6be410e76 100644 --- a/src/mesa/main/stencil.c +++ b/src/mesa/main/stencil.c @@ -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,26 +169,26 @@ _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) +   if (ctx->Extensions.ATI_separate_stencil) { +      /* set both front and back state */ +      if (ctx->Stencil.WriteMask[0] == mask && +          ctx->Stencil.WriteMask[1] == mask)           return;        FLUSH_VERTICES(ctx, _NEW_STENCIL); -      ctx->Stencil.WriteMask[face] = mask; +      ctx->Stencil.WriteMask[0] = ctx->Stencil.WriteMask[1] = mask;        if (ctx->Driver.StencilMaskSeparate) { -         ctx->Driver.StencilMaskSeparate(ctx, face ? GL_BACK : GL_FRONT, mask); +         ctx->Driver.StencilMaskSeparate(ctx, GL_FRONT_AND_BACK, mask);        }     }     else { -      /* set both front and back state */ -      if (ctx->Stencil.WriteMask[0] == mask && -          ctx->Stencil.WriteMask[1] == mask) +      /* 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[0] = ctx->Stencil.WriteMask[1] = mask; +      ctx->Stencil.WriteMask[face] = mask;        if (ctx->Driver.StencilMaskSeparate) { -         ctx->Driver.StencilMaskSeparate(ctx, GL_FRONT_AND_BACK, mask); +         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);     }  | 
