Module: Mesa Branch: main Commit: e40f5a7cb3212f1d8b5faa7d9d0c40648625d2f7 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=e40f5a7cb3212f1d8b5faa7d9d0c40648625d2f7
Author: Marek Olšák <[email protected]> Date: Sun Dec 10 16:14:06 2023 -0500 mesa: micro-improvements in draw.c - use ctx->pipe instead of ctx->st->pipe - call st_prepare_draw outside the loop - don't call DrawGallium is draw.count == 0 Reviewed-by: Pierre-Eric Pelloux-Prayer <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26786> --- src/mesa/main/draw.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/mesa/main/draw.c b/src/mesa/main/draw.c index d1c902e164f..884a6aaee05 100644 --- a/src/mesa/main/draw.c +++ b/src/mesa/main/draw.c @@ -1661,7 +1661,7 @@ _mesa_validated_drawrangeelements(struct gl_context *ctx, } else { draw.start = (uintptr_t)indices >> index_size_shift; - if (ctx->st->pipe->draw_vbo == tc_draw_vbo) { + if (ctx->pipe->draw_vbo == tc_draw_vbo) { /* Fast path for u_threaded_context to eliminate atomics. */ info.index.resource = _mesa_get_bufferobj_reference(ctx, index_bo); info.take_index_buffer_ownership = true; @@ -2016,7 +2016,7 @@ _mesa_validated_multidrawelements(struct gl_context *ctx, if (info.has_user_indices) { info.index.user = (void*)min_index_ptr; } else { - if (ctx->st->pipe->draw_vbo == tc_draw_vbo) { + if (ctx->pipe->draw_vbo == tc_draw_vbo) { /* Fast path for u_threaded_context to eliminate atomics. */ info.index.resource = _mesa_get_bufferobj_reference(ctx, index_bo); info.take_index_buffer_ownership = true; @@ -2069,6 +2069,8 @@ _mesa_validated_multidrawelements(struct gl_context *ctx, assert(info.has_user_indices); info.increment_draw_id = false; + st_prepare_draw(ctx, ST_PIPELINE_RENDER_STATE_MASK); + for (int i = 0; i < primcount; i++) { struct pipe_draw_start_count_bias draw; @@ -2082,8 +2084,7 @@ _mesa_validated_multidrawelements(struct gl_context *ctx, draw.index_bias = basevertex ? basevertex[i] : 0; draw.count = count[i]; - st_prepare_draw(ctx, ST_PIPELINE_RENDER_STATE_MASK); - if (!validate_index_bounds(ctx, &info, &draw, 1)) + if (!draw.count || !validate_index_bounds(ctx, &info, &draw, 1)) continue; ctx->Driver.DrawGallium(ctx, &info, i, &draw, 1); @@ -2399,6 +2400,8 @@ _mesa_MultiDrawArraysIndirect(GLenum mode, const GLvoid *indirect, info.index_bias_varies = false; /* Packed section end. */ + st_prepare_draw(ctx, ST_PIPELINE_RENDER_STATE_MASK); + const uint8_t *ptr = (const uint8_t *) indirect; for (unsigned i = 0; i < primcount; i++) { DrawArraysIndirectCommand *cmd = (DrawArraysIndirectCommand *) ptr; @@ -2410,7 +2413,8 @@ _mesa_MultiDrawArraysIndirect(GLenum mode, const GLvoid *indirect, draw.start = cmd->first; draw.count = cmd->count; - st_prepare_draw(ctx, ST_PIPELINE_RENDER_STATE_MASK); + if (!draw.count) + continue; ctx->Driver.DrawGallium(ctx, &info, i, &draw, 1); ptr += stride; @@ -2494,7 +2498,7 @@ _mesa_MultiDrawElementsIndirect(GLenum mode, GLenum type, struct gl_buffer_object *index_bo = ctx->Array.VAO->IndexBufferObj; - if (ctx->st->pipe->draw_vbo == tc_draw_vbo) { + if (ctx->pipe->draw_vbo == tc_draw_vbo) { /* Fast path for u_threaded_context to eliminate atomics. */ info.index.resource = _mesa_get_bufferobj_reference(ctx, index_bo); info.take_index_buffer_ownership = true; @@ -2511,6 +2515,8 @@ _mesa_MultiDrawElementsIndirect(GLenum mode, GLenum type, if (!info.index.resource) return; + st_prepare_draw(ctx, ST_PIPELINE_RENDER_STATE_MASK); + const uint8_t *ptr = (const uint8_t *) indirect; for (unsigned i = 0; i < primcount; i++) { DrawElementsIndirectCommand *cmd = (DrawElementsIndirectCommand*)ptr; @@ -2523,8 +2529,7 @@ _mesa_MultiDrawElementsIndirect(GLenum mode, GLenum type, draw.count = cmd->count; draw.index_bias = cmd->baseVertex; - st_prepare_draw(ctx, ST_PIPELINE_RENDER_STATE_MASK); - if (!validate_index_bounds(ctx, &info, &draw, 1)) + if (!draw.count || !validate_index_bounds(ctx, &info, &draw, 1)) continue; ctx->Driver.DrawGallium(ctx, &info, i, &draw, 1);
