diff --git a/.pick_status.json b/.pick_status.json index bf83d7bbca9..bda24790307 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -256,7 +256,7 @@ "description": "tnl: Respect `start` when converting indices to GLuint", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "master_sha": null, "because_sha": "e99e7aa4c1ddd7b8c2c4388f4f8e4fa1955ca771" }, diff --git a/src/mesa/tnl/t_draw.c b/src/mesa/tnl/t_draw.c index c28378cb148..bffab548a0f 100644 --- a/src/mesa/tnl/t_draw.c +++ b/src/mesa/tnl/t_draw.c @@ -341,6 +341,7 @@ static void bind_inputs(struct gl_context *ctx, /* Translate indices to GLuints and store in VB->Elts. */ static void bind_indices(struct gl_context *ctx, + unsigned start, const struct _mesa_index_buffer *ib, struct gl_buffer_object **bo, GLuint *nr_bo) @@ -376,21 +377,23 @@ static void bind_indices(struct gl_context *ctx, VB->Elts = (GLuint *) ptr; } else { - GLuint *elts = (GLuint *)get_space(ctx, ib->count * sizeof(GLuint)); + GLuint *elts = (GLuint *)get_space(ctx, (start + ib->count) * sizeof(GLuint)); VB->Elts = elts; + elts += start; + if (ib->index_size_shift == 2) { - const GLuint *in = (GLuint *)ptr; + const GLuint *in = (GLuint *)ptr + start; for (i = 0; i < ib->count; i++) *elts++ = (GLuint)(*in++) + VB->Primitive[0].basevertex; } else if (ib->index_size_shift == 1) { - const GLushort *in = (GLushort *)ptr; + const GLushort *in = (GLushort *)ptr + start; for (i = 0; i < ib->count; i++) *elts++ = (GLuint)(*in++) + VB->Primitive[0].basevertex; } else { - const GLubyte *in = (GLubyte *)ptr; + const GLubyte *in = (GLubyte *)ptr + start; for (i = 0; i < ib->count; i++) *elts++ = (GLuint)(*in++) + VB->Primitive[0].basevertex; } @@ -505,7 +508,8 @@ void _tnl_draw_prims(struct gl_context *ctx, */ for (this_nr_prims = 1; i + this_nr_prims < nr_prims; this_nr_prims++) { - if (prim[i].basevertex != prim[i + this_nr_prims].basevertex) + if (prim[i].basevertex != prim[i + this_nr_prims].basevertex || + prim[i].start != prim[i + this_nr_prims].start) break; } @@ -517,7 +521,7 @@ void _tnl_draw_prims(struct gl_context *ctx, bind_prims(ctx, &prim[i], this_nr_prims); bind_inputs(ctx, arrays, max_index + prim[i].basevertex + 1, bo, &nr_bo); - bind_indices(ctx, ib, bo, &nr_bo); + bind_indices(ctx, prim[i].start, ib, bo, &nr_bo); tnl->CurInstance = inst; TNL_CONTEXT(ctx)->Driver.RunPipeline(ctx);