summaryrefslogtreecommitdiff
path: root/src/mesa
diff options
context:
space:
mode:
authorMarek Olšák <marek.olsak@amd.com>2022-12-12 22:30:51 -0500
committerMarek Olšák <marek.olsak@amd.com>2023-01-20 21:34:09 -0500
commitfc93c69701fdef763e52e4c6bb3829d525871cf0 (patch)
tree0e69a404cee5ec77cd38a51e6077b1503652701a /src/mesa
parent68a926a15b7b3724a29c050b8595177a32fc67a1 (diff)
glthread: execute glMultiDrawArrays(draw_count < 0) asynchronously
Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20824>
Diffstat (limited to 'src/mesa')
-rw-r--r--src/mesa/main/glthread_draw.c17
1 files changed, 10 insertions, 7 deletions
diff --git a/src/mesa/main/glthread_draw.c b/src/mesa/main/glthread_draw.c
index c17a1c41860..f467f4a4fa3 100644
--- a/src/mesa/main/glthread_draw.c
+++ b/src/mesa/main/glthread_draw.c
@@ -519,8 +519,9 @@ multi_draw_arrays_async(struct gl_context *ctx, GLenum mode,
GLsizei draw_count, unsigned user_buffer_mask,
const struct glthread_attrib_binding *buffers)
{
- int first_size = sizeof(GLint) * draw_count;
- int count_size = sizeof(GLsizei) * draw_count;
+ int real_draw_count = MAX2(draw_count, 0);
+ int first_size = sizeof(GLint) * real_draw_count;
+ int count_size = sizeof(GLsizei) * real_draw_count;
int buffers_size = util_bitcount(user_buffer_mask) * sizeof(buffers[0]);
int cmd_size = sizeof(struct marshal_cmd_MultiDrawArraysUserBuf) +
first_size + count_size + buffers_size;
@@ -557,20 +558,22 @@ _mesa_marshal_MultiDrawArrays(GLenum mode, const GLint *first,
GET_CURRENT_CONTEXT(ctx);
struct glthread_vao *vao = ctx->GLThread.CurrentVAO;
- unsigned user_buffer_mask = vao->UserPointerMask & vao->BufferEnabled;
+ unsigned user_buffer_mask =
+ draw_count <= 0 ? 0 : vao->UserPointerMask & vao->BufferEnabled;
if (ctx->GLThread.ListMode)
goto sync;
- if (draw_count >= 0 &&
- (ctx->API == API_OPENGL_CORE || !user_buffer_mask) &&
+ if ((ctx->API == API_OPENGL_CORE || !user_buffer_mask) &&
multi_draw_arrays_async(ctx, mode, first, count, draw_count, 0, NULL)) {
return;
}
- /* If the draw count is too high or negative, the queue can't be used. */
+ assert(draw_count > 0);
+
+ /* If the draw count is too high, the queue can't be used. */
if (!ctx->GLThread.SupportsBufferUploads ||
- draw_count < 0 || draw_count > MARSHAL_MAX_CMD_SIZE / 16)
+ draw_count > MARSHAL_MAX_CMD_SIZE / 16)
goto sync;
unsigned min_index = ~0;