diff options
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: | 
