return cmd_size;
}
+struct marshal_cmd_DrawArraysInstancedBaseInstanceDrawID
+{
+ struct marshal_cmd_base cmd_base;
+ GLenum mode;
+ GLint first;
+ GLsizei count;
+ GLsizei instance_count;
+ GLuint baseinstance;
+ GLuint drawid;
+};
+
+uint32_t
+_mesa_unmarshal_DrawArraysInstancedBaseInstanceDrawID(struct gl_context *ctx,
+ const struct marshal_cmd_DrawArraysInstancedBaseInstanceDrawID *cmd)
+{
+ const GLenum mode = cmd->mode;
+ const GLint first = cmd->first;
+ const GLsizei count = cmd->count;
+ const GLsizei instance_count = cmd->instance_count;
+ const GLuint baseinstance = cmd->baseinstance;
+
+ ctx->DrawID = cmd->drawid;
+ CALL_DrawArraysInstancedBaseInstance(ctx->CurrentServerDispatch,
+ (mode, first, count, instance_count,
+ baseinstance));
+ ctx->DrawID = 0;
+
+ const unsigned cmd_size = align(sizeof(*cmd), 8) / 8;
+ assert(cmd_size == cmd->cmd_base.cmd_size);
+ return cmd_size;
+}
+
/* DrawArraysInstancedBaseInstance with user buffers. */
struct marshal_cmd_DrawArraysUserBuf
{
GLsizei count;
GLsizei instance_count;
GLuint baseinstance;
+ GLuint drawid;
GLuint user_buffer_mask;
};
const GLsizei instance_count = cmd->instance_count;
const GLuint baseinstance = cmd->baseinstance;
+ ctx->DrawID = cmd->drawid;
CALL_DrawArraysInstancedBaseInstance(ctx->CurrentServerDispatch,
(mode, first, count, instance_count,
baseinstance));
+ ctx->DrawID = 0;
/* Restore states. */
if (user_buffer_mask) {
}
static ALWAYS_INLINE void
-draw_arrays(GLenum mode, GLint first, GLsizei count, GLsizei instance_count,
- GLuint baseinstance, bool compiled_into_dlist)
+draw_arrays(GLuint drawid, GLenum mode, GLint first, GLsizei count,
+ GLsizei instance_count, GLuint baseinstance,
+ bool compiled_into_dlist)
{
GET_CURRENT_CONTEXT(ctx);
*/
if (!user_buffer_mask || count <= 0 || instance_count <= 0 ||
ctx->GLThread.draw_always_async) {
- if (instance_count == 1 && baseinstance == 0) {
+ if (instance_count == 1 && baseinstance == 0 && drawid == 0) {
int cmd_size = sizeof(struct marshal_cmd_DrawArrays);
struct marshal_cmd_DrawArrays *cmd =
_mesa_glthread_allocate_command(ctx, DISPATCH_CMD_DrawArrays, cmd_size);
cmd->mode = mode;
cmd->first = first;
cmd->count = count;
- } else {
+ } else if (drawid == 0) {
int cmd_size = sizeof(struct marshal_cmd_DrawArraysInstancedBaseInstance);
struct marshal_cmd_DrawArraysInstancedBaseInstance *cmd =
_mesa_glthread_allocate_command(ctx, DISPATCH_CMD_DrawArraysInstancedBaseInstance, cmd_size);
cmd->count = count;
cmd->instance_count = instance_count;
cmd->baseinstance = baseinstance;
+ } else {
+ int cmd_size = sizeof(struct marshal_cmd_DrawArraysInstancedBaseInstanceDrawID);
+ struct marshal_cmd_DrawArraysInstancedBaseInstanceDrawID *cmd =
+ _mesa_glthread_allocate_command(ctx, DISPATCH_CMD_DrawArraysInstancedBaseInstanceDrawID, cmd_size);
+
+ cmd->mode = mode;
+ cmd->first = first;
+ cmd->count = count;
+ cmd->instance_count = instance_count;
+ cmd->baseinstance = baseinstance;
+ cmd->drawid = drawid;
}
return;
}
cmd->count = count;
cmd->instance_count = instance_count;
cmd->baseinstance = baseinstance;
+ cmd->drawid = drawid;
cmd->user_buffer_mask = user_buffer_mask;
if (user_buffer_mask)
return cmd_size;
}
+struct marshal_cmd_DrawElementsInstancedBaseVertexBaseInstanceDrawID
+{
+ struct marshal_cmd_base cmd_base;
+ GLenum16 mode;
+ GLenum16 type;
+ GLsizei count;
+ GLsizei instance_count;
+ GLint basevertex;
+ GLuint baseinstance;
+ GLuint drawid;
+ const GLvoid *indices;
+};
+
+uint32_t
+_mesa_unmarshal_DrawElementsInstancedBaseVertexBaseInstanceDrawID(struct gl_context *ctx,
+ const struct marshal_cmd_DrawElementsInstancedBaseVertexBaseInstanceDrawID *cmd)
+{
+ 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;
+
+ ctx->DrawID = cmd->drawid;
+ CALL_DrawElementsInstancedBaseVertexBaseInstance(ctx->CurrentServerDispatch,
+ (mode, count, type, indices,
+ instance_count, basevertex,
+ baseinstance));
+ ctx->DrawID = 0;
+
+ const unsigned cmd_size = align(sizeof(*cmd), 8) / 8;
+ assert(cmd_size == cmd->cmd_base.cmd_size);
+ return cmd_size;
+}
+
struct marshal_cmd_DrawElementsUserBuf
{
struct marshal_cmd_base cmd_base;
GLsizei instance_count;
GLint basevertex;
GLuint baseinstance;
+ GLuint drawid;
GLuint user_buffer_mask;
const GLvoid *indices;
struct gl_buffer_object *index_buffer;
const GLuint baseinstance = cmd->baseinstance;
struct gl_buffer_object *index_buffer = cmd->index_buffer;
+ ctx->DrawID = cmd->drawid;
CALL_DrawElementsUserBuf(ctx->CurrentServerDispatch,
((GLintptr)index_buffer, mode, count, type,
indices, instance_count, basevertex,
baseinstance));
+ ctx->DrawID = 0;
_mesa_reference_buffer_object(ctx, &index_buffer, NULL);
/* Restore states. */
}
static void
-draw_elements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices,
- GLsizei instance_count, GLint basevertex, GLuint baseinstance,
- bool index_bounds_valid, GLuint min_index, GLuint max_index,
- bool compiled_into_dlist)
+draw_elements(GLuint drawid, GLenum mode, GLsizei count, GLenum type,
+ const GLvoid *indices, GLsizei instance_count, GLint basevertex,
+ GLuint baseinstance, bool index_bounds_valid, GLuint min_index,
+ GLuint max_index, bool compiled_into_dlist)
{
GET_CURRENT_CONTEXT(ctx);
if (ctx->GLThread.draw_always_async || count <= 0 || instance_count <= 0 ||
!is_index_type_valid(type) ||
(!user_buffer_mask && !has_user_indices)) {
- if (instance_count == 1 && baseinstance == 0) {
+ if (instance_count == 1 && baseinstance == 0 && drawid == 0) {
int cmd_size = sizeof(struct marshal_cmd_DrawElementsBaseVertex);
struct marshal_cmd_DrawElementsBaseVertex *cmd =
_mesa_glthread_allocate_command(ctx, DISPATCH_CMD_DrawElementsBaseVertex, cmd_size);
cmd->indices = indices;
cmd->basevertex = basevertex;
} else {
- if (basevertex == 0 && baseinstance == 0) {
+ if (basevertex == 0 && baseinstance == 0 && drawid == 0) {
int cmd_size = sizeof(struct marshal_cmd_DrawElementsInstanced);
struct marshal_cmd_DrawElementsInstanced *cmd =
_mesa_glthread_allocate_command(ctx, DISPATCH_CMD_DrawElementsInstanced, cmd_size);
cmd->count = count;
cmd->instance_count = instance_count;
cmd->indices = indices;
- } else {
+ } else if (drawid == 0) {
int cmd_size = sizeof(struct marshal_cmd_DrawElementsInstancedBaseVertexBaseInstance);
struct marshal_cmd_DrawElementsInstancedBaseVertexBaseInstance *cmd =
_mesa_glthread_allocate_command(ctx, DISPATCH_CMD_DrawElementsInstancedBaseVertexBaseInstance, cmd_size);
cmd->basevertex = basevertex;
cmd->baseinstance = baseinstance;
cmd->indices = indices;
+ } else {
+ int cmd_size = sizeof(struct marshal_cmd_DrawElementsInstancedBaseVertexBaseInstanceDrawID);
+ struct marshal_cmd_DrawElementsInstancedBaseVertexBaseInstanceDrawID *cmd =
+ _mesa_glthread_allocate_command(ctx, DISPATCH_CMD_DrawElementsInstancedBaseVertexBaseInstanceDrawID, cmd_size);
+
+ cmd->mode = MIN2(mode, 0xffff);
+ cmd->type = MIN2(type, 0xffff);
+ cmd->count = count;
+ cmd->instance_count = instance_count;
+ cmd->basevertex = basevertex;
+ cmd->baseinstance = baseinstance;
+ cmd->drawid = drawid;
+ cmd->indices = indices;
}
}
return;
cmd->baseinstance = baseinstance;
cmd->user_buffer_mask = user_buffer_mask;
cmd->index_buffer = index_buffer;
+ cmd->drawid = drawid;
if (user_buffer_mask)
memcpy(cmd + 1, buffers, buffers_size);
void GLAPIENTRY
_mesa_marshal_DrawArrays(GLenum mode, GLint first, GLsizei count)
{
- draw_arrays(mode, first, count, 1, 0, true);
+ draw_arrays(0, mode, first, count, 1, 0, true);
}
void GLAPIENTRY
_mesa_marshal_DrawArraysInstanced(GLenum mode, GLint first, GLsizei count,
GLsizei instance_count)
{
- draw_arrays(mode, first, count, instance_count, 0, false);
+ draw_arrays(0, mode, first, count, instance_count, 0, false);
}
void GLAPIENTRY
GLsizei count, GLsizei instance_count,
GLuint baseinstance)
{
- draw_arrays(mode, first, count, instance_count, baseinstance, false);
+ draw_arrays(0, mode, first, count, instance_count, baseinstance, false);
}
void GLAPIENTRY
_mesa_marshal_DrawElements(GLenum mode, GLsizei count, GLenum type,
const GLvoid *indices)
{
- draw_elements(mode, count, type, indices, 1, 0, 0, false, 0, 0, true);
+ draw_elements(0, mode, count, type, indices, 1, 0, 0, false, 0, 0, true);
}
void GLAPIENTRY
GLsizei count, GLenum type,
const GLvoid *indices)
{
- draw_elements(mode, count, type, indices, 1, 0, 0, true, start, end, true);
+ draw_elements(0, mode, count, type, indices, 1, 0, 0, true, start, end, true);
}
void GLAPIENTRY
_mesa_marshal_DrawElementsInstanced(GLenum mode, GLsizei count, GLenum type,
const GLvoid *indices, GLsizei instance_count)
{
- draw_elements(mode, count, type, indices, instance_count, 0, 0, false, 0, 0, false);
+ draw_elements(0, mode, count, type, indices, instance_count, 0, 0, false, 0, 0, false);
}
void GLAPIENTRY
_mesa_marshal_DrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type,
const GLvoid *indices, GLint basevertex)
{
- draw_elements(mode, count, type, indices, 1, basevertex, 0, false, 0, 0, true);
+ draw_elements(0, mode, count, type, indices, 1, basevertex, 0, false, 0, 0, true);
}
void GLAPIENTRY
GLsizei count, GLenum type,
const GLvoid *indices, GLint basevertex)
{
- draw_elements(mode, count, type, indices, 1, basevertex, 0, true, start, end, true);
+ draw_elements(0, mode, count, type, indices, 1, basevertex, 0, true, start, end, true);
}
void GLAPIENTRY
GLenum type, const GLvoid *indices,
GLsizei instance_count, GLint basevertex)
{
- draw_elements(mode, count, type, indices, instance_count, basevertex, 0, false, 0, 0, false);
+ draw_elements(0, mode, count, type, indices, instance_count, basevertex, 0, false, 0, 0, false);
}
void GLAPIENTRY
GLenum type, const GLvoid *indices,
GLsizei instance_count, GLuint baseinstance)
{
- draw_elements(mode, count, type, indices, instance_count, 0, baseinstance, false, 0, 0, false);
+ draw_elements(0, mode, count, type, indices, instance_count, 0, baseinstance, false, 0, 0, false);
}
void GLAPIENTRY
GLsizei instance_count, GLint basevertex,
GLuint baseinstance)
{
- draw_elements(mode, count, type, indices, instance_count, basevertex, baseinstance, false, 0, 0, false);
+ draw_elements(0, mode, count, type, indices, instance_count, basevertex, baseinstance, false, 0, 0, false);
}
void GLAPIENTRY
}
void GLAPIENTRY
+_mesa_marshal_DrawArraysInstancedBaseInstanceDrawID(void)
+{
+ unreachable("should never end up here");
+}
+
+void GLAPIENTRY
+_mesa_marshal_DrawElementsInstancedBaseVertexBaseInstanceDrawID(void)
+{
+ unreachable("should never end up here");
+}
+
+void GLAPIENTRY
_mesa_DrawArraysUserBuf(void)
{
unreachable("should never end up here");
{
unreachable("should never end up here");
}
+
+void GLAPIENTRY
+_mesa_DrawArraysInstancedBaseInstanceDrawID(void)
+{
+ unreachable("should never end up here");
+}
+
+void GLAPIENTRY
+_mesa_DrawElementsInstancedBaseVertexBaseInstanceDrawID(void)
+{
+ unreachable("should never end up here");
+}