[Mesa-dev] [PATCH 1/2] draw/gs: reduce the size of the gs output buffer

Roland Scheidegger sroland at vmware.com
Wed Mar 26 11:41:20 PDT 2014


Am 26.03.2014 18:37, schrieb Zack Rusin:
> We used to overallocate the output buffer sometimes running out
> of memory with applications rendering large geometries. The actual
> maximum number of vertices out is simply the maximum number of
> primitives in (number of gs invocations) multiplied by the maximum
> number of output vertices per gs input primitive (i.e. gs invocation).
> 
> Signed-off-by: Zack Rusin <zackr at vmware.com>
> ---
>  src/gallium/auxiliary/draw/draw_gs.c | 20 +++++++++++++-------
>  1 file changed, 13 insertions(+), 7 deletions(-)
> 
> diff --git a/src/gallium/auxiliary/draw/draw_gs.c b/src/gallium/auxiliary/draw/draw_gs.c
> index 97e8a90..7de5e03 100644
> --- a/src/gallium/auxiliary/draw/draw_gs.c
> +++ b/src/gallium/auxiliary/draw/draw_gs.c
> @@ -552,6 +552,10 @@ int draw_geometry_shader_run(struct draw_geometry_shader *shader,
>        u_decomposed_prims_for_vertices(shader->output_primitive,
>                                        shader->max_output_vertices)
>        * num_in_primitives;
> +   /* we allocate exactly one extra vertex per primitive to allow the GS to emit
> +    * overflown vertices into some area where they won't harm anyone */
> +   unsigned total_verts_per_buffer = shader->primitive_boundary *
> +      num_in_primitives;
>  
>     //Assume at least one primitive
>     max_out_prims = MAX2(max_out_prims, 1);
> @@ -559,23 +563,25 @@ int draw_geometry_shader_run(struct draw_geometry_shader *shader,
>  
>     output_verts->vertex_size = vertex_size;
>     output_verts->stride = output_verts->vertex_size;
> -   /* we allocate exactly one extra vertex per primitive to allow the GS to emit
> -    * overflown vertices into some area where they won't harm anyone */
>     output_verts->verts =
>        (struct vertex_header *)MALLOC(output_verts->vertex_size *
> -                                     max_out_prims *
> -                                     shader->primitive_boundary);
> +                                     total_verts_per_buffer);
> +   debug_assert(output_verts->verts);
>  
>  #if 0
>     debug_printf("%s count = %d (in prims # = %d)\n",
>                  __FUNCTION__, num_input_verts, num_in_primitives);
>     debug_printf("\tlinear = %d, prim_info->count = %d\n",
>                  input_prim->linear, input_prim->count);
> -   debug_printf("\tprim pipe = %s, shader in = %s, shader out = %s, max out = %d\n",
> +   debug_printf("\tprim pipe = %s, shader in = %s, shader out = %s\n"
>                  u_prim_name(input_prim->prim),
>                  u_prim_name(shader->input_primitive),
> -                u_prim_name(shader->output_primitive),
> -                shader->max_output_vertices);
> +                u_prim_name(shader->output_primitive));
> +   debug_printf("\tmaxv  = %d, maxp = %d, primitive_boundary = %d, "
> +                "vertex_size = %d, tverts = %d\n",
> +                shader->max_output_vertices, max_out_prims,
> +                shader->primitive_boundary, output_verts->vertex_size,
> +                total_verts_per_buffer);
>  #endif
>  
>     shader->emitted_vertices = 0;
> 

Both patches look good to me.

Roland


More information about the mesa-dev mailing list