[Mesa-dev] [PATCH] gallivm: drop border wrap clamping code
Brian Paul
brianp at vmware.com
Fri Nov 30 16:44:53 PST 2012
On 11/30/2012 12:49 PM, sroland at vmware.com wrote:
> From: Roland Scheidegger<sroland at vmware.com>
>
> The border clamping code is unnecessary, since we don't care if a wrapped
> coord value is -1 or<-1 (same for length vs.>length), in either case the
> border handling code will mask out the offset and replace the texel value with
> the border color.
> Note that technically this is not entirely correct. Omitting clamping on the
> float coords means that flt->int conversion may result in undefined values for
> values of very large magnitude.
> However there's no reason we should honor this here since:
> a) we don't care for that for ordinary wrap modes in the aos code when
> converting coords and the problem is worse there (as we've got only
> effectively 24 instead of 32bits)
> b) at least in some cases the clamping was done already in int space hence
> doing nothing to fix that problem.
> c) with sse2 flt->int conversion with such values results in 0x80000000 which
> is just perfect (for clamp to border - not so much for the ordinary clamp to
> edge).
> ---
> src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c | 49 +++++++--------------
> 1 file changed, 16 insertions(+), 33 deletions(-)
>
> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c b/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c
> index 659de9b..ba265b2 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c
> @@ -351,20 +351,16 @@ lp_build_sample_wrap_linear(struct lp_build_sample_context *bld,
> }
>
> case PIPE_TEX_WRAP_CLAMP_TO_BORDER:
> - {
> - LLVMValueRef min;
> - if (bld->static_state->normalized_coords) {
> - /* scale coord to length */
> - coord = lp_build_mul(coord_bld, coord, length_f);
> - }
> - /* was: clamp to [-0.5, length + 0.5], then sub 0.5 */
> - coord = lp_build_sub(coord_bld, coord, half);
> - min = lp_build_const_vec(bld->gallivm, coord_bld->type, -1.0F);
> - coord = lp_build_clamp(coord_bld, coord, min, length_f);
> - /* convert to int, compute lerp weight */
> - lp_build_ifloor_fract(coord_bld, coord,&coord0,&weight);
> - coord1 = lp_build_add(int_coord_bld, coord0, int_coord_bld->one);
> + if (bld->static_state->normalized_coords) {
> + /* scale coord to length */
> + coord = lp_build_mul(coord_bld, coord, length_f);
> }
> + /* was: clamp to [-0.5, length + 0.5], then sub 0.5 */
> + /* can skip clamp (though might not work for very large coord values */
> + coord = lp_build_sub(coord_bld, coord, half);
> + /* convert to int, compute lerp weight */
> + lp_build_ifloor_fract(coord_bld, coord,&coord0,&weight);
> + coord1 = lp_build_add(int_coord_bld, coord0, int_coord_bld->one);
> break;
>
> case PIPE_TEX_WRAP_MIRROR_REPEAT:
> @@ -438,9 +434,9 @@ lp_build_sample_wrap_linear(struct lp_build_sample_context *bld,
> }
>
> /* was: clamp to [-0.5, length + 0.5] then sub 0.5 */
> - /* skip -0.5 clamp (always positive), do sub first */
> + /* skip clamp - always positive, and other side
> + only potentially matters for very large coords */
> coord = lp_build_sub(coord_bld, coord, half);
> - coord = lp_build_min(coord_bld, coord, length_f);
>
> /* convert to int, compute lerp weight */
> lp_build_ifloor_fract(coord_bld, coord,&coord0,&weight);
> @@ -514,22 +510,12 @@ lp_build_sample_wrap_nearest(struct lp_build_sample_context *bld,
> break;
>
> case PIPE_TEX_WRAP_CLAMP_TO_BORDER:
> - /* Note: this is the same as CLAMP_TO_EDGE, except min = -1 */
> - {
> - LLVMValueRef min, max;
> -
> - if (bld->static_state->normalized_coords) {
> - /* scale coord to length */
> - coord = lp_build_mul(coord_bld, coord, length_f);
> - }
> -
> - icoord = lp_build_ifloor(coord_bld, coord);
> -
> - /* clamp to [-1, length] */
> - min = lp_build_negate(int_coord_bld, int_coord_bld->one);
> - max = length;
> - icoord = lp_build_clamp(int_coord_bld, icoord, min, max);
> + if (bld->static_state->normalized_coords) {
> + /* scale coord to length */
> + coord = lp_build_mul(coord_bld, coord, length_f);
> }
> + /* no clamp necessary, border masking will handle this */
> + icoord = lp_build_ifloor(coord_bld, coord);
> break;
>
> case PIPE_TEX_WRAP_MIRROR_REPEAT:
> @@ -573,9 +559,6 @@ lp_build_sample_wrap_nearest(struct lp_build_sample_context *bld,
>
> /* itrunc == ifloor here */
> icoord = lp_build_itrunc(coord_bld, coord);
> -
> - /* clamp to [0, length] */
> - icoord = lp_build_min(int_coord_bld, icoord, length);
> break;
>
> default:
Nice!
Reviewed-by: Brian Paul <brianp at vmware.com>
More information about the mesa-dev
mailing list