Mesa (gallium-0.1): gallium: fix glBitmap color bug

Brian Paul brianp at kemper.freedesktop.org
Wed Nov 26 14:39:57 UTC 2008


Module: Mesa
Branch: gallium-0.1
Commit: 277089b81ae498f598efdc74fafda9873864ee54
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=277089b81ae498f598efdc74fafda9873864ee54

Author: Brian Paul <brian.paul at tungstengraphics.com>
Date:   Wed Nov 26 07:06:26 2008 -0700

gallium: fix glBitmap color bug

By time we get around to rendering the cached bitmap, the current color may
have changed.  Need to make sure we load the constant slot with the cached
color.

---

 src/mesa/state_tracker/st_cb_bitmap.c |   24 ++++++++++++++++++------
 1 files changed, 18 insertions(+), 6 deletions(-)

diff --git a/src/mesa/state_tracker/st_cb_bitmap.c b/src/mesa/state_tracker/st_cb_bitmap.c
index 694104f..7364520 100644
--- a/src/mesa/state_tracker/st_cb_bitmap.c
+++ b/src/mesa/state_tracker/st_cb_bitmap.c
@@ -219,11 +219,6 @@ combined_bitmap_fragment_program(GLcontext *ctx)
       st_translate_fragment_program(st, stfp->bitmap_program, NULL);
    }
 
-   /* Ideally we'd have updated the pipe constants during the normal
-    * st/atom mechanism.  But we can't since this is specific to glBitmap.
-    */
-   st_upload_constants(st, stfp->Base.Base.Parameters, PIPE_SHADER_FRAGMENT);
-
    return stfp->bitmap_program;
 }
 
@@ -442,6 +437,22 @@ draw_bitmap_quad(GLcontext *ctx, GLint x, GLint y, GLfloat z,
 
    stfp = combined_bitmap_fragment_program(ctx);
 
+   /* As an optimization, Mesa's fragment programs will sometimes get the
+    * primary color from a statevar/constant rather than a varying variable.
+    * when that's the case, we need to ensure that we use the 'color'
+    * parameter and not the current attribute color (which may have changed
+    * through glRasterPos and state validation.
+    * So, we force the proper color here.  Not elegant, but it works.
+    */
+   {
+      GLfloat colorSave[4];
+      COPY_4V(colorSave, ctx->Current.Attrib[VERT_ATTRIB_COLOR0]);
+      COPY_4V(ctx->Current.Attrib[VERT_ATTRIB_COLOR0], color);
+      st_upload_constants(st, stfp->Base.Base.Parameters, PIPE_SHADER_FRAGMENT);
+      COPY_4V(ctx->Current.Attrib[VERT_ATTRIB_COLOR0], colorSave);
+   }
+
+
    /* limit checks */
    /* XXX if the bitmap is larger than the max texture size, break
     * it up into chunks.
@@ -476,7 +487,8 @@ draw_bitmap_quad(GLcontext *ctx, GLint x, GLint y, GLfloat z,
          samplers[i] = &st->state.samplers[i];
       }
       samplers[stfp->bitmap_sampler] = &st->bitmap.sampler;
-      cso_set_samplers(cso, num, (const struct pipe_sampler_state **) samplers);   }
+      cso_set_samplers(cso, num, (const struct pipe_sampler_state **) samplers);
+   }
 
    /* user textures, plus the bitmap texture */
    {




More information about the mesa-commit mailing list