memcpy(cmd + 1, attribs, attribs_size);
}
-void GLAPIENTRY
-_mesa_marshal_DrawArraysInstancedBaseInstance(GLenum mode, GLint first,
- GLsizei count, GLsizei instance_count,
- GLuint baseinstance)
+static ALWAYS_INLINE void
+draw_arrays(GLenum mode, GLint first, GLsizei count, GLsizei instance_count,
+ GLuint baseinstance, bool compiled_into_dlist)
{
GET_CURRENT_CONTEXT(ctx);
struct glthread_vao *vao = ctx->GLThread.CurrentVAO;
unsigned non_vbo_attrib_mask = vao->UserPointerMask & vao->Enabled;
+ if (compiled_into_dlist && ctx->GLThread.inside_dlist) {
+ _mesa_glthread_finish_before(ctx, "DrawArrays");
+ /* Use the function that's compiled into a display list. */
+ CALL_DrawArrays(ctx->CurrentServerDispatch, (mode, first, count));
+ return;
+ }
+
/* Fast path when nothing needs to be done.
*
* This is also an error path. Zero counts should still call the driver
struct glthread_vao *vao = ctx->GLThread.CurrentVAO;
unsigned non_vbo_attrib_mask = vao->UserPointerMask & vao->Enabled;
+ if (ctx->GLThread.inside_dlist)
+ goto sync;
+
if (draw_count >= 0 &&
(ctx->API == API_OPENGL_CORE || !non_vbo_attrib_mask)) {
multi_draw_arrays_async(ctx, mode, first, count, draw_count, 0, NULL);
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 index_bounds_valid, GLuint min_index, GLuint max_index,
+ bool compiled_into_dlist)
{
GET_CURRENT_CONTEXT(ctx);
unsigned non_vbo_attrib_mask = vao->UserPointerMask & vao->Enabled;
bool has_user_indices = vao->CurrentElementBufferName == 0;
+ if (compiled_into_dlist && ctx->GLThread.inside_dlist)
+ goto sync;
+
/* Fast path when nothing needs to be done.
*
* This is also an error path. Zero counts should still call the driver
sync:
_mesa_glthread_finish_before(ctx, "DrawElements");
- if (index_bounds_valid && instance_count == 1 && baseinstance == 0) {
+ if (compiled_into_dlist && ctx->GLThread.inside_dlist) {
+ /* Only use the ones that are compiled into display lists. */
+ if (basevertex) {
+ CALL_DrawElementsBaseVertex(ctx->CurrentServerDispatch,
+ (mode, count, type, indices, basevertex));
+ } else if (index_bounds_valid) {
+ CALL_DrawRangeElements(ctx->CurrentServerDispatch,
+ (mode, min_index, max_index, count, type, indices));
+ } else {
+ CALL_DrawElements(ctx->CurrentServerDispatch, (mode, count, type, indices));
+ }
+ } else if (index_bounds_valid && instance_count == 1 && baseinstance == 0) {
CALL_DrawRangeElementsBaseVertex(ctx->CurrentServerDispatch,
(mode, min_index, max_index, count,
type, indices, basevertex));
unsigned non_vbo_attrib_mask = vao->UserPointerMask & vao->Enabled;
bool has_user_indices = vao->CurrentElementBufferName == 0;
+ if (ctx->GLThread.inside_dlist)
+ goto sync;
+
/* Fast path when nothing needs to be done. */
if (draw_count >= 0 &&
(ctx->API == API_OPENGL_CORE ||
void GLAPIENTRY
_mesa_marshal_DrawArrays(GLenum mode, GLint first, GLsizei count)
{
- _mesa_marshal_DrawArraysInstancedBaseInstance(mode, first, count, 1, 0);
+ draw_arrays(mode, first, count, 1, 0, true);
}
void GLAPIENTRY
_mesa_marshal_DrawArraysInstancedARB(GLenum mode, GLint first, GLsizei count,
GLsizei instance_count)
{
- _mesa_marshal_DrawArraysInstancedBaseInstance(mode, first, count,
- instance_count, 0);
+ draw_arrays(mode, first, count, instance_count, 0, false);
+}
+
+void GLAPIENTRY
+_mesa_marshal_DrawArraysInstancedBaseInstance(GLenum mode, GLint first,
+ GLsizei count, GLsizei instance_count,
+ GLuint baseinstance)
+{
+ draw_arrays(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);
+ draw_elements(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);
+ draw_elements(mode, count, type, indices, 1, 0, 0, true, start, end, true);
}
void GLAPIENTRY
_mesa_marshal_DrawElementsInstancedARB(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);
+ draw_elements(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);
+ draw_elements(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);
+ draw_elements(mode, count, type, indices, 1, basevertex, 0, true, start, end, false);
}
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);
+ draw_elements(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);
+ draw_elements(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);
+ draw_elements(mode, count, type, indices, instance_count, basevertex, baseinstance, false, 0, 0, false);
}
void GLAPIENTRY