Mesa (master): st/mesa: fix regressions in glDrawPixels(GL_STENCIL_INDEX)

Brian Paul brianp at kemper.freedesktop.org
Fri Oct 15 23:05:58 UTC 2010


Module: Mesa
Branch: master
Commit: 61a467e515c31eb6b97b039bc3f97dbe6eafa7cb
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=61a467e515c31eb6b97b039bc3f97dbe6eafa7cb

Author: Brian Paul <brianp at vmware.com>
Date:   Fri Oct 15 16:54:03 2010 -0600

st/mesa: fix regressions in glDrawPixels(GL_STENCIL_INDEX)

We need to keep track of three different fragment shaders: Z-only, stencil-
only, and Z+stencil.  Before, we were only keeping track of the first one
we encountered.

---

 src/mesa/state_tracker/st_cb_drawpixels.c |   28 ++++++++++++++++++++++------
 src/mesa/state_tracker/st_context.h       |    2 +-
 2 files changed, 23 insertions(+), 7 deletions(-)

diff --git a/src/mesa/state_tracker/st_cb_drawpixels.c b/src/mesa/state_tracker/st_cb_drawpixels.c
index 6deb019..e49aba6 100644
--- a/src/mesa/state_tracker/st_cb_drawpixels.c
+++ b/src/mesa/state_tracker/st_cb_drawpixels.c
@@ -172,10 +172,15 @@ make_fragment_shader_z(struct st_context *st, GLboolean write_depth, GLboolean w
 {
    struct gl_context *ctx = st->ctx;
    struct gl_program *p;
+   struct st_fragment_program *stp;
    GLuint ic = 0;
+   const GLuint shaderIndex = write_depth * 2 + write_stencil;
 
-   if (st->drawpix.z_shader) {
-      return st->drawpix.z_shader->driver_shader;
+   assert(shaderIndex < Elements(st->drawpix.shaders));
+
+   if (st->drawpix.shaders[shaderIndex]) {
+      /* already have the proper shader */
+      return st->drawpix.shaders[shaderIndex]->driver_shader;
    }
 
    /*
@@ -235,10 +240,15 @@ make_fragment_shader_z(struct st_context *st, GLboolean write_depth, GLboolean w
    p->SamplersUsed =  0x1;  /* sampler 0 (bit 0) is used */
    if (write_stencil)
       p->SamplersUsed |= 1 << 1;
-   st->drawpix.z_shader = (struct st_fragment_program *) p;
-   st_translate_fragment_program(st, st->drawpix.z_shader);
 
-   return st->drawpix.z_shader->driver_shader;
+   stp = st_fragment_program((struct gl_fragment_program *) p);
+
+   /* save the new shader */
+   st->drawpix.shaders[shaderIndex] = stp;
+
+   st_translate_fragment_program(st, stp);
+
+   return stp->driver_shader;
 }
 
 
@@ -1194,7 +1204,13 @@ void st_init_drawpixels_functions(struct dd_function_table *functions)
 void
 st_destroy_drawpix(struct st_context *st)
 {
-   st_reference_fragprog(st, &st->drawpix.z_shader, NULL);
+   GLuint i;
+
+   for (i = 0; i < Elements(st->drawpix.shaders); i++) {
+      if (st->drawpix.shaders[i])
+         st_reference_fragprog(st, &st->drawpix.shaders[i], NULL);
+   }
+
    st_reference_fragprog(st, &st->pixel_xfer.combined_prog, NULL);
    if (st->drawpix.vert_shaders[0])
       ureg_free_tokens(st->drawpix.vert_shaders[0]);
diff --git a/src/mesa/state_tracker/st_context.h b/src/mesa/state_tracker/st_context.h
index 89483ac..d342c0c 100644
--- a/src/mesa/state_tracker/st_context.h
+++ b/src/mesa/state_tracker/st_context.h
@@ -160,7 +160,7 @@ struct st_context
 
    /** for glDraw/CopyPixels */
    struct {
-      struct st_fragment_program *z_shader;
+      struct st_fragment_program *shaders[4];
       void *vert_shaders[2];   /**< ureg shaders */
    } drawpix;
 




More information about the mesa-commit mailing list