draw: fix clipping with linear interpolated values and gl_ClipVertex
authorRoland Scheidegger <sroland@vmware.com>
Fri, 11 Dec 2015 01:21:17 +0000 (02:21 +0100)
committerRoland Scheidegger <sroland@vmware.com>
Fri, 11 Dec 2015 01:21:39 +0000 (02:21 +0100)
Discovered this when working on other clip code, apparently didn't work
correctly - the combination of linear interpolated values and using
gl_ClipVertex produced wrong values (failing all such combinations
in piglits glsl-1.30 interpolation tests, named
interpolation-noperspective-XXX-vertex).
Use the pre-clip-pos values when determining the interpolation factor to
fix this.
Noone really understands this code well, but everybody agrees this looks
sane... This fixes all those failing tests (10 in total) both with
the llvm and non-llvm draw paths, with no piglit regressions.

Reviewed-by: Brian Paul <brianp@vmware.com>
Reviewed-by: Dave Airlie <airlied@redhat.com>
src/gallium/auxiliary/draw/draw_pipe_clip.c

index 35e54f4a8beff4255406ee3bed766ff3f2c1d297..47765cd0ef915c2f181ceb0739a61f1cadb3f081 100644 (file)
@@ -192,11 +192,11 @@ static void interp(const struct clip_stage *clip,
       t_nopersp = t;
       /* find either in.x != out.x or in.y != out.y */
       for (k = 0; k < 2; k++) {
-         if (in->clip[k] != out->clip[k]) {
+         if (in->pre_clip_pos[k] != out->pre_clip_pos[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];
+            float in_coord = in->pre_clip_pos[k] / in->pre_clip_pos[3];
+            float out_coord = out->pre_clip_pos[k] / out->pre_clip_pos[3];
+            float dst_coord = dst->pre_clip_pos[k] / dst->pre_clip_pos[3];
             t_nopersp = (dst_coord - out_coord) / (in_coord - out_coord);
             break;
          }