finished up GL_EXT_stencil_two_side
authorBrian Paul <brian.paul@tungstengraphics.com>
Wed, 2 Oct 2002 23:24:04 +0000 (23:24 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Wed, 2 Oct 2002 23:24:04 +0000 (23:24 +0000)
src/mesa/main/mtypes.h
src/mesa/swrast/s_span.c
src/mesa/swrast/s_stencil.c
src/mesa/swrast/s_stencil.h
src/mesa/swrast/s_tritemp.h
src/mesa/swrast/swrast.h
src/mesa/swrast_setup/ss_triangle.c
src/mesa/swrast_setup/ss_tritmp.h

index dfe1ad883e31ff429d4152aaa5330d51ba517a35..83a63bfa118792439daaa48f2848fbbeb8769fd2 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: mtypes.h,v 1.91 2002/10/02 22:05:55 brianp Exp $ */
+/* $Id: mtypes.h,v 1.92 2002/10/02 23:24:04 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -1786,6 +1786,10 @@ struct __GLcontextRec {
 
    GLboolean OcclusionResult;       /**< for GL_HP_occlusion_test */
    GLboolean OcclusionResultSaved;  /**< for GL_HP_occlusion_test */
+   GLuint _Facing; /* This is a hack for 2-sided stencil test.  We don't */
+                   /* have a better way to communicate this value from */
+                   /* swrast_setup to swrast. */
+
 
    /* Z buffer stuff */
    GLuint DepthMax;    /**< Max depth buffer value */
index 74fccc55c7219227eb492bd3c564c0b39234189e..b134890a3b28f00e2da5610de4f0927c2bb83e9c 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: s_span.c,v 1.47 2002/09/06 02:56:09 brianp Exp $ */
+/* $Id: s_span.c,v 1.48 2002/10/02 23:24:04 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -803,8 +803,7 @@ _mesa_write_index_span( GLcontext *ctx, struct sw_span *span)
          _mesa_span_interpolate_z(ctx, span);
 
       if (ctx->Stencil.Enabled) {
-         const GLuint face = 0;  /* XXX stencil two side */
-         if (!_mesa_stencil_and_ztest_span(ctx, span, face)) {
+         if (!_mesa_stencil_and_ztest_span(ctx, span)) {
             span->arrayMask = origArrayMask;
             return;
          }
@@ -983,8 +982,7 @@ _mesa_write_rgba_span( GLcontext *ctx, struct sw_span *span)
          _mesa_span_interpolate_z(ctx, span);
 
       if (ctx->Stencil.Enabled) {
-         const GLuint face = 0;  /* XXX stencil two side */
-         if (!_mesa_stencil_and_ztest_span(ctx, span, face)) {
+         if (!_mesa_stencil_and_ztest_span(ctx, span)) {
             span->interpMask = origInterpMask;
             span->arrayMask = origArrayMask;
             return;
@@ -1214,8 +1212,7 @@ _mesa_write_texture_span( GLcontext *ctx, struct sw_span *span)
          _mesa_span_interpolate_z(ctx, span);
 
       if (ctx->Stencil.Enabled) {
-         const GLuint face = 0;  /* XXX stencil two side */
-         if (!_mesa_stencil_and_ztest_span(ctx, span, face)) {
+         if (!_mesa_stencil_and_ztest_span(ctx, span)) {
             span->arrayMask = origArrayMask;
             return;
          }
index 4ec64ee8481f912dc8612668de5da58e6954d4a2..90ff06c951d7b611ed6bf8fa05e7979297618b0e 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: s_stencil.c,v 1.26 2002/09/06 02:56:09 brianp Exp $ */
+/* $Id: s_stencil.c,v 1.27 2002/10/02 23:24:04 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -1006,12 +1006,14 @@ stencil_and_ztest_pixels( GLcontext *ctx, struct sw_span *span, GLuint face )
  * GL_FALSE = all fragments failed.
  */
 GLboolean
-_mesa_stencil_and_ztest_span(GLcontext *ctx, struct sw_span *span, GLuint face)
+_mesa_stencil_and_ztest_span(GLcontext *ctx, struct sw_span *span)
 {
+   /* span->facing can only be non-zero if using two-sided stencil */
+   ASSERT(ctx->Stencil.TestTwoSide || span->facing == 0);
    if (span->arrayMask & SPAN_XY)
-      return stencil_and_ztest_pixels(ctx, span, face);
+      return stencil_and_ztest_pixels(ctx, span, span->facing);
    else
-      return stencil_and_ztest_span(ctx, span, face);
+      return stencil_and_ztest_span(ctx, span, span->facing);
 }
 
 
index ec76edaf78b40cddd31e97e4ce056cde7d757d4a..b174f2e01e1d43a72cf8b6a22b1d9d4b47dfe6a7 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: s_stencil.h,v 1.8 2002/09/06 02:56:09 brianp Exp $ */
+/* $Id: s_stencil.h,v 1.9 2002/10/02 23:24:04 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -35,7 +35,7 @@
 
 
 extern GLboolean
-_mesa_stencil_and_ztest_span(GLcontext *ctx, struct sw_span *span, GLuint face);
+_mesa_stencil_and_ztest_span(GLcontext *ctx, struct sw_span *span);
 
 
 
index 726f17e9bb4354250044a6e11c4d0efaab1ff5a1..ef5e00eb5bfabb3d688f35fad6a440471c2ef146 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: s_tritemp.h,v 1.38 2002/08/07 15:18:42 brianp Exp $ */
+/* $Id: s_tritemp.h,v 1.39 2002/10/02 23:24:04 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
 #ifndef DO_OCCLUSION_TEST
    ctx->OcclusionResult = GL_TRUE;
 #endif
+   span.facing = ctx->_Facing; /* for 2-sided stencil test */
 
    /* Edge setup.  For a triangle strip these could be reused... */
    {
index 4db055b6fe15b84c3284e88769f4c1ee9f3d6241..2d547c889eafa3bcd527da06d9755ba4861783f4 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: swrast.h,v 1.27 2002/09/17 15:46:36 brianp Exp $ */
+/* $Id: swrast.h,v 1.28 2002/10/02 23:24:04 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -147,6 +147,9 @@ struct sw_span {
    /** either GL_POLYGON, GL_LINE, GL_POLYGON, GL_BITMAP */
    GLenum primitive;
 
+   /** 0 = front-facing span, 1 = back-facing span (for two-sided stencil) */
+   GLuint facing;
+
    /**
     * This bitmask (of SPAN_* flags) indicates which of the x/xStep
     * variables are relevant.
@@ -201,6 +204,7 @@ do {                                                                \
    (S).arrayMask = (ARRAY_MASK);                               \
    (S).start = 0;                                              \
    (S).end = (END);                                            \
+   (S).facing = 0;                                             \
    (S).array = SWRAST_CONTEXT(ctx)->span_data;                 \
 } while (0)
 
index 159dc799efc89dbb2ea901f81b27b6ac7b5f5221..fa1f3e74e9067a2b75a0d6f81175fc8ad401392a 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: ss_triangle.c,v 1.16 2002/10/02 21:44:08 brianp Exp $ */
+/* $Id: ss_triangle.c,v 1.17 2002/10/02 23:24:04 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -273,9 +273,15 @@ void _swsetup_choose_trifuncs( GLcontext *ctx )
    if (ctx->Light.Enabled && ctx->Light.Model.TwoSide)
       ind |= SS_TWOSIDE_BIT;
 
-   if (ctx->_TriangleCaps & DD_TRI_UNFILLED)
+   /* We piggyback the two-sided stencil front/back determination on the
+    * unfilled triangle path.
+    */
+   if ((ctx->_TriangleCaps & DD_TRI_UNFILLED) ||
+       (ctx->Stencil.Enabled && ctx->Stencil.TestTwoSide))
       ind |= SS_UNFILLED_BIT;
 
+   ctx->_Facing = 0;
+
    if (ctx->Visual.rgbMode)
       ind |= SS_RGBA_BIT;
 
index 61d1f8008a405674c8c0ef18810974c6af2b4455..2a1ff14cf9cae86f853c823dff993b51b54fb3fa 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: ss_tritmp.h,v 1.15 2001/09/14 21:36:43 brianp Exp $ */
+/* $Id: ss_tritmp.h,v 1.16 2002/10/02 23:24:04 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -54,6 +54,7 @@ static void TAG(triangle)(GLcontext *ctx, GLuint e0, GLuint e1, GLuint e2 )
       if (IND & (SS_TWOSIDE_BIT | SS_UNFILLED_BIT))
       {
         facing = (cc < 0.0) ^ ctx->Polygon._FrontBit;
+         ctx->_Facing = facing; /* for 2-sided stencil test */
 
         if (IND & SS_UNFILLED_BIT)
            mode = facing ? ctx->Polygon.BackMode : ctx->Polygon.FrontMode;