diff options
author | Roland Scheidegger <sroland@vmware.com> | 2010-10-08 21:08:49 +0200 |
---|---|---|
committer | Roland Scheidegger <sroland@vmware.com> | 2010-10-09 00:36:38 +0200 |
commit | 2cc6da85d6e60e80d0b5b86fe42f8f82073b5d51 (patch) | |
tree | 4148eacacfbb1f33250c202fee70974310677d61 | |
parent | 318bb080b04c961141a962d440d0e1296f8adda6 (diff) | |
download | external_mesa3d-2cc6da85d6e60e80d0b5b86fe42f8f82073b5d51.zip external_mesa3d-2cc6da85d6e60e80d0b5b86fe42f8f82073b5d51.tar.gz external_mesa3d-2cc6da85d6e60e80d0b5b86fe42f8f82073b5d51.tar.bz2 |
gallivm: avoid unnecessary URem in linear wrap repeat case
Haven't looked at what code this exactly generates but URem can't be fast.
Instead of using two URem only use one and replace the second one with
select/add (this is what the corresponding aos code already does).
-rw-r--r-- | src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c b/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c index 242e8d3..b020782 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c @@ -251,19 +251,23 @@ lp_build_sample_wrap_linear(struct lp_build_sample_context *bld, 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(uint_coord_bld, coord0, uint_coord_bld->one); /* repeat wrap */ if (is_pot) { + coord1 = lp_build_add(uint_coord_bld, coord0, uint_coord_bld->one); coord0 = LLVMBuildAnd(bld->builder, coord0, length_minus_one, ""); coord1 = LLVMBuildAnd(bld->builder, coord1, length_minus_one, ""); } else { /* Add a bias to the texcoord to handle negative coords */ LLVMValueRef bias = lp_build_mul_imm(uint_coord_bld, length, 1024); + LLVMValueRef mask; coord0 = LLVMBuildAdd(bld->builder, coord0, bias, ""); - coord1 = LLVMBuildAdd(bld->builder, coord1, bias, ""); coord0 = LLVMBuildURem(bld->builder, coord0, length, ""); - coord1 = LLVMBuildURem(bld->builder, coord1, length, ""); + mask = lp_build_compare(bld->builder, int_coord_bld->type, + PIPE_FUNC_NOTEQUAL, coord0, length_minus_one); + coord1 = LLVMBuildAnd(bld->builder, + lp_build_add(uint_coord_bld, coord0, uint_coord_bld->one), + mask, ""); } break; |