mesa: need to set all stencil bits to 0 before setting the 1 bits
authorBrian Paul <brianp@vmware.com>
Thu, 10 Sep 2009 16:17:07 +0000 (10:17 -0600)
committerBrian Paul <brianp@vmware.com>
Thu, 10 Sep 2009 18:45:27 +0000 (12:45 -0600)
Plus, check for pixel transfer stencil index/offset.

src/mesa/drivers/common/meta.c

index 28e49b6..47090ba 100644 (file)
@@ -1456,6 +1456,8 @@ _mesa_meta_draw_pixels(GLcontext *ctx,
    }
    else if (_mesa_is_stencil_format(format)) {
       if (ctx->Extensions.ARB_fragment_program &&
+          ctx->Pixel.IndexShift == 0 &&
+          ctx->Pixel.IndexOffset == 0 &&
           type == GL_UNSIGNED_BYTE) {
          /* We'll store stencil as alpha.  This only works for GLubyte
           * image data because of how incoming values are mapped to alpha
@@ -1590,6 +1592,13 @@ _mesa_meta_draw_pixels(GLcontext *ctx,
       _mesa_ColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
 
       _mesa_set_enable(ctx, GL_STENCIL_TEST, GL_TRUE);
+
+      /* set all stencil bits to 0 */
+      _mesa_StencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
+      _mesa_StencilFunc(GL_ALWAYS, 0, 255);
+      _mesa_DrawArrays(GL_TRIANGLE_FAN, 0, 4);
+  
+      /* set stencil bits to 1 where needed */
       _mesa_StencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
 
       _mesa_BindProgram(GL_FRAGMENT_PROGRAM_ARB, drawpix->StencilFP);