mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-04 13:30:11 +01:00
nv50,nvc0: fix start_instance in manual push path
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 <imirkin@alum.mit.edu> Cc: "11.2 12.0" <mesa-stable@lists.freedesktop.org> Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
This commit is contained in:
parent
5b0d64886d
commit
1f4bca798d
2 changed files with 22 additions and 10 deletions
|
|
@ -30,6 +30,7 @@ struct push_context {
|
|||
|
||||
uint32_t prim;
|
||||
uint32_t restart_index;
|
||||
uint32_t start_instance;
|
||||
uint32_t instance_id;
|
||||
};
|
||||
|
||||
|
|
@ -85,7 +86,8 @@ 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, 0, ctx->instance_id,
|
||||
ctx->translate->run_elts8(ctx->translate, elts, nr,
|
||||
ctx->start_instance, ctx->instance_id,
|
||||
ctx->push->cur);
|
||||
|
||||
ctx->push->cur += size;
|
||||
|
|
@ -123,7 +125,8 @@ 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, 0, ctx->instance_id,
|
||||
ctx->translate->run_elts16(ctx->translate, elts, nr,
|
||||
ctx->start_instance, ctx->instance_id,
|
||||
ctx->push->cur);
|
||||
|
||||
ctx->push->cur += size;
|
||||
|
|
@ -161,7 +164,8 @@ 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, 0, ctx->instance_id,
|
||||
ctx->translate->run_elts(ctx->translate, elts, nr,
|
||||
ctx->start_instance, ctx->instance_id,
|
||||
ctx->push->cur);
|
||||
|
||||
ctx->push->cur += size;
|
||||
|
|
@ -194,7 +198,8 @@ 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, 0, ctx->instance_id,
|
||||
ctx->translate->run(ctx->translate, start, push,
|
||||
ctx->start_instance, ctx->instance_id,
|
||||
ctx->push->cur);
|
||||
ctx->push->cur += size;
|
||||
count -= push;
|
||||
|
|
@ -247,6 +252,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 =
|
||||
|
|
@ -301,7 +307,7 @@ nv50_push_vbo(struct nv50_context *nv50, const struct pipe_draw_info *info)
|
|||
ctx.restart_index = 0;
|
||||
}
|
||||
|
||||
ctx.instance_id = info->start_instance;
|
||||
ctx.start_instance = info->start_instance;
|
||||
ctx.prim = nv50_prim_gl(info->mode);
|
||||
|
||||
if (info->primitive_restart) {
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@ struct push_context {
|
|||
|
||||
uint32_t vertex_size;
|
||||
uint32_t restart_index;
|
||||
uint32_t start_instance;
|
||||
uint32_t instance_id;
|
||||
|
||||
bool prim_restart;
|
||||
|
|
@ -44,6 +45,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);
|
||||
|
|
@ -246,7 +248,8 @@ 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, 0, ctx->instance_id, ctx->dest);
|
||||
translate->run_elts8(translate, elts, nR,
|
||||
ctx->start_instance, ctx->instance_id, ctx->dest);
|
||||
count -= nR;
|
||||
ctx->dest += nR * ctx->vertex_size;
|
||||
|
||||
|
|
@ -302,7 +305,8 @@ 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, 0, ctx->instance_id, ctx->dest);
|
||||
translate->run_elts16(translate, elts, nR,
|
||||
ctx->start_instance, ctx->instance_id, ctx->dest);
|
||||
count -= nR;
|
||||
ctx->dest += nR * ctx->vertex_size;
|
||||
|
||||
|
|
@ -358,7 +362,8 @@ 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, 0, ctx->instance_id, ctx->dest);
|
||||
translate->run_elts(translate, elts, nR,
|
||||
ctx->start_instance, ctx->instance_id, ctx->dest);
|
||||
count -= nR;
|
||||
ctx->dest += nR * ctx->vertex_size;
|
||||
|
||||
|
|
@ -410,7 +415,8 @@ disp_vertices_seq(struct push_context *ctx, unsigned start, unsigned count)
|
|||
/* XXX: This will read the data corresponding to the primitive restart index,
|
||||
* maybe we should avoid that ?
|
||||
*/
|
||||
translate->run(translate, start, count, 0, ctx->instance_id, ctx->dest);
|
||||
translate->run(translate, start, count,
|
||||
ctx->start_instance, ctx->instance_id, ctx->dest);
|
||||
do {
|
||||
unsigned nr = count;
|
||||
|
||||
|
|
@ -515,7 +521,7 @@ nvc0_push_vbo(struct nvc0_context *nvc0, const struct pipe_draw_info *info)
|
|||
index_size = 0;
|
||||
}
|
||||
|
||||
ctx.instance_id = info->start_instance;
|
||||
ctx.start_instance = info->start_instance;
|
||||
|
||||
prim = nvc0_prim_gl(info->mode);
|
||||
do {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue