[Mesa-dev] [PATCH 2/2] gallivm: fix an issue with NaNs with seamless cube filtering

Brian Paul brian.e.paul at gmail.com
Wed Dec 13 03:40:55 UTC 2017


On Tue, Dec 12, 2017 at 7:34 PM, <sroland at vmware.com> wrote:

> From: Roland Scheidegger <sroland at vmware.com>
>
> Cube texture wrapping is a bit special since the values (post face
> projection) always are within [0,1], so we took advantage of that and
> omitted some clamps.
> However, we can still get NaNs (either because the coords already had NaNs,
> or the face projection generated them), and in fact we didn't handle them
> quite safely. I've seen -INT_MAX + 1 been propagated through as the final
> int
> coord value, albeit I didn't observe a crash. (Not quite a coincidence,
> since
> any stride mul with -INT_MAX or -INT_MAX+1 will turn up as a small positive
> number - nevertheless, I'd rather not try my luck, I'm not entirely sure it
> can't really turn up negative neither due to seamless coord swapping, plus
> ifloor of a NaN is not guaranteed to return -INT_MAX by any standard. And
> we kill off NaNs similarly with ordinary texture wrapping too.)
> So kill off the NaNs by using the common max against zero method.
> ---
>  src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c | 11 +++++++++++
>  1 file changed, 11 insertions(+)
>
> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c
> b/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c
> index 571a968..ff8cbf6 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c
> @@ -1123,6 +1123,17 @@ lp_build_sample_image_linear(struct
> lp_build_sample_context *bld,
>         */
>        /* should always have normalized coords, and offsets are undefined
> */
>        assert(bld->static_sampler_state->normalized_coords);
> +      /*
> +       * The coords should all be between [0,1] however we can have NaNs,
> +       * which will wreak havoc. In particular the y1_clamped value below
> +       * can be -INT_MAX (on x86) and be propagated right through
> (probably
> +       * other values might be bogus in the end too).
> +       * So kill off the NaNs here.
> +       */
> +      coords[0] = lp_build_max_ext(coord_bld, coords[0], coord_bld->zero,
> +                                   GALLIVM_NAN_RETURN_OTHER_SECO
> ND_NONNAN);
> +      coords[1] = lp_build_max_ext(coord_bld, coords[1], coord_bld->zero,
> +                                   GALLIVM_NAN_RETURN_OTHER_SECO
> ND_NONNAN);
>        coord = lp_build_mul(coord_bld, coords[0], flt_width_vec);
>        /* instead of clamp, build mask if overflowed */
>        coord = lp_build_sub(coord_bld, coord, half);
> --
>

Would it make sense to have a gallivm helper function for doing this?  Or
two, for min/max?

In any case, for both patches,
Reviewed-by: Brian Paul <brianp at vmware.com>


2.7.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20171212/55c83f54/attachment.html>


More information about the mesa-dev mailing list