draw: fix non-perspective interpolation in interp()
authorBrian Paul <brianp@vmware.com>
Sat, 16 Feb 2013 18:54:22 +0000 (11:54 -0700)
committerBrian Paul <brianp@vmware.com>
Tue, 19 Feb 2013 14:19:18 +0000 (07:19 -0700)
This fixes a regression from ab74fee5e1a3fc3323b7238278637b232c2d0d95.
When we use the clip coordinate to compute the screen-space interpolation
factor, we need to first apply the divide-by-W step to the clip
coordinate.

Fixes http://bugs.freedesktop.org/show_bug.cgi?id=60938

Note: This is a candidate for the 9.1 branch.

src/gallium/auxiliary/draw/draw_pipe_clip.c

index 7b879c4cd50239c0e7ca6cb37a6ec4860731b168..3110809ce0efcb625a6f61e8c07f58550aecd682 100644 (file)
@@ -167,12 +167,17 @@ static void interp( const struct clip_stage *clip,
    {
       int k;
       t_nopersp = t;
-      for (k = 0; k < 2; k++)
+      /* find either in.x != out.x or in.y != out.y */
+      for (k = 0; k < 2; k++) {
          if (in->clip[k] != out->clip[k]) {
-            t_nopersp = (dst->clip[k] - out->clip[k]) /
-               (in->clip[k] - out->clip[k]);
+            /* do divide by W, then compute linear interpolation factor */
+            float in_coord = in->clip[k] / in->clip[3];
+            float out_coord = out->clip[k] / out->clip[3];
+            float dst_coord = dst->clip[k] / dst->clip[3];
+            t_nopersp = (dst_coord - out_coord) / (in_coord - out_coord);
             break;
          }
+      }
    }
 
    /* Other attributes