From 4925fb97f65f20fd52c94a080a68108c25a4095f Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Thu, 28 May 2020 16:21:39 -0400 Subject: [PATCH] glthread: don't upload for glDraw inside a display list and always sync MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Let the vbo module handle it, not glthread. This handles functions set in vbo_initialize_save_dispatch. Fixes: 2840bc3065b ("glthread: upload non-VBO vertices and indices for non-Indirect non-IBM draws") Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/3001 Reviewed-by: Pierre-Eric Pelloux-Prayer Tested-by: Dieter Nützel Part-of: --- src/mapi/glapi/gen/gl_API.xml | 6 ++-- src/mesa/main/glthread.h | 3 ++ src/mesa/main/glthread_draw.c | 68 ++++++++++++++++++++++++++--------- 3 files changed, 58 insertions(+), 19 deletions(-) diff --git a/src/mapi/glapi/gen/gl_API.xml b/src/mapi/glapi/gen/gl_API.xml index 2c97c6dcedf..b3511665280 100644 --- a/src/mapi/glapi/gen/gl_API.xml +++ b/src/mapi/glapi/gen/gl_API.xml @@ -1109,13 +1109,15 @@ - + - + diff --git a/src/mesa/main/glthread.h b/src/mesa/main/glthread.h index d09abb8e28f..34a5443a6da 100644 --- a/src/mesa/main/glthread.h +++ b/src/mesa/main/glthread.h @@ -123,6 +123,9 @@ struct glthread_state /** Whether GLThread is enabled. */ bool enabled; + /** Whether GLThread is inside a display list generation. */ + bool inside_dlist; + /** The ring of batches in memory. */ struct glthread_batch batches[MARSHAL_MAX_BATCHES]; diff --git a/src/mesa/main/glthread_draw.c b/src/mesa/main/glthread_draw.c index 5607ced4125..7c41496e4e0 100644 --- a/src/mesa/main/glthread_draw.c +++ b/src/mesa/main/glthread_draw.c @@ -226,16 +226,22 @@ draw_arrays_async(struct gl_context *ctx, GLenum mode, GLint first, 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 @@ -343,6 +349,9 @@ _mesa_marshal_MultiDrawArrays(GLenum mode, const GLint *first, 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); @@ -496,7 +505,8 @@ draw_elements_async(struct gl_context *ctx, GLenum mode, GLsizei count, 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); @@ -504,6 +514,9 @@ draw_elements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, 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 @@ -574,7 +587,18 @@ draw_elements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, 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)); @@ -703,6 +727,9 @@ _mesa_marshal_MultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, 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 || @@ -841,22 +868,29 @@ sync: 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 @@ -864,21 +898,21 @@ _mesa_marshal_DrawRangeElements(GLenum mode, GLuint start, GLuint end, 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 @@ -886,7 +920,7 @@ _mesa_marshal_DrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, 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 @@ -894,7 +928,7 @@ _mesa_marshal_DrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, 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 @@ -902,7 +936,7 @@ _mesa_marshal_DrawElementsInstancedBaseInstance(GLenum mode, GLsizei count, 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 @@ -911,7 +945,7 @@ _mesa_marshal_DrawElementsInstancedBaseVertexBaseInstance(GLenum mode, GLsizei c 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 -- 2.30.2