[Mesa-dev] [PATCH 2/2] gallivm: fix an issue with NaNs with seamless cube filtering
Jose Fonseca
jfonseca at vmware.com
Wed Dec 13 18:38:34 UTC 2017
On 13/12/17 02:34, 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_SECOND_NONNAN);
> + coords[1] = lp_build_max_ext(coord_bld, coords[1], coord_bld->zero,
> + GALLIVM_NAN_RETURN_OTHER_SECOND_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);
>
Series LGTM.
Reviewed-by: Jose Fonseca <jfonseca at vmware.com>
More information about the mesa-dev
mailing list