diff --git a/src/mapi/glapi/gen/gl_API.xml b/src/mapi/glapi/gen/gl_API.xml
index bc59ddc759a..874ec8dd552 100644
--- a/src/mapi/glapi/gen/gl_API.xml
+++ b/src/mapi/glapi/gen/gl_API.xml
@@ -12936,14 +12936,7 @@
-
-
-
-
-
-
-
-
+
diff --git a/src/mesa/main/draw.c b/src/mesa/main/draw.c
index 8519bd55244..0004cff184d 100644
--- a/src/mesa/main/draw.c
+++ b/src/mesa/main/draw.c
@@ -42,6 +42,7 @@
#include "transformfeedback.h"
#include "pipe/p_state.h"
#include "api_exec_decl.h"
+#include "glthread_marshal.h"
#include "state_tracker/st_context.h"
#include "state_tracker/st_draw.h"
@@ -1983,10 +1984,7 @@ _mesa_DrawElementsInstancedBaseVertexBaseInstance(GLenum mode,
* GL_ELEMENT_ARRAY_BUFFER if indexBuf != NULL.
*/
void GLAPIENTRY
-_mesa_DrawElementsUserBuf(GLintptr indexBuf, GLenum mode,
- GLsizei count, GLenum type,
- const GLvoid *indices, GLsizei numInstances,
- GLint basevertex, GLuint baseInstance)
+_mesa_DrawElementsUserBuf(const GLvoid *ptr)
{
GET_CURRENT_CONTEXT(ctx);
FLUSH_FOR_DRAW(ctx);
@@ -1996,19 +1994,31 @@ _mesa_DrawElementsUserBuf(GLintptr indexBuf, GLenum mode,
if (ctx->NewState)
_mesa_update_state(ctx);
+ const struct marshal_cmd_DrawElementsUserBuf *cmd =
+ (const struct marshal_cmd_DrawElementsUserBuf *)ptr;
+ const GLenum mode = cmd->mode;
+ const GLsizei count = cmd->count;
+ const GLenum type = cmd->type;
+ const GLsizei instance_count = cmd->instance_count;
+
if (!_mesa_is_no_error_enabled(ctx) &&
!_mesa_validate_DrawElementsInstanced(ctx, mode, count, type,
- numInstances))
+ instance_count))
return;
struct gl_buffer_object *index_bo =
- indexBuf ? (struct gl_buffer_object*)indexBuf :
- ctx->Array.VAO->IndexBufferObj;
+ cmd->index_buffer ? cmd->index_buffer : ctx->Array.VAO->IndexBufferObj;
+ const GLvoid *indices = cmd->indices;
+ const GLint basevertex = cmd->basevertex;
+ const GLuint baseinstance = cmd->baseinstance;
+
+ ctx->DrawID = cmd->drawid;
_mesa_validated_drawrangeelements(ctx, index_bo,
mode, false, 0, ~0,
count, type, indices, basevertex,
- numInstances, baseInstance);
+ instance_count, baseinstance);
+ ctx->DrawID = 0;
}
diff --git a/src/mesa/main/glthread_draw.c b/src/mesa/main/glthread_draw.c
index 746aa6860d9..e362b428745 100644
--- a/src/mesa/main/glthread_draw.c
+++ b/src/mesa/main/glthread_draw.c
@@ -707,21 +707,6 @@ _mesa_unmarshal_DrawElementsInstancedBaseVertexBaseInstanceDrawID(struct gl_cont
return cmd_size;
}
-struct marshal_cmd_DrawElementsUserBuf
-{
- struct marshal_cmd_base cmd_base;
- GLenum16 mode;
- GLenum16 type;
- GLsizei count;
- GLsizei instance_count;
- GLint basevertex;
- GLuint baseinstance;
- GLuint drawid;
- GLuint user_buffer_mask;
- const GLvoid *indices;
- struct gl_buffer_object *index_buffer;
-};
-
uint32_t
_mesa_unmarshal_DrawElementsUserBuf(struct gl_context *ctx,
const struct marshal_cmd_DrawElementsUserBuf *restrict cmd)
@@ -735,21 +720,9 @@ _mesa_unmarshal_DrawElementsUserBuf(struct gl_context *ctx,
_mesa_InternalBindVertexBuffers(ctx, buffers, user_buffer_mask);
/* Draw. */
- const GLenum mode = cmd->mode;
- const GLsizei count = cmd->count;
- const GLenum type = cmd->type;
- const GLvoid *indices = cmd->indices;
- const GLsizei instance_count = cmd->instance_count;
- const GLint basevertex = cmd->basevertex;
- const GLuint baseinstance = cmd->baseinstance;
- struct gl_buffer_object *index_buffer = cmd->index_buffer;
+ CALL_DrawElementsUserBuf(ctx->Dispatch.Current, (cmd));
- ctx->DrawID = cmd->drawid;
- CALL_DrawElementsUserBuf(ctx->Dispatch.Current,
- ((GLintptr)index_buffer, mode, count, type,
- indices, instance_count, basevertex,
- baseinstance));
- ctx->DrawID = 0;
+ struct gl_buffer_object *index_buffer = cmd->index_buffer;
_mesa_reference_buffer_object(ctx, &index_buffer, NULL);
return cmd->cmd_base.cmd_size;
}
@@ -1803,10 +1776,7 @@ _mesa_marshal_DrawArraysUserBuf(void)
}
void GLAPIENTRY
-_mesa_marshal_DrawElementsUserBuf(GLintptr indexBuf, GLenum mode,
- GLsizei count, GLenum type,
- const GLvoid *indices, GLsizei numInstances,
- GLint basevertex, GLuint baseInstance)
+_mesa_marshal_DrawElementsUserBuf(const GLvoid *cmd)
{
unreachable("should never end up here");
}
diff --git a/src/mesa/main/glthread_marshal.h b/src/mesa/main/glthread_marshal.h
index 512800020f6..3560754d39d 100644
--- a/src/mesa/main/glthread_marshal.h
+++ b/src/mesa/main/glthread_marshal.h
@@ -55,6 +55,21 @@ typedef uint32_t (*_mesa_unmarshal_func)(struct gl_context *ctx,
const void *restrict cmd);
extern const _mesa_unmarshal_func _mesa_unmarshal_dispatch[NUM_DISPATCH_CMD];
+struct marshal_cmd_DrawElementsUserBuf
+{
+ struct marshal_cmd_base cmd_base;
+ GLenum16 mode;
+ GLenum16 type;
+ GLsizei count;
+ GLsizei instance_count;
+ GLint basevertex;
+ GLuint baseinstance;
+ GLuint drawid;
+ GLuint user_buffer_mask;
+ const GLvoid *indices;
+ struct gl_buffer_object *index_buffer;
+};
+
static inline void *
_mesa_glthread_allocate_command(struct gl_context *ctx,
uint16_t cmd_id,