[Mesa-dev] [PATCH] draw: fix clipping with linear interpolated values and gl_ClipVertex

Dave Airlie airlied at gmail.com
Thu Dec 10 00:09:44 PST 2015


On 10 December 2015 at 14:31,  <sroland at vmware.com> wrote:
> From: Roland Scheidegger <sroland at vmware.com>
>
> 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).
> Use the pre-clip-pos values when determining the interpolation factor to
> fix this.
> Unfortunately I have no idea what I'm doing here really, but it fixes all
> these failures in piglit (all interpolation-noperspective-XXX-vertex, 10
> tests in total). Albeit piglit coverage of clipping isn't great, so hopefully
> someone can confirm this actually makes sense, and wouldn't cause failures
> elsewhere...

This makes sense to me, in that interpolating should definitely happen
on pre-clipped coordinates.

Though like you my knowledge of this code is debug only.

So,
Reviewed-by: Dave Airlie <airlied at redhat.com>
> ---
>  src/gallium/auxiliary/draw/draw_pipe_clip.c | 8 ++++----
>  1 file changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/src/gallium/auxiliary/draw/draw_pipe_clip.c b/src/gallium/auxiliary/draw/draw_pipe_clip.c
> index f2b56b0..7f22eef 100644
> --- a/src/gallium/auxiliary/draw/draw_pipe_clip.c
> +++ b/src/gallium/auxiliary/draw/draw_pipe_clip.c
> @@ -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;
>           }
> --
> 2.1.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list