summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarek Olšák <marek.olsak@amd.com>2020-02-12 17:16:45 -0500
committerMarge Bot <eric+marge@anholt.net>2020-02-28 00:53:45 +0000
commita1f402344314cb7e773cebb7ef5c77b3c941de13 (patch)
treecf186214ef11d097613bcfc821a4ce59f07ee86f
parente636a062f1a555f8795b3e75d6f32c5042038ab1 (diff)
mesa: optimize glMultiDrawArrays, call Draw only once (v2)
v2: use the macros Reviewed-by: Ian Romanick <ian.d.romanick@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/3990>
-rw-r--r--src/mesa/main/draw.c38
1 files changed, 22 insertions, 16 deletions
diff --git a/src/mesa/main/draw.c b/src/mesa/main/draw.c
index aa4934fdb27..a997fcb670e 100644
--- a/src/mesa/main/draw.c
+++ b/src/mesa/main/draw.c
@@ -657,24 +657,30 @@ _mesa_exec_MultiDrawArrays(GLenum mode, const GLint *first,
return;
}
- for (i = 0; i < primcount; i++) {
- if (count[i] > 0) {
- if (0)
- check_draw_arrays_data(ctx, first[i], count[i]);
-
- /* The GL_ARB_shader_draw_parameters spec adds the following after the
- * pseudo-code describing glMultiDrawArrays:
- *
- * "The index of the draw (<i> in the above pseudo-code) may be
- * read by a vertex shader as <gl_DrawIDARB>, as described in
- * Section 11.1.3.9."
- */
- _mesa_draw_arrays(ctx, mode, first[i], count[i], 1, 0, i);
+ if (skip_validated_draw(ctx))
+ return;
- if (0)
- print_draw_arrays(ctx, mode, first[i], count[i]);
- }
+ struct _mesa_prim *prim;
+
+ ALLOC_PRIMS(prim, primcount, "glMultiDrawElements");
+
+ for (i = 0; i < primcount; i++) {
+ prim[i].begin = 1;
+ prim[i].end = 1;
+ prim[i].mode = mode;
+ prim[i].draw_id = i;
+ prim[i].start = first[i];
+ prim[i].count = count[i];
+ prim[i].basevertex = 0;
}
+
+ ctx->Driver.Draw(ctx, prim, primcount, NULL, GL_FALSE, 0, 0, 1, 0,
+ NULL, 0);
+
+ if (MESA_DEBUG_FLAGS & DEBUG_ALWAYS_FLUSH)
+ _mesa_flush(ctx);
+
+ FREE_PRIMS(prim, primcount);
}