----- Original Message ----- > We were incorrectly computing the buffer offset when using the > instances. The buffer offset is always equal to: > start_instance * stride + (instance_num / instance_divisor) * > stride > We were completely ignoring the start instance quite > often producing instances that completely wrong, e.g. if > start instance = 5, instance divisor = 2, then on the first > iteration it should be: > 5 * stride, not (5/2) * stride as we'd have currently, and if > start instance = 1, instance divisor = 3, then on the first > iteration it should be: > 1 * stride, not 0 as we'd have. > This fixes it and adjusts all the code to the changes. > > Signed-off-by: Zack Rusin <za...@vmware.com> > --- > src/gallium/auxiliary/draw/draw_llvm.c | 15 ++++++--- > src/gallium/auxiliary/draw/draw_pipe_vbuf.c | 2 +- > src/gallium/auxiliary/draw/draw_private.h | 1 + > src/gallium/auxiliary/draw/draw_pt.c | 1 + > src/gallium/auxiliary/draw/draw_pt_emit.c | 2 ++ > src/gallium/auxiliary/draw/draw_pt_fetch.c | 2 ++ > src/gallium/auxiliary/draw/draw_pt_fetch_emit.c | 3 ++ > src/gallium/auxiliary/draw/draw_pt_so_emit.c | 23 ++++++++++++-- > src/gallium/auxiliary/draw/draw_vs_variant.c | 4 +++ > src/gallium/auxiliary/translate/translate.h | 4 +++ > .../auxiliary/translate/translate_generic.c | 17 ++++++++--- > src/gallium/auxiliary/translate/translate_sse.c | 32 > ++++++++++++++++---- > src/gallium/auxiliary/util/u_vbuf.c | 8 ++--- > src/gallium/drivers/nv30/nv30_push.c | 8 ++--- > src/gallium/drivers/nv50/nv50_push.c | 8 ++--- > src/gallium/drivers/nvc0/nvc0_push.c | 8 ++--- > src/gallium/drivers/nvc0/nvc0_vbo_translate.c | 8 ++--- > 17 files changed, 106 insertions(+), 40 deletions(-) > > diff --git a/src/gallium/auxiliary/draw/draw_llvm.c > b/src/gallium/auxiliary/draw/draw_llvm.c > index 97b463f..9eb5a93 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,14 @@ 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"); > + LLVMValueRef current_instance; > + /* array index = start_instance + (instance_num / instance_divisor) */ > + 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 +1702,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); > } > diff --git a/src/gallium/auxiliary/draw/draw_pipe_vbuf.c > b/src/gallium/auxiliary/draw/draw_pipe_vbuf.c > index 578433c..d3b38eb 100644 > --- a/src/gallium/auxiliary/draw/draw_pipe_vbuf.c > +++ b/src/gallium/auxiliary/draw/draw_pipe_vbuf.c > @@ -138,7 +138,7 @@ emit_vertex( struct vbuf_stage *vbuf, > /* Note: we really do want data[0] here, not data[pos]: > */ > vbuf->translate->set_buffer(vbuf->translate, 0, vertex->data[0], 0, > ~0); > - vbuf->translate->run(vbuf->translate, 0, 1, 0, vbuf->vertex_ptr); > + vbuf->translate->run(vbuf->translate, 0, 1, 0, 0, vbuf->vertex_ptr); > > if (0) draw_dump_emitted_vertex(vbuf->vinfo, (uint8_t > *)vbuf->vertex_ptr); > > diff --git a/src/gallium/auxiliary/draw/draw_private.h > b/src/gallium/auxiliary/draw/draw_private.h > index fd52c2d..f42cded 100644 > --- a/src/gallium/auxiliary/draw/draw_private.h > +++ b/src/gallium/auxiliary/draw/draw_private.h > @@ -306,6 +306,7 @@ struct draw_context > } extra_shader_outputs; > > unsigned instance_id; > + unsigned start_instance; > > #ifdef HAVE_LLVM > struct draw_llvm *llvm; > diff --git a/src/gallium/auxiliary/draw/draw_pt.c > b/src/gallium/auxiliary/draw/draw_pt.c > index c4d06de..e89ccd2 100644 > --- a/src/gallium/auxiliary/draw/draw_pt.c > +++ b/src/gallium/auxiliary/draw/draw_pt.c > @@ -533,6 +533,7 @@ draw_vbo(struct draw_context *draw, > > for (instance = 0; instance < info->instance_count; instance++) { > draw->instance_id = instance + info->start_instance; > + draw->start_instance = info->start_instance; > /* check for overflow */ > if (draw->instance_id < instance || > draw->instance_id < info->start_instance) { > diff --git a/src/gallium/auxiliary/draw/draw_pt_emit.c > b/src/gallium/auxiliary/draw/draw_pt_emit.c > index 4c96d74..fc64048 100644 > --- a/src/gallium/auxiliary/draw/draw_pt_emit.c > +++ b/src/gallium/auxiliary/draw/draw_pt_emit.c > @@ -171,6 +171,7 @@ draw_pt_emit(struct pt_emit *emit, > translate->run(translate, > 0, > vertex_count, > + draw->start_instance, > draw->instance_id, > hw_verts ); > > @@ -234,6 +235,7 @@ draw_pt_emit_linear(struct pt_emit *emit, > translate->run(translate, > 0, > count, > + draw->start_instance, > draw->instance_id, > hw_verts); > > diff --git a/src/gallium/auxiliary/draw/draw_pt_fetch.c > b/src/gallium/auxiliary/draw/draw_pt_fetch.c > index 3740dea..8716f65 100644 > --- a/src/gallium/auxiliary/draw/draw_pt_fetch.c > +++ b/src/gallium/auxiliary/draw/draw_pt_fetch.c > @@ -168,6 +168,7 @@ draw_pt_fetch_run(struct pt_fetch *fetch, > translate->run_elts( translate, > elts, > count, > + draw->start_instance, > draw->instance_id, > verts ); > } > @@ -195,6 +196,7 @@ draw_pt_fetch_run_linear(struct pt_fetch *fetch, > translate->run( translate, > start, > count, > + draw->start_instance, > draw->instance_id, > verts ); > } > diff --git a/src/gallium/auxiliary/draw/draw_pt_fetch_emit.c > b/src/gallium/auxiliary/draw/draw_pt_fetch_emit.c > index dc6decb..22ec8d6 100644 > --- a/src/gallium/auxiliary/draw/draw_pt_fetch_emit.c > +++ b/src/gallium/auxiliary/draw/draw_pt_fetch_emit.c > @@ -210,6 +210,7 @@ static void fetch_emit_run( struct draw_pt_middle_end > *middle, > feme->translate->run_elts( feme->translate, > fetch_elts, > fetch_count, > + draw->start_instance, > draw->instance_id, > hw_verts ); > > @@ -267,6 +268,7 @@ static void fetch_emit_run_linear( struct > draw_pt_middle_end *middle, > feme->translate->run( feme->translate, > start, > count, > + draw->start_instance, > draw->instance_id, > hw_verts ); > > @@ -326,6 +328,7 @@ static boolean fetch_emit_run_linear_elts( struct > draw_pt_middle_end *middle, > feme->translate->run( feme->translate, > start, > count, > + draw->start_instance, > draw->instance_id, > hw_verts ); > > diff --git a/src/gallium/auxiliary/draw/draw_pt_so_emit.c > b/src/gallium/auxiliary/draw/draw_pt_so_emit.c > index d624a99..a6d1da4 100644 > --- a/src/gallium/auxiliary/draw/draw_pt_so_emit.c > +++ b/src/gallium/auxiliary/draw/draw_pt_so_emit.c > @@ -182,12 +182,29 @@ static void so_emit_prim(struct pt_so_emit *so, > > buffer = (float *)((char *)draw->so.targets[ob]->mapping + > draw->so.targets[ob]->target.buffer_offset + > - draw->so.targets[ob]->internal_offset) + > state->output[slot].dst_offset; > + draw->so.targets[ob]->internal_offset) + > + state->output[slot].dst_offset; > > if (idx == so->pos_idx && pcp_ptr) > - memcpy(buffer, &pre_clip_pos[start_comp], num_comps * > sizeof(float)); > + memcpy(buffer, &pre_clip_pos[start_comp], > + num_comps * sizeof(float)); > else > - memcpy(buffer, &input[idx][start_comp], num_comps * > sizeof(float)); > + memcpy(buffer, &input[idx][start_comp], > + num_comps * sizeof(float)); > +#if 0 > + { > + int j; > + debug_printf("VERT[%d], offset = %d, slot[%d] sc = %d, num_c = > %d, idx = %d = [", > + i + draw->so.targets[ob]->emitted_vertices, > + draw->so.targets[ob]->internal_offset, > + slot, start_comp, num_comps, idx); > + for (j = 0; j < num_comps; ++j) { > + unsigned *ubuffer = (unsigned*)buffer; > + debug_printf("%d (0x%x), ", ubuffer[j], ubuffer[j]); > + } > + debug_printf("]\n"); > + } > +#endif > } > for (ob = 0; ob < draw->so.num_targets; ++ob) { > struct draw_so_target *target = draw->so.targets[ob]; > diff --git a/src/gallium/auxiliary/draw/draw_vs_variant.c > b/src/gallium/auxiliary/draw/draw_vs_variant.c > index 152c130..37500c7 100644 > --- a/src/gallium/auxiliary/draw/draw_vs_variant.c > +++ b/src/gallium/auxiliary/draw/draw_vs_variant.c > @@ -168,6 +168,7 @@ static void PIPE_CDECL vsvg_run_elts( struct > draw_vs_variant *variant, > vsvg->fetch->run_elts( vsvg->fetch, > elts, > count, > + vsvg->draw->start_instance, > vsvg->draw->instance_id, > temp_buffer ); > > @@ -211,6 +212,7 @@ static void PIPE_CDECL vsvg_run_elts( struct > draw_vs_variant *variant, > > vsvg->emit->run( vsvg->emit, > 0, count, > + vsvg->draw->start_instance, > vsvg->draw->instance_id, > output_buffer ); > > @@ -234,6 +236,7 @@ static void PIPE_CDECL vsvg_run_linear( struct > draw_vs_variant *variant, > vsvg->fetch->run( vsvg->fetch, > start, > count, > + vsvg->draw->start_instance, > vsvg->draw->instance_id, > temp_buffer ); > > @@ -274,6 +277,7 @@ static void PIPE_CDECL vsvg_run_linear( struct > draw_vs_variant *variant, > > vsvg->emit->run( vsvg->emit, > 0, count, > + vsvg->draw->start_instance, > vsvg->draw->instance_id, > output_buffer ); > > diff --git a/src/gallium/auxiliary/translate/translate.h > b/src/gallium/auxiliary/translate/translate.h > index 850ef39..1132114 100644 > --- a/src/gallium/auxiliary/translate/translate.h > +++ b/src/gallium/auxiliary/translate/translate.h > @@ -74,24 +74,28 @@ struct translate; > typedef void (PIPE_CDECL *run_elts_func)(struct translate *, > const unsigned *elts, > unsigned count, > + unsigned start_instance, > unsigned instance_id, > void *output_buffer); > > typedef void (PIPE_CDECL *run_elts16_func)(struct translate *, > const uint16_t *elts, > unsigned count, > + unsigned start_instance, > unsigned instance_id, > void *output_buffer); > > typedef void (PIPE_CDECL *run_elts8_func)(struct translate *, > const uint8_t *elts, > unsigned count, > + unsigned start_instance, > unsigned instance_id, > void *output_buffer); > > typedef void (PIPE_CDECL *run_func)(struct translate *, > unsigned start, > unsigned count, > + unsigned start_instance, > unsigned instance_id, > void *output_buffer); > > diff --git a/src/gallium/auxiliary/translate/translate_generic.c > b/src/gallium/auxiliary/translate/translate_generic.c > index 894c168..96e35b0 100644 > --- a/src/gallium/auxiliary/translate/translate_generic.c > +++ b/src/gallium/auxiliary/translate/translate_generic.c > @@ -607,6 +607,7 @@ static emit_func get_emit_func( enum pipe_format format ) > > static ALWAYS_INLINE void PIPE_CDECL generic_run_one( struct > translate_generic *tg, > unsigned elt, > + unsigned start_instance, > unsigned instance_id, > void *vert ) > { > @@ -623,7 +624,9 @@ static ALWAYS_INLINE void PIPE_CDECL generic_run_one( > struct translate_generic * > int copy_size; > > if (tg->attrib[attr].instance_divisor) { > - index = instance_id / tg->attrib[attr].instance_divisor; > + index = start_instance; > + index += (instance_id - start_instance) / > + tg->attrib[attr].instance_divisor; > /* XXX we need to clamp the index here too, but to a > * per-array max value, not the draw->pt.max_index value > * that's being given to us via translate->set_buffer(). > @@ -674,6 +677,7 @@ static ALWAYS_INLINE void PIPE_CDECL generic_run_one( > struct translate_generic * > static void PIPE_CDECL generic_run_elts( struct translate *translate, > const unsigned *elts, > unsigned count, > + unsigned start_instance, > unsigned instance_id, > void *output_buffer ) > { > @@ -682,7 +686,7 @@ static void PIPE_CDECL generic_run_elts( struct translate > *translate, > unsigned i; > > for (i = 0; i < count; i++) { > - generic_run_one(tg, *elts++, instance_id, vert); > + generic_run_one(tg, *elts++, start_instance, instance_id, vert); > vert += tg->translate.key.output_stride; > } > } > @@ -690,6 +694,7 @@ static void PIPE_CDECL generic_run_elts( struct translate > *translate, > static void PIPE_CDECL generic_run_elts16( struct translate *translate, > const uint16_t *elts, > unsigned count, > + unsigned start_instance, > unsigned instance_id, > void *output_buffer ) > { > @@ -698,7 +703,7 @@ static void PIPE_CDECL generic_run_elts16( struct > translate *translate, > unsigned i; > > for (i = 0; i < count; i++) { > - generic_run_one(tg, *elts++, instance_id, vert); > + generic_run_one(tg, *elts++, start_instance, instance_id, vert); > vert += tg->translate.key.output_stride; > } > } > @@ -706,6 +711,7 @@ static void PIPE_CDECL generic_run_elts16( struct > translate *translate, > static void PIPE_CDECL generic_run_elts8( struct translate *translate, > const uint8_t *elts, > unsigned count, > + unsigned start_instance, > unsigned instance_id, > void *output_buffer ) > { > @@ -714,7 +720,7 @@ static void PIPE_CDECL generic_run_elts8( struct > translate *translate, > unsigned i; > > for (i = 0; i < count; i++) { > - generic_run_one(tg, *elts++, instance_id, vert); > + generic_run_one(tg, *elts++, start_instance, instance_id, vert); > vert += tg->translate.key.output_stride; > } > } > @@ -722,6 +728,7 @@ static void PIPE_CDECL generic_run_elts8( struct > translate *translate, > static void PIPE_CDECL generic_run( struct translate *translate, > unsigned start, > unsigned count, > + unsigned start_instance, > unsigned instance_id, > void *output_buffer ) > { > @@ -730,7 +737,7 @@ static void PIPE_CDECL generic_run( struct translate > *translate, > unsigned i; > > for (i = 0; i < count; i++) { > - generic_run_one(tg, start + i, instance_id, vert); > + generic_run_one(tg, start + i, start_instance, instance_id, vert); > vert += tg->translate.key.output_stride; > } > } > diff --git a/src/gallium/auxiliary/translate/translate_sse.c > b/src/gallium/auxiliary/translate/translate_sse.c > index c2dd42d..a4f7b24 100644 > --- a/src/gallium/auxiliary/translate/translate_sse.c > +++ b/src/gallium/auxiliary/translate/translate_sse.c > @@ -112,6 +112,7 @@ struct translate_sse { > > boolean use_instancing; > unsigned instance_id; > + unsigned start_instance; > > /* these are actually known values, but putting them in a struct > * like this is helpful to keep them in sync across the file. > @@ -1061,6 +1062,8 @@ static boolean init_inputs( struct translate_sse *p, > unsigned i; > struct x86_reg instance_id = x86_make_disp(p->machine_EDI, > get_offset(p, > &p->instance_id)); > + struct x86_reg start_instance = x86_make_disp(p->machine_EDI, > + get_offset(p, > &p->start_instance)); > > for (i = 0; i < p->nr_buffer_variants; i++) { > struct translate_buffer_variant *variant = &p->buffer_variant[i]; > @@ -1082,7 +1085,8 @@ static boolean init_inputs( struct translate_sse *p, > * base_ptr + stride * index, where index depends on instance > divisor > */ > if (variant->instance_divisor) { > - /* Our index is instance ID divided by instance divisor. > + /* Start with instance = instance_id > + * which is true if divisor is 1. > */ > x86_mov(p->func, tmp_EAX, instance_id); > > @@ -1090,13 +1094,22 @@ static boolean init_inputs( struct translate_sse *p, > struct x86_reg tmp_EDX = p->tmp2_EDX; > struct x86_reg tmp_ECX = p->src_ECX; > > + /* instance_num = instance_id - start_instance */ > + x86_mov(p->func, tmp_EDX, start_instance); > + x86_sub(p->func, tmp_EAX, tmp_EDX); > + > /* TODO: Add x86_shr() to rtasm and use it whenever > * instance divisor is power of two. > */ > - > x86_xor(p->func, tmp_EDX, tmp_EDX); > x86_mov_reg_imm(p->func, tmp_ECX, variant->instance_divisor); > x86_div(p->func, tmp_ECX); /* EAX = EDX:EAX / ECX */ > + > + /* instance = (instance_id - start_instance) / divisor + > + * start_instance > + */ > + x86_mov(p->func, tmp_EDX, start_instance); > + x86_add(p->func, tmp_EAX, tmp_EDX); > } > > /* XXX we need to clamp the index here too, but to a > @@ -1312,17 +1325,24 @@ static boolean build_vertex_emit( struct > translate_sse *p, > x86_mov(p->func, p->count_EBP, x86_fn_arg(p->func, 3)); > > if(x86_target(p->func) != X86_32) > - x64_mov64(p->func, p->outbuf_EBX, x86_fn_arg(p->func, 5)); > + x64_mov64(p->func, p->outbuf_EBX, x86_fn_arg(p->func, 6)); > else > - x86_mov(p->func, p->outbuf_EBX, x86_fn_arg(p->func, 5)); > + x86_mov(p->func, p->outbuf_EBX, x86_fn_arg(p->func, 6)); > > /* Load instance ID. > */ > - if (p->use_instancing) { > + if (p->use_instancing) { > x86_mov(p->func, > - p->tmp_EAX, > + p->tmp2_EDX, > x86_fn_arg(p->func, 4)); > x86_mov(p->func, > + x86_make_disp(p->machine_EDI, get_offset(p, > &p->start_instance)), > + p->tmp2_EDX); > + > + x86_mov(p->func, > + p->tmp_EAX, > + x86_fn_arg(p->func, 5)); > + x86_mov(p->func, > x86_make_disp(p->machine_EDI, get_offset(p, &p->instance_id)), > p->tmp_EAX); > } > diff --git a/src/gallium/auxiliary/util/u_vbuf.c > b/src/gallium/auxiliary/util/u_vbuf.c > index 5936f74..52b360e 100644 > --- a/src/gallium/auxiliary/util/u_vbuf.c > +++ b/src/gallium/auxiliary/util/u_vbuf.c > @@ -403,13 +403,13 @@ u_vbuf_translate_buffers(struct u_vbuf *mgr, struct > translate_key *key, > > switch (ib->index_size) { > case 4: > - tr->run_elts(tr, (unsigned*)map, num_indices, 0, out_map); > + tr->run_elts(tr, (unsigned*)map, num_indices, 0, 0, out_map); > break; > case 2: > - tr->run_elts16(tr, (uint16_t*)map, num_indices, 0, out_map); > + tr->run_elts16(tr, (uint16_t*)map, num_indices, 0, 0, out_map); > break; > case 1: > - tr->run_elts8(tr, map, num_indices, 0, out_map); > + tr->run_elts8(tr, map, num_indices, 0, 0, out_map); > break; > } > > @@ -428,7 +428,7 @@ u_vbuf_translate_buffers(struct u_vbuf *mgr, struct > translate_key *key, > > out_offset -= key->output_stride * start_vertex; > > - tr->run(tr, 0, num_vertices, 0, out_map); > + tr->run(tr, 0, num_vertices, 0, 0, out_map); > } > > /* Unmap all buffers. */ > diff --git a/src/gallium/drivers/nv30/nv30_push.c > b/src/gallium/drivers/nv30/nv30_push.c > index 854d2d7..d37af2c 100644 > --- a/src/gallium/drivers/nv30/nv30_push.c > +++ b/src/gallium/drivers/nv30/nv30_push.c > @@ -99,7 +99,7 @@ emit_vertices_i08(struct push_context *ctx, unsigned start, > unsigned count) > > BEGIN_NI04(ctx->push, NV30_3D(VERTEX_DATA), size); > > - ctx->translate->run_elts8(ctx->translate, elts, nr, 0, > ctx->push->cur); > + ctx->translate->run_elts8(ctx->translate, elts, nr, 0, 0, > ctx->push->cur); > > ctx->push->cur += size; > count -= nr; > @@ -131,7 +131,7 @@ emit_vertices_i16(struct push_context *ctx, unsigned > start, unsigned count) > > BEGIN_NI04(ctx->push, NV30_3D(VERTEX_DATA), size); > > - ctx->translate->run_elts16(ctx->translate, elts, nr, 0, > ctx->push->cur); > + ctx->translate->run_elts16(ctx->translate, elts, nr, 0, 0, > ctx->push->cur); > > ctx->push->cur += size; > count -= nr; > @@ -163,7 +163,7 @@ emit_vertices_i32(struct push_context *ctx, unsigned > start, unsigned count) > > BEGIN_NI04(ctx->push, NV30_3D(VERTEX_DATA), size); > > - ctx->translate->run_elts(ctx->translate, elts, nr, 0, ctx->push->cur); > + ctx->translate->run_elts(ctx->translate, elts, nr, 0, 0, > ctx->push->cur); > > ctx->push->cur += size; > count -= nr; > @@ -187,7 +187,7 @@ emit_vertices_seq(struct push_context *ctx, unsigned > start, unsigned count) > > BEGIN_NI04(ctx->push, NV30_3D(VERTEX_DATA), size); > > - ctx->translate->run(ctx->translate, start, push, 0, ctx->push->cur); > + ctx->translate->run(ctx->translate, start, push, 0, 0, > ctx->push->cur); > ctx->push->cur += size; > count -= push; > start += push; > diff --git a/src/gallium/drivers/nv50/nv50_push.c > b/src/gallium/drivers/nv50/nv50_push.c > index eb6bfbc..7380432 100644 > --- a/src/gallium/drivers/nv50/nv50_push.c > +++ b/src/gallium/drivers/nv50/nv50_push.c > @@ -76,7 +76,7 @@ emit_vertices_i08(struct push_context *ctx, unsigned start, > unsigned count) > > BEGIN_NI04(ctx->push, NV50_3D(VERTEX_DATA), size); > > - ctx->translate->run_elts8(ctx->translate, elts, nr, ctx->instance_id, > + ctx->translate->run_elts8(ctx->translate, elts, nr, 0, > ctx->instance_id, > ctx->push->cur); > > ctx->push->cur += size; > @@ -109,7 +109,7 @@ emit_vertices_i16(struct push_context *ctx, unsigned > start, unsigned count) > > BEGIN_NI04(ctx->push, NV50_3D(VERTEX_DATA), size); > > - ctx->translate->run_elts16(ctx->translate, elts, nr, ctx->instance_id, > + ctx->translate->run_elts16(ctx->translate, elts, nr, 0, > ctx->instance_id, > ctx->push->cur); > > ctx->push->cur += size; > @@ -142,7 +142,7 @@ emit_vertices_i32(struct push_context *ctx, unsigned > start, unsigned count) > > BEGIN_NI04(ctx->push, NV50_3D(VERTEX_DATA), size); > > - ctx->translate->run_elts(ctx->translate, elts, nr, ctx->instance_id, > + ctx->translate->run_elts(ctx->translate, elts, nr, 0, > ctx->instance_id, > ctx->push->cur); > > ctx->push->cur += size; > @@ -167,7 +167,7 @@ emit_vertices_seq(struct push_context *ctx, unsigned > start, unsigned count) > > BEGIN_NI04(ctx->push, NV50_3D(VERTEX_DATA), size); > > - ctx->translate->run(ctx->translate, start, push, ctx->instance_id, > + ctx->translate->run(ctx->translate, start, push, 0, ctx->instance_id, > ctx->push->cur); > ctx->push->cur += size; > count -= push; > diff --git a/src/gallium/drivers/nvc0/nvc0_push.c > b/src/gallium/drivers/nvc0/nvc0_push.c > index 78cc5c2..75caf8a 100644 > --- a/src/gallium/drivers/nvc0/nvc0_push.c > +++ b/src/gallium/drivers/nvc0/nvc0_push.c > @@ -137,7 +137,7 @@ emit_vertices_i08(struct push_context *ctx, unsigned > start, unsigned count) > > BEGIN_NIC0(ctx->push, NVC0_3D(VERTEX_DATA), size); > > - ctx->translate->run_elts8(ctx->translate, elts, nr, ctx->instance_id, > + ctx->translate->run_elts8(ctx->translate, elts, nr, 0, > ctx->instance_id, > ctx->push->cur); > ctx->push->cur += size; > > @@ -178,7 +178,7 @@ emit_vertices_i16(struct push_context *ctx, unsigned > start, unsigned count) > > BEGIN_NIC0(ctx->push, NVC0_3D(VERTEX_DATA), size); > > - ctx->translate->run_elts16(ctx->translate, elts, nr, ctx->instance_id, > + ctx->translate->run_elts16(ctx->translate, elts, nr, 0, > ctx->instance_id, > ctx->push->cur); > ctx->push->cur += size; > > @@ -219,7 +219,7 @@ emit_vertices_i32(struct push_context *ctx, unsigned > start, unsigned count) > > BEGIN_NIC0(ctx->push, NVC0_3D(VERTEX_DATA), size); > > - ctx->translate->run_elts(ctx->translate, elts, nr, ctx->instance_id, > + ctx->translate->run_elts(ctx->translate, elts, nr, 0, > ctx->instance_id, > ctx->push->cur); > ctx->push->cur += size; > > @@ -252,7 +252,7 @@ emit_vertices_seq(struct push_context *ctx, unsigned > start, unsigned count) > > BEGIN_NIC0(ctx->push, NVC0_3D(VERTEX_DATA), size); > > - ctx->translate->run(ctx->translate, start, push, ctx->instance_id, > + ctx->translate->run(ctx->translate, start, push, 0, ctx->instance_id, > ctx->push->cur); > ctx->push->cur += size; > > diff --git a/src/gallium/drivers/nvc0/nvc0_vbo_translate.c > b/src/gallium/drivers/nvc0/nvc0_vbo_translate.c > index ec52de2..6ea4220 100644 > --- a/src/gallium/drivers/nvc0/nvc0_vbo_translate.c > +++ b/src/gallium/drivers/nvc0/nvc0_vbo_translate.c > @@ -215,7 +215,7 @@ disp_vertices_i08(struct push_context *ctx, unsigned > start, unsigned count) > if (unlikely(ctx->prim_restart)) > nR = prim_restart_search_i08(elts, nR, ctx->restart_index); > > - translate->run_elts8(translate, elts, nR, ctx->instance_id, > ctx->dest); > + translate->run_elts8(translate, elts, nR, 0, ctx->instance_id, > ctx->dest); > count -= nR; > ctx->dest += nR * ctx->vertex_size; > > @@ -271,7 +271,7 @@ disp_vertices_i16(struct push_context *ctx, unsigned > start, unsigned count) > if (unlikely(ctx->prim_restart)) > nR = prim_restart_search_i16(elts, nR, ctx->restart_index); > > - translate->run_elts16(translate, elts, nR, ctx->instance_id, > ctx->dest); > + translate->run_elts16(translate, elts, nR, 0, ctx->instance_id, > ctx->dest); > count -= nR; > ctx->dest += nR * ctx->vertex_size; > > @@ -327,7 +327,7 @@ disp_vertices_i32(struct push_context *ctx, unsigned > start, unsigned count) > if (unlikely(ctx->prim_restart)) > nR = prim_restart_search_i32(elts, nR, ctx->restart_index); > > - translate->run_elts(translate, elts, nR, ctx->instance_id, ctx->dest); > + translate->run_elts(translate, elts, nR, 0, ctx->instance_id, > ctx->dest); > count -= nR; > ctx->dest += nR * ctx->vertex_size; > > @@ -376,7 +376,7 @@ disp_vertices_seq(struct push_context *ctx, unsigned > start, unsigned count) > struct translate *translate = ctx->translate; > unsigned pos = 0; > > - translate->run(translate, start, count, ctx->instance_id, ctx->dest); > + translate->run(translate, start, count, 0, ctx->instance_id, ctx->dest); > do { > unsigned nr = count; > > -- > 1.7.10.4 >
Reviewed-by: Jose Fonseca <jfons...@vmware.com> _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev