+/*
+ * Function to be put into dd_function_table::DrawIndirect as fallback.
+ * Calls into dd_function_table::Draw past adapting call arguments.
+ * See dd_function_table::DrawIndirect for call argument documentation.
+ */
+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);
+ }