diff options
| author | José Fonseca <jfonseca@vmware.com> | 2010-06-02 11:25:27 +0100 | 
|---|---|---|
| committer | José Fonseca <jfonseca@vmware.com> | 2010-06-02 13:24:25 +0100 | 
| commit | 6463dcbc013f1d1db5d2a6fa4cb5b72481298b2b (patch) | |
| tree | f0a3b52e44341476d81e0c4faae12f28113aadad | |
| parent | e3d3f304403cc598bf4e779dfe2adede189bc27a (diff) | |
gallivm: Avoid fp arithmetic in lp_build_sample_wrap_nearest().
| -rw-r--r-- | src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c | 110 | 
1 files changed, 32 insertions, 78 deletions
| diff --git a/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c b/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c index df8453c473..c39dbc6414 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c @@ -710,7 +710,6 @@ lp_build_sample_wrap_nearest(struct lp_build_sample_context *bld,     struct lp_build_context *uint_coord_bld = &bld->uint_coord_bld;     LLVMValueRef length_f = lp_build_int_to_float(coord_bld, length);     LLVMValueRef length_minus_one = lp_build_sub(uint_coord_bld, length, uint_coord_bld->one); -   LLVMValueRef length_f_minus_one = lp_build_sub(coord_bld, length_f, coord_bld->one);     LLVMValueRef icoord;     switch(wrap_mode) { @@ -726,35 +725,20 @@ lp_build_sample_wrap_nearest(struct lp_build_sample_context *bld,        break;     case PIPE_TEX_WRAP_CLAMP: -      /* mul by size */ +   case PIPE_TEX_WRAP_CLAMP_TO_EDGE:        if (bld->static_state->normalized_coords) { +         /* scale coord to length */           coord = lp_build_mul(coord_bld, coord, length_f);        } +        /* floor */        icoord = lp_build_ifloor(coord_bld, coord); -      /* clamp to [0, size-1].  Note: int coord builder type */ + +      /* clamp to [0, length - 1]. */        icoord = lp_build_clamp(int_coord_bld, icoord, int_coord_bld->zero,                                length_minus_one);        break; -   case PIPE_TEX_WRAP_CLAMP_TO_EDGE: -      { -         LLVMValueRef min, max; - -         if (bld->static_state->normalized_coords) { -            /* scale coord to length */ -            coord = lp_build_mul(coord_bld, coord, length_f); -         } - -         /* clamp to [0.5, length - 0.5] */ -         min = lp_build_const_vec(coord_bld->type, 0.5F); -         max = lp_build_sub(coord_bld, length_f, min); -         coord = lp_build_clamp(coord_bld, coord, min, max); - -         icoord = lp_build_ifloor(coord_bld, coord); -      } -      break; -     case PIPE_TEX_WRAP_CLAMP_TO_BORDER:        /* Note: this is the same as CLAMP_TO_EDGE, except min = -min */        { @@ -765,86 +749,56 @@ lp_build_sample_wrap_nearest(struct lp_build_sample_context *bld,              coord = lp_build_mul(coord_bld, coord, length_f);           } -         /* clamp to [-0.5, length + 0.5] */ -         min = lp_build_const_vec(coord_bld->type, -0.5F); -         max = lp_build_sub(coord_bld, length_f, min); -         coord = lp_build_clamp(coord_bld, coord, min, max); -           icoord = lp_build_ifloor(coord_bld, coord); -      } -      break; - -   case PIPE_TEX_WRAP_MIRROR_REPEAT: -      { -         LLVMValueRef min, max; - -         /* compute mirror function */ -         coord = lp_build_coord_mirror(bld, coord); -         /* scale coord to length */ -         assert(bld->static_state->normalized_coords); -         coord = lp_build_mul(coord_bld, coord, length_f); - -         /* clamp to [0.5, length - 0.5] */ -         min = lp_build_const_vec(coord_bld->type, 0.5F); -         max = lp_build_sub(coord_bld, length_f, min); -         coord = lp_build_clamp(coord_bld, coord, min, max); - -         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);        }        break; -   case PIPE_TEX_WRAP_MIRROR_CLAMP: -      coord = lp_build_abs(coord_bld, coord); +   case PIPE_TEX_WRAP_MIRROR_REPEAT: +      /* compute mirror function */ +      coord = lp_build_coord_mirror(bld, coord);        /* scale coord to length */        assert(bld->static_state->normalized_coords);        coord = lp_build_mul(coord_bld, coord, length_f); -      /* clamp to [0, length - 1] */ -      coord = lp_build_min(coord_bld, coord, length_f_minus_one); -        icoord = lp_build_ifloor(coord_bld, coord); + +      /* clamp to [0, length - 1] */ +      icoord = lp_build_min(int_coord_bld, icoord, length_minus_one);        break; +   case PIPE_TEX_WRAP_MIRROR_CLAMP:     case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_EDGE: -      { -         LLVMValueRef min, max; - -         coord = lp_build_abs(coord_bld, coord); +      coord = lp_build_abs(coord_bld, coord); -         if (bld->static_state->normalized_coords) { -            /* scale coord to length */ -            coord = lp_build_mul(coord_bld, coord, length_f); -         } +      if (bld->static_state->normalized_coords) { +         /* scale coord to length */ +         coord = lp_build_mul(coord_bld, coord, length_f); +      } -         /* clamp to [0.5, length - 0.5] */ -         min = lp_build_const_vec(coord_bld->type, 0.5F); -         max = lp_build_sub(coord_bld, length_f, min); -         coord = lp_build_clamp(coord_bld, coord, min, max); +      icoord = lp_build_ifloor(coord_bld, coord); -         icoord = lp_build_ifloor(coord_bld, coord); -      } +      /* clamp to [0, length - 1] */ +      icoord = lp_build_min(int_coord_bld, icoord, length_minus_one);        break;     case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_BORDER: -      { -         LLVMValueRef max; - -         coord = lp_build_abs(coord_bld, coord); +      coord = lp_build_abs(coord_bld, coord); -         if (bld->static_state->normalized_coords) { -            /* scale coord to length */ -            coord = lp_build_mul(coord_bld, coord, length_f); -         } +      if (bld->static_state->normalized_coords) { +         /* scale coord to length */ +         coord = lp_build_mul(coord_bld, coord, length_f); +      } -         /* clamp to [-0.5, length + 0.5] */ -         max = lp_build_const_vec(coord_bld->type, 0.5F); -         max = lp_build_add(coord_bld, length_f, max); -         coord = lp_build_min(coord_bld, coord, max); +      icoord = lp_build_ifloor(coord_bld, coord); -         icoord = lp_build_ifloor(coord_bld, coord); -      } +      /* clamp to [0, length] */ +      icoord = lp_build_min(int_coord_bld, icoord, length);        break;     default: | 
