<div dir="ltr"><div>Yes, it looks good.<br><br></div>Marek<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Mar 28, 2018 at 6:35 AM,  <span dir="ltr"><<a href="mailto:Mathias.Froehlich@gmx.net" target="_blank">Mathias.Froehlich@gmx.net</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">From: Mathias Fröhlich <<a href="mailto:mathias.froehlich@web.de">mathias.froehlich@web.de</a>><br>
<br>
<br>
Marek,<br>
<br>
you mean with the below patch as the 9-th change in the series?<br>
I would like to keep that change seprarate from #3 since patch #3<br>
just moves the already existing impelentation to the driver_functions<br>
level using the exactly identical implementation except calling into<br>
struct driver_functions instead of the vbo module draw function.<br>
<br>
Also I do not want to call just blindly into alloca with possibly<br>
large counts. So, the implementation uses an upper bound when to use<br>
malloc instead of alloca.<br>
<br>
Ok, with that?<br>
<br>
best<br>
<br>
Mathias<br>
<br>
<br>
<br>
Avoid using malloc in the draw path of mesa.<br>
Since the draw_count is a user api input, fall back to malloc if<br>
the amount of consumed stack space may get too high.<br>
<br>
Signed-off-by: Mathias Fröhlich <<a href="mailto:Mathias.Froehlich@web.de">Mathias.Froehlich@web.de</a>><br>
---<br>
 src/mesa/vbo/vbo_context.c | 70 ++++++++++++++++++++++++++++++<wbr>+---------------<br>
 1 file changed, 47 insertions(+), 23 deletions(-)<br>
<br>
diff --git a/src/mesa/vbo/vbo_context.c b/src/mesa/vbo/vbo_context.c<br>
index b8c28ceffb..06b8f820ee 100644<br>
--- a/src/mesa/vbo/vbo_context.c<br>
+++ b/src/mesa/vbo/vbo_context.c<br>
@@ -233,25 +233,17 @@ _vbo_DestroyContext(struct gl_context *ctx)<br>
 }<br>
<br>
<br>
-void<br>
-_vbo_draw_indirect(struct gl_context *ctx, GLuint mode,<br>
-                        struct gl_buffer_object *indirect_data,<br>
-                        GLsizeiptr indirect_offset, unsigned draw_count,<br>
-                        unsigned stride,<br>
-                        struct gl_buffer_object *indirect_draw_count_buffer,<br>
-                        GLsizeiptr indirect_draw_count_offset,<br>
-                        const struct _mesa_index_buffer *ib)<br>
+static void<br>
+draw_indirect(struct gl_context *ctx, GLuint mode,<br>
+              struct gl_buffer_object *indirect_data,<br>
+              GLsizeiptr indirect_offset, unsigned draw_count,<br>
+              unsigned stride,<br>
+              struct gl_buffer_object *indirect_draw_count_buffer,<br>
+              GLsizeiptr indirect_draw_count_offset,<br>
+              const struct _mesa_index_buffer *ib,<br>
+              struct _mesa_prim *space)<br>
 {<br>
-   struct _mesa_prim *prim;<br>
-<br>
-   prim = calloc(draw_count, sizeof(*prim));<br>
-   if (prim == NULL) {<br>
-      _mesa_error(ctx, GL_OUT_OF_MEMORY, "gl%sDraw%sIndirect%s",<br>
-                  (draw_count > 1) ? "Multi" : "",<br>
-                  ib ? "Elements" : "Arrays",<br>
-                  indirect_data ? "CountARB" : "");<br>
-      return;<br>
-   }<br>
+   struct _mesa_prim *prim = space;<br>
<br>
    prim[0].begin = 1;<br>
    prim[draw_count - 1].end = 1;<br>
@@ -266,10 +258,42 @@ _vbo_draw_indirect(struct gl_context *ctx, GLuint mode,<br>
    /* This should always be true at this time */<br>
    assert(indirect_data == ctx->DrawIndirectBuffer);<br>
<br>
-   ctx->Driver.Draw(ctx, prim, draw_count,<br>
-                   ib, false, 0, ~0,<br>
-                   NULL, 0,<br>
-                   indirect_data);<br>
+   ctx->Driver.Draw(ctx, prim, draw_count, ib, false, 0u, ~0u,<br>
+                    NULL, 0, indirect_data);<br>
+}<br>
+<br>
<br>
-   free(prim);<br>
+void<br>
+_vbo_draw_indirect(struct gl_context *ctx, GLuint mode,<br>
+                   struct gl_buffer_object *indirect_data,<br>
+                   GLsizeiptr indirect_offset, unsigned draw_count,<br>
+                   unsigned stride,<br>
+                   struct gl_buffer_object *indirect_draw_count_buffer,<br>
+                   GLsizeiptr indirect_draw_count_offset,<br>
+                   const struct _mesa_index_buffer *ib)<br>
+{<br>
+   /* Use alloca for the prim space if we are somehow in bounds. */<br>
+   if (draw_count*sizeof(struct _mesa_prim) < 1024) {<br>
+      struct _mesa_prim *space = alloca(draw_count*sizeof(<wbr>struct _mesa_prim));<br>
+      memset(space, 0, draw_count*sizeof(struct _mesa_prim));<br>
+<br>
+      draw_indirect(ctx, mode, indirect_data, indirect_offset, draw_count,<br>
+                    stride, indirect_draw_count_buffer,<br>
+                    indirect_draw_count_offset, ib, space);<br>
+   } else {<br>
+      struct _mesa_prim *space = calloc(draw_count, sizeof(struct _mesa_prim));<br>
+      if (space == NULL) {<br>
+         _mesa_error(ctx, GL_OUT_OF_MEMORY, "gl%sDraw%sIndirect%s",<br>
+                     (draw_count > 1) ? "Multi" : "",<br>
+                     ib ? "Elements" : "Arrays",<br>
+                     indirect_data ? "CountARB" : "");<br>
+         return;<br>
+      }<br>
+<br>
+      draw_indirect(ctx, mode, indirect_data, indirect_offset, draw_count,<br>
+                    stride, indirect_draw_count_buffer,<br>
+                    indirect_draw_count_offset, ib, space);<br>
+<br>
+      free(space);<br>
+   }<br>
 }<br>
<span class="HOEnZb"><font color="#888888">--<br>
2.14.3<br>
<br>
</font></span></blockquote></div><br></div>