diff options
| author | Brian Paul <brianp@vmware.com> | 2010-09-25 13:09:25 -0600 | 
|---|---|---|
| committer | Brian Paul <brianp@vmware.com> | 2010-09-25 13:37:05 -0600 | 
| commit | 4e2f53bacb670b824593dce70668a8f92796ed93 (patch) | |
| tree | 951fa5b7e32fbcd81c7d725b90a84662517d6da2 /src | |
| parent | e31f0f996537046228602a251706613ca4163209 (diff) | |
gallivm: fix repeat() function for NPOT textures
The trick of casting the coord to an unsigned value only works for POT
textures.  Add a bias instead.  This fixes a few piglit texwrap failures.
Diffstat (limited to 'src')
| -rw-r--r-- | src/gallium/auxiliary/gallivm/lp_bld_sample_aos.c | 13 | ||||
| -rw-r--r-- | src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c | 14 | 
2 files changed, 17 insertions, 10 deletions
| diff --git a/src/gallium/auxiliary/gallivm/lp_bld_sample_aos.c b/src/gallium/auxiliary/gallivm/lp_bld_sample_aos.c index 9a1c693d5e..49a6eed615 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_sample_aos.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_sample_aos.c @@ -90,10 +90,12 @@ lp_build_sample_wrap_nearest_int(struct lp_build_sample_context *bld,     case PIPE_TEX_WRAP_REPEAT:        if(is_pot)           coord = LLVMBuildAnd(bld->builder, coord, length_minus_one, ""); -      else -         /* Signed remainder won't give the right results for negative -          * dividends but unsigned remainder does.*/ +      else { +         /* Add a bias to the texcoord to handle negative coords */ +         LLVMValueRef bias = lp_build_mul_imm(uint_coord_bld, length, 1024); +         coord = LLVMBuildAdd(bld->builder, coord, bias, "");           coord = LLVMBuildURem(bld->builder, coord, length, ""); +      }        break;     case PIPE_TEX_WRAP_CLAMP_TO_EDGE: @@ -197,8 +199,9 @@ lp_build_sample_wrap_linear_int(struct lp_build_sample_context *bld,           coord0 = LLVMBuildAnd(bld->builder, coord0, length_minus_one, "");        }        else { -         /* Signed remainder won't give the right results for negative -          * dividends but unsigned remainder does.*/ +         /* Add a bias to the texcoord to handle negative coords */ +         LLVMValueRef bias = lp_build_mul_imm(uint_coord_bld, length, 1024); +         coord0 = LLVMBuildAdd(bld->builder, coord0, bias, "");           coord0 = LLVMBuildURem(bld->builder, coord0, length, "");        } diff --git a/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c b/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c index e3e8548d93..f53ad91594 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c @@ -280,8 +280,10 @@ lp_build_sample_wrap_linear(struct lp_build_sample_context *bld,           coord1 = LLVMBuildAnd(bld->builder, coord1, length_minus_one, "");        }        else { -         /* Signed remainder won't give the right results for negative -          * dividends but unsigned remainder does.*/ +         /* Add a bias to the texcoord to handle negative coords */ +         LLVMValueRef bias = lp_build_mul_imm(uint_coord_bld, length, 1024); +         coord0 = LLVMBuildAdd(bld->builder, coord0, bias, ""); +         coord1 = LLVMBuildAdd(bld->builder, coord1, bias, "");           coord0 = LLVMBuildURem(bld->builder, coord0, length, "");           coord1 = LLVMBuildURem(bld->builder, coord1, length, "");        } @@ -476,10 +478,12 @@ lp_build_sample_wrap_nearest(struct lp_build_sample_context *bld,        icoord = lp_build_ifloor(coord_bld, coord);        if (is_pot)           icoord = LLVMBuildAnd(bld->builder, icoord, length_minus_one, ""); -      else -         /* Signed remainder won't give the right results for negative -          * dividends but unsigned remainder does.*/ +      else { +         /* Add a bias to the texcoord to handle negative coords */ +         LLVMValueRef bias = lp_build_mul_imm(uint_coord_bld, length, 1024); +         icoord = LLVMBuildAdd(bld->builder, icoord, bias, "");           icoord = LLVMBuildURem(bld->builder, icoord, length, ""); +      }        break;     case PIPE_TEX_WRAP_CLAMP: | 
