gallium: fix glBitmap color bug
authorBrian Paul <brian.paul@tungstengraphics.com>
Wed, 26 Nov 2008 14:06:26 +0000 (07:06 -0700)
committerBrian Paul <brian.paul@tungstengraphics.com>
Wed, 26 Nov 2008 14:08:19 +0000 (07:08 -0700)
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

index 694104f9cfb10734406b030c8d8a1a1cd07ae02c..73645201cc6bae327ad01ff14d656c7a27482962 100644 (file)
@@ -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 */
    {