[Mesa-dev] [PATCH] draw: fix prim ids when there's no gs

Jose Fonseca jfonseca at vmware.com
Thu Apr 23 04:15:24 PDT 2015


On 23/04/15 00:06, sroland at vmware.com wrote:
> From: Roland Scheidegger <sroland at vmware.com>
>
> We were resetting the prim id count for each run of the prim assembler,
> hence this only worked when the draw calls were very small (the exact limit
> depending on the vertex size), since larger draw calls get split up.
> So, do the same as we do already if there's a gs, reset it to zero explicitly
> for every new instance (this possibly could use the same variable but that
> isn't doable without some heavy refactoring and I'm not sure it makes sense).
>
> This fixes https://bugs.freedesktop.org/show_bug.cgi?id=90130.
> ---
>   src/gallium/auxiliary/draw/draw_context.c        |  1 +
>   src/gallium/auxiliary/draw/draw_prim_assembler.c | 13 +++++++++++--
>   src/gallium/auxiliary/draw/draw_prim_assembler.h |  3 +++
>   3 files changed, 15 insertions(+), 2 deletions(-)
>
> diff --git a/src/gallium/auxiliary/draw/draw_context.c b/src/gallium/auxiliary/draw/draw_context.c
> index 04cf5b7..ee009c1 100644
> --- a/src/gallium/auxiliary/draw/draw_context.c
> +++ b/src/gallium/auxiliary/draw/draw_context.c
> @@ -182,6 +182,7 @@ boolean draw_init(struct draw_context *draw)
>   void draw_new_instance(struct draw_context *draw)
>   {
>      draw_geometry_shader_new_instance(draw->gs.geometry_shader);
> +   draw_prim_assembler_new_instance(draw->ia);
>   }
>
>
> diff --git a/src/gallium/auxiliary/draw/draw_prim_assembler.c b/src/gallium/auxiliary/draw/draw_prim_assembler.c
> index 776c172..7ff705a 100644
> --- a/src/gallium/auxiliary/draw/draw_prim_assembler.c
> +++ b/src/gallium/auxiliary/draw/draw_prim_assembler.c
> @@ -189,7 +189,6 @@ draw_prim_assembler_prepare_outputs(struct draw_assembler *ia)
>      } else {
>         ia->primid_slot = -1;
>      }
> -   ia->primid = 0;
>   }
>
>
> @@ -233,7 +232,6 @@ draw_prim_assembler_run(struct draw_context *draw,
>      asmblr->input_prims = input_prims;
>      asmblr->input_verts = input_verts;
>      asmblr->needs_primid = needs_primid(asmblr->draw);
> -   asmblr->primid = 0;
>      asmblr->num_prims = 0;
>
>      output_prims->linear = TRUE;
> @@ -284,3 +282,14 @@ draw_prim_assembler_destroy(struct draw_assembler *ia)
>   {
>      FREE(ia);
>   }
> +
> +
> +/*
> + * Called at the very begin of the draw call with a new instance
> + * Used to reset state that should persist between primitive restart.
> + */
> +void
> +draw_prim_assembler_new_instance(struct draw_assembler *asmblr)
> +{
> +   asmblr->primid = 0;
> +}
> diff --git a/src/gallium/auxiliary/draw/draw_prim_assembler.h b/src/gallium/auxiliary/draw/draw_prim_assembler.h
> index 5ba715b..5ee7317 100644
> --- a/src/gallium/auxiliary/draw/draw_prim_assembler.h
> +++ b/src/gallium/auxiliary/draw/draw_prim_assembler.h
> @@ -70,5 +70,8 @@ draw_prim_assembler_run(struct draw_context *draw,
>   void
>   draw_prim_assembler_prepare_outputs(struct draw_assembler *ia);
>
> +void
> +draw_prim_assembler_new_instance(struct draw_assembler *ia);
> +
>
>   #endif
>

Looks good to me.

Reviewed-by: Jose Fonseca <jfonseca at vmware.com>


More information about the mesa-dev mailing list