[Mesa-dev] [PATCH v2] nv50, nvc0: fix start_instance in manual push path

Samuel Pitoiset samuel.pitoiset at gmail.com
Sun Jun 19 13:41:16 UTC 2016


Reviewed-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>

On 06/19/2016 06:54 AM, Ilia Mirkin wrote:
> 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 at alum.mit.edu>
> Cc: "11.2 12.0" <mesa-stable at lists.freedesktop.org>
> ---
>
> v1 -> v2: use translate's start_instance parameter.
>
> This relies on the earlier fix I just sent for start_instance processing in translate_sse.
>
>  src/gallium/drivers/nouveau/nv50/nv50_push.c          | 16 +++++++++++-----
>  src/gallium/drivers/nouveau/nvc0/nvc0_vbo_translate.c | 16 +++++++++++-----
>  2 files changed, 22 insertions(+), 10 deletions(-)
>
> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_push.c b/src/gallium/drivers/nouveau/nv50/nv50_push.c
> index cbef95d..6a53ad0 100644
> --- a/src/gallium/drivers/nouveau/nv50/nv50_push.c
> +++ b/src/gallium/drivers/nouveau/nv50/nv50_push.c
> @@ -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) {
> diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_vbo_translate.c b/src/gallium/drivers/nouveau/nvc0/nvc0_vbo_translate.c
> index 20b6742..fd2bcbb 100644
> --- a/src/gallium/drivers/nouveau/nvc0/nvc0_vbo_translate.c
> +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_vbo_translate.c
> @@ -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 {
>


More information about the mesa-dev mailing list