diff options
Diffstat (limited to 'src/gallium/auxiliary/draw/draw_llvm.c')
-rw-r--r-- | src/gallium/auxiliary/draw/draw_llvm.c | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/src/gallium/auxiliary/draw/draw_llvm.c b/src/gallium/auxiliary/draw/draw_llvm.c index 97b463f4ff8..f9bcadc6cfa 100644 --- a/src/gallium/auxiliary/draw/draw_llvm.c +++ b/src/gallium/auxiliary/draw/draw_llvm.c @@ -674,6 +674,7 @@ generate_vs(struct draw_llvm_variant *variant, static void generate_fetch(struct gallivm_state *gallivm, + struct draw_context *draw, LLVMValueRef vbuffers_ptr, LLVMValueRef *res, struct pipe_vertex_element *velem, @@ -704,10 +705,17 @@ generate_fetch(struct gallivm_state *gallivm, struct lp_build_if_state if_ctx; if (velem->instance_divisor) { - /* array index = instance_id / instance_divisor */ - index = LLVMBuildUDiv(builder, instance_id, - lp_build_const_int32(gallivm, velem->instance_divisor), - "instance_divisor"); + /* Index is equal to the start instance plus the number of current + * instance divided by the divisor. In this case we compute it as: + * index = start_instance + ((instance_id - start_instance) / divisor) + */ + LLVMValueRef current_instance; + index = lp_build_const_int32(gallivm, draw->start_instance); + current_instance = LLVMBuildSub(builder, instance_id, index, ""); + current_instance = LLVMBuildUDiv(builder, current_instance, + lp_build_const_int32(gallivm, velem->instance_divisor), + "instance_divisor"); + index = LLVMBuildAdd(builder, index, current_instance, "instance"); } stride = lp_build_umul_overflow(gallivm, vb_stride, index, &ofbit); @@ -1697,7 +1705,7 @@ draw_llvm_generate(struct draw_llvm *llvm, struct draw_llvm_variant *variant, LLVMValueRef vb_index = lp_build_const_int32(gallivm, velem->vertex_buffer_index); LLVMValueRef vb = LLVMBuildGEP(builder, vb_ptr, &vb_index, 1, ""); - generate_fetch(gallivm, vbuffers_ptr, + generate_fetch(gallivm, draw, vbuffers_ptr, &aos_attribs[j][i], velem, vb, true_index, system_values.instance_id); } |