diff options
author | Brian Paul <[email protected]> | 2013-02-16 11:54:22 -0700 |
---|---|---|
committer | Brian Paul <[email protected]> | 2013-02-19 07:19:18 -0700 |
commit | 5da967aff5adb3e27954488206fb885ea1ede0fd (patch) | |
tree | 4ca040cb783b76e69f07af22f950f5f8564cc98d /src | |
parent | 07cdfdb708ac28aa487a738db30b128cb0df1dc3 (diff) |
draw: fix non-perspective interpolation in interp()
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.
Diffstat (limited to 'src')
-rw-r--r-- | src/gallium/auxiliary/draw/draw_pipe_clip.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/src/gallium/auxiliary/draw/draw_pipe_clip.c b/src/gallium/auxiliary/draw/draw_pipe_clip.c index 7b879c4cd50..3110809ce0e 100644 --- a/src/gallium/auxiliary/draw/draw_pipe_clip.c +++ b/src/gallium/auxiliary/draw/draw_pipe_clip.c @@ -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 |