[Mesa-dev] [PATCH] vbo: Use alloca for _vbo_draw_indirect.
Marek Olšák
maraeo at gmail.com
Wed Mar 28 22:45:16 UTC 2018
Yes, it looks good.
Marek
On Wed, Mar 28, 2018 at 6:35 AM, <Mathias.Froehlich at gmx.net> wrote:
> From: Mathias Fröhlich <mathias.froehlich at web.de>
>
>
> Marek,
>
> you mean with the below patch as the 9-th change in the series?
> I would like to keep that change seprarate from #3 since patch #3
> just moves the already existing impelentation to the driver_functions
> level using the exactly identical implementation except calling into
> struct driver_functions instead of the vbo module draw function.
>
> Also I do not want to call just blindly into alloca with possibly
> large counts. So, the implementation uses an upper bound when to use
> malloc instead of alloca.
>
> Ok, with that?
>
> best
>
> Mathias
>
>
>
> Avoid using malloc in the draw path of mesa.
> Since the draw_count is a user api input, fall back to malloc if
> the amount of consumed stack space may get too high.
>
> Signed-off-by: Mathias Fröhlich <Mathias.Froehlich at web.de>
> ---
> src/mesa/vbo/vbo_context.c | 70 ++++++++++++++++++++++++++++++
> +---------------
> 1 file changed, 47 insertions(+), 23 deletions(-)
>
> diff --git a/src/mesa/vbo/vbo_context.c b/src/mesa/vbo/vbo_context.c
> index b8c28ceffb..06b8f820ee 100644
> --- a/src/mesa/vbo/vbo_context.c
> +++ b/src/mesa/vbo/vbo_context.c
> @@ -233,25 +233,17 @@ _vbo_DestroyContext(struct gl_context *ctx)
> }
>
>
> -void
> -_vbo_draw_indirect(struct gl_context *ctx, GLuint mode,
> - struct gl_buffer_object *indirect_data,
> - GLsizeiptr indirect_offset, unsigned draw_count,
> - unsigned stride,
> - struct gl_buffer_object
> *indirect_draw_count_buffer,
> - GLsizeiptr indirect_draw_count_offset,
> - const struct _mesa_index_buffer *ib)
> +static void
> +draw_indirect(struct gl_context *ctx, GLuint mode,
> + struct gl_buffer_object *indirect_data,
> + GLsizeiptr indirect_offset, unsigned draw_count,
> + unsigned stride,
> + struct gl_buffer_object *indirect_draw_count_buffer,
> + GLsizeiptr indirect_draw_count_offset,
> + const struct _mesa_index_buffer *ib,
> + struct _mesa_prim *space)
> {
> - struct _mesa_prim *prim;
> -
> - prim = calloc(draw_count, sizeof(*prim));
> - if (prim == NULL) {
> - _mesa_error(ctx, GL_OUT_OF_MEMORY, "gl%sDraw%sIndirect%s",
> - (draw_count > 1) ? "Multi" : "",
> - ib ? "Elements" : "Arrays",
> - indirect_data ? "CountARB" : "");
> - return;
> - }
> + struct _mesa_prim *prim = space;
>
> prim[0].begin = 1;
> prim[draw_count - 1].end = 1;
> @@ -266,10 +258,42 @@ _vbo_draw_indirect(struct gl_context *ctx, GLuint
> mode,
> /* This should always be true at this time */
> assert(indirect_data == ctx->DrawIndirectBuffer);
>
> - ctx->Driver.Draw(ctx, prim, draw_count,
> - ib, false, 0, ~0,
> - NULL, 0,
> - indirect_data);
> + ctx->Driver.Draw(ctx, prim, draw_count, ib, false, 0u, ~0u,
> + NULL, 0, indirect_data);
> +}
> +
>
> - free(prim);
> +void
> +_vbo_draw_indirect(struct gl_context *ctx, GLuint mode,
> + struct gl_buffer_object *indirect_data,
> + GLsizeiptr indirect_offset, unsigned draw_count,
> + unsigned stride,
> + struct gl_buffer_object *indirect_draw_count_buffer,
> + GLsizeiptr indirect_draw_count_offset,
> + const struct _mesa_index_buffer *ib)
> +{
> + /* Use alloca for the prim space if we are somehow in bounds. */
> + if (draw_count*sizeof(struct _mesa_prim) < 1024) {
> + struct _mesa_prim *space = alloca(draw_count*sizeof(struct
> _mesa_prim));
> + memset(space, 0, draw_count*sizeof(struct _mesa_prim));
> +
> + draw_indirect(ctx, mode, indirect_data, indirect_offset, draw_count,
> + stride, indirect_draw_count_buffer,
> + indirect_draw_count_offset, ib, space);
> + } else {
> + struct _mesa_prim *space = calloc(draw_count, sizeof(struct
> _mesa_prim));
> + if (space == NULL) {
> + _mesa_error(ctx, GL_OUT_OF_MEMORY, "gl%sDraw%sIndirect%s",
> + (draw_count > 1) ? "Multi" : "",
> + ib ? "Elements" : "Arrays",
> + indirect_data ? "CountARB" : "");
> + return;
> + }
> +
> + draw_indirect(ctx, mode, indirect_data, indirect_offset, draw_count,
> + stride, indirect_draw_count_buffer,
> + indirect_draw_count_offset, ib, space);
> +
> + free(space);
> + }
> }
> --
> 2.14.3
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20180328/607d58bc/attachment-0001.html>
More information about the mesa-dev
mailing list