i965: Fix the W value of deprecated pointcoords on pre-gen6.
authorEric Anholt <eric@anholt.net>
Wed, 20 Feb 2013 22:00:47 +0000 (14:00 -0800)
committerEric Anholt <eric@anholt.net>
Mon, 25 Feb 2013 19:21:44 +0000 (11:21 -0800)
When you didn't have a texcoord array bound (or a non-1 current w
attrib), we were telling the fragment shader that it could just use "1"
instead of doing expensive pre-gen6 math to invert it.  If you drew the
point with a non-1 W value, then you'd get the right size (since all the
vertex computations worked), but we'd mis-interpolate the coordinate
across the face.

Fixes the mesa pointsprite demo on GM45.
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=30232
Reviewed-and-tested-by: Ian Romanick <ian.d.romanick@intel.com>
Note: This is a candidate for the stable branches.

src/mesa/drivers/dri/i965/brw_vs_constval.c

index 3d53843eddeccd6603f87a1a7ee32bb54fdea644..48635c54b5d45d49f92a003fc6b65a00745ff580 100644 (file)
@@ -238,6 +238,23 @@ static void calc_wm_input_sizes( struct brw_context *brw )
 
    calc_sizes(&t);
 
+   /* _NEW_POINT
+    *
+    * If the SF will be replacing the vertex output with a reference to
+    * gl_PointCoord, then tell the fragment shader that the value actually
+    * does vary.
+    */
+   if (ctx->Point.PointSprite) {
+      for (int i = 0; i < 8; i++) {
+         if (ctx->Point.CoordReplace[i]) {
+            t.size_masks[4-1] |= FRAG_BIT_TEX(i);
+            t.size_masks[3-1] |= FRAG_BIT_TEX(i);
+            t.size_masks[2-1] |= FRAG_BIT_TEX(i);
+            t.size_masks[1-1] |= FRAG_BIT_TEX(i);
+         }
+      }
+   }
+
    if (memcmp(brw->wm.input_size_masks, t.size_masks, sizeof(t.size_masks)) != 0) {
       memcpy(brw->wm.input_size_masks, t.size_masks, sizeof(t.size_masks));
       brw->state.dirty.brw |= BRW_NEW_WM_INPUT_DIMENSIONS;
@@ -246,7 +263,7 @@ static void calc_wm_input_sizes( struct brw_context *brw )
 
 const struct brw_tracked_state brw_wm_input_sizes = {
    .dirty = {
-      .mesa  = _NEW_LIGHT | _NEW_PROGRAM,
+      .mesa  = _NEW_LIGHT | _NEW_PROGRAM | _NEW_POINT,
       .brw   = BRW_NEW_VERTEX_PROGRAM | BRW_NEW_INPUT_DIMENSIONS,
       .cache = 0
    },