The start instance is applied as an offset into the buffer directly, ignoring the divisor, not as an instance id offset that respects the divisor.
Signed-off-by: Ilia Mirkin <imir...@alum.mit.edu> Cc: "11.2 12.0" <mesa-sta...@lists.freedesktop.org> --- src/gallium/drivers/nouveau/nv50/nv50_push.c | 10 +++++++--- src/gallium/drivers/nouveau/nvc0/nvc0_vbo_translate.c | 12 +++++++----- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/gallium/drivers/nouveau/nv50/nv50_push.c b/src/gallium/drivers/nouveau/nv50/nv50_push.c index cbef95d..af27fb8 100644 --- a/src/gallium/drivers/nouveau/nv50/nv50_push.c +++ b/src/gallium/drivers/nouveau/nv50/nv50_push.c @@ -247,6 +247,7 @@ nv50_push_vbo(struct nv50_context *nv50, const struct pipe_draw_info *info) ctx.need_vertex_id = nv50->screen->base.class_3d >= NV84_3D_CLASS && nv50->vertprog->vp.need_vertex_id && (nv50->vertex->num_elements < 32); ctx.index_bias = info->index_bias; + ctx.instance_id = 0; /* For indexed draws, gl_VertexID must be emitted for every vertex. */ ctx.packet_vertex_limit = @@ -264,8 +265,12 @@ nv50_push_vbo(struct nv50_context *nv50, const struct pipe_draw_info *info) else data = vb->user_buffer; - if (apply_bias && likely(!(nv50->vertex->instance_bufs & (1 << i)))) - data += (ptrdiff_t)info->index_bias * vb->stride; + if (likely(!(nv50->vertex->instance_bufs & (1 << i)))) { + if (apply_bias) + data += (ptrdiff_t)info->index_bias * vb->stride; + } else { + data += (ptrdiff_t)info->start_instance * vb->stride; + } ctx.translate->set_buffer(ctx.translate, i, data, vb->stride, ~0); } @@ -301,7 +306,6 @@ nv50_push_vbo(struct nv50_context *nv50, const struct pipe_draw_info *info) ctx.restart_index = 0; } - ctx.instance_id = info->start_instance; ctx.prim = nv50_prim_gl(info->mode); if (info->primitive_restart) { diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_vbo_translate.c b/src/gallium/drivers/nouveau/nvc0/nvc0_vbo_translate.c index 20b6742..2f4e8b6 100644 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_vbo_translate.c +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_vbo_translate.c @@ -44,6 +44,7 @@ nvc0_push_context_init(struct nvc0_context *nvc0, struct push_context *ctx) ctx->translate = nvc0->vertex->translate; ctx->vertex_size = nvc0->vertex->size; + ctx->instance_id = 0; ctx->need_vertex_id = nvc0->vertprog->vp.need_vertex_id && (nvc0->vertex->num_elements < 32); @@ -58,7 +59,8 @@ nvc0_push_context_init(struct nvc0_context *nvc0, struct push_context *ctx) } static inline void -nvc0_vertex_configure_translate(struct nvc0_context *nvc0, int32_t index_bias) +nvc0_vertex_configure_translate(struct nvc0_context *nvc0, int32_t index_bias, + uint32_t start_instance) { struct translate *translate = nvc0->vertex->translate; unsigned i; @@ -73,8 +75,10 @@ nvc0_vertex_configure_translate(struct nvc0_context *nvc0, int32_t index_bias) map = nouveau_resource_map_offset(&nvc0->base, nv04_resource(vb->buffer), vb->buffer_offset, NOUVEAU_BO_RD); - if (index_bias && !unlikely(nvc0->vertex->instance_bufs & (1 << i))) + if (!unlikely(nvc0->vertex->instance_bufs & (1 << i))) map += (intptr_t)index_bias * vb->stride; + else + map += (intptr_t)start_instance * vb->stride; translate->set_buffer(translate, i, map, vb->stride, ~0); } @@ -470,7 +474,7 @@ nvc0_push_vbo(struct nvc0_context *nvc0, const struct pipe_draw_info *info) nvc0_push_context_init(nvc0, &ctx); - nvc0_vertex_configure_translate(nvc0, info->index_bias); + nvc0_vertex_configure_translate(nvc0, info->index_bias, info->start_instance); if (nvc0->state.index_bias) { /* this is already taken care of by translate */ @@ -515,8 +519,6 @@ nvc0_push_vbo(struct nvc0_context *nvc0, const struct pipe_draw_info *info) index_size = 0; } - ctx.instance_id = info->start_instance; - prim = nvc0_prim_gl(info->mode); do { PUSH_SPACE(ctx.push, 9); -- 2.7.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev