* A helper function that factorizes this common pattern.
*/
static LLVMValueRef
-load_mip(struct gallivm_state *gallivm, LLVMValueRef offsets, LLVMValueRef index1) {
+load_mip(struct gallivm_state *gallivm,
+ LLVMTypeRef ptr_type, LLVMValueRef offsets, LLVMValueRef index1) {
LLVMValueRef zero = lp_build_const_int32(gallivm, 0);
LLVMValueRef indexes[2] = {zero, index1};
- LLVMValueRef ptr = LLVMBuildGEP(gallivm->builder, offsets, indexes, ARRAY_SIZE(indexes), "");
+ LLVMValueRef ptr = LLVMBuildGEP2(gallivm->builder, ptr_type, offsets, indexes, ARRAY_SIZE(indexes), "");
return LLVMBuildLoad2(gallivm->builder, LLVMInt32TypeInContext(gallivm->context), ptr, "");
}
lp_build_get_mipmap_level(struct lp_build_sample_context *bld,
LLVMValueRef level)
{
- LLVMValueRef mip_offset = load_mip(bld->gallivm, bld->mip_offsets, level);
+ LLVMValueRef mip_offset = load_mip(bld->gallivm, bld->mip_offsets_type, bld->mip_offsets, level);
LLVMBuilderRef builder = bld->gallivm->builder;
- LLVMValueRef data_ptr = LLVMBuildGEP(builder, bld->base_ptr, &mip_offset, 1, "");
+ LLVMValueRef data_ptr = LLVMBuildGEP2(builder,
+ LLVMInt8TypeInContext(bld->gallivm->context),
+ bld->base_ptr, &mip_offset, 1, "");
return data_ptr;
}
LLVMValueRef offsets, offset1;
if (bld->num_mips == 1) {
- offset1 = load_mip(bld->gallivm, bld->mip_offsets, level);
+ offset1 = load_mip(bld->gallivm, bld->mip_offsets_type, bld->mip_offsets, level);
offsets = lp_build_broadcast_scalar(&bld->int_coord_bld, offset1);
}
else if (bld->num_mips == bld->coord_bld.type.length / 4) {
offsets = bld->int_coord_bld.undef;
for (i = 0; i < bld->num_mips; i++) {
LLVMValueRef indexi = lp_build_const_int32(bld->gallivm, i);
- offset1 = load_mip(bld->gallivm, bld->mip_offsets, LLVMBuildExtractElement(builder, level, indexi, ""));
+ offset1 = load_mip(bld->gallivm, bld->mip_offsets_type, bld->mip_offsets, LLVMBuildExtractElement(builder, level, indexi, ""));
LLVMValueRef indexo = lp_build_const_int32(bld->gallivm, 4 * i);
offsets = LLVMBuildInsertElement(builder, offsets, offset1, indexo, "");
}
offsets = bld->int_coord_bld.undef;
for (i = 0; i < bld->num_mips; i++) {
LLVMValueRef indexi = lp_build_const_int32(bld->gallivm, i);
- offset1 = load_mip(bld->gallivm, bld->mip_offsets, LLVMBuildExtractElement(builder, level, indexi, ""));
+ offset1 = load_mip(bld->gallivm, bld->mip_offsets_type, bld->mip_offsets, LLVMBuildExtractElement(builder, level, indexi, ""));
offsets = LLVMBuildInsertElement(builder, offsets, offset1, indexi, "");
}
}
*/
static LLVMValueRef
lp_build_get_level_stride_vec(struct lp_build_sample_context *bld,
+ LLVMTypeRef stride_type,
LLVMValueRef stride_array, LLVMValueRef level)
{
LLVMBuilderRef builder = bld->gallivm->builder;
LLVMValueRef stride, stride1;
if (bld->num_mips == 1) {
- stride1 = load_mip(bld->gallivm, stride_array, level);
+ stride1 = load_mip(bld->gallivm, stride_type, stride_array, level);
stride = lp_build_broadcast_scalar(&bld->int_coord_bld, stride1);
}
else if (bld->num_mips == bld->coord_bld.type.length / 4) {
stride = bld->int_coord_bld.undef;
for (i = 0; i < bld->num_mips; i++) {
LLVMValueRef indexi = lp_build_const_int32(bld->gallivm, i);
- stride1 = load_mip(bld->gallivm, stride_array, LLVMBuildExtractElement(builder, level, indexi, ""));
+ stride1 = load_mip(bld->gallivm, stride_type, stride_array, LLVMBuildExtractElement(builder, level, indexi, ""));
LLVMValueRef indexo = lp_build_const_int32(bld->gallivm, 4 * i);
stride = LLVMBuildInsertElement(builder, stride, stride1, indexo, "");
}
stride = bld->int_coord_bld.undef;
for (i = 0; i < bld->coord_bld.type.length; i++) {
LLVMValueRef indexi = lp_build_const_int32(bld->gallivm, i);
- stride1 = load_mip(bld->gallivm, stride_array, LLVMBuildExtractElement(builder, level, indexi, ""));
+ stride1 = load_mip(bld->gallivm, stride_type, stride_array, LLVMBuildExtractElement(builder, level, indexi, ""));
stride = LLVMBuildInsertElement(builder, stride, stride1, indexi, "");
}
}
if (dims >= 2) {
*row_stride_vec = lp_build_get_level_stride_vec(bld,
+ bld->row_stride_type,
bld->row_stride_array,
ilevel);
}
if (dims == 3 || has_layer_coord(bld->static_texture_state->target)) {
*img_stride_vec = lp_build_get_level_stride_vec(bld,
+ bld->img_stride_type,
bld->img_stride_array,
ilevel);
}