Module: Mesa Branch: main Commit: 4cd585ab5067def3b367afd090add1f36061dc94 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=4cd585ab5067def3b367afd090add1f36061dc94
Author: Marek Olšák <[email protected]> Date: Thu Dec 7 14:54:47 2023 -0500 mesa: call st_prepare_(indexed_)draw before Driver.DrawGallium(MultiMode) This is refactoring for future work. Also, it unifies the st_draw_feedback path with the normal path and the "indexed" version doesn't have to be called in many places. Reviewed-by: Pierre-Eric Pelloux-Prayer <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26619> --- src/mesa/main/draw.c | 26 ++++++++++++++++++++++++++ src/mesa/state_tracker/st_cb_rasterpos.c | 1 + src/mesa/state_tracker/st_draw.c | 20 -------------------- src/mesa/state_tracker/st_draw_feedback.c | 10 ---------- src/mesa/vbo/vbo_exec_draw.c | 3 +++ src/mesa/vbo/vbo_save_draw.c | 3 +++ 6 files changed, 33 insertions(+), 30 deletions(-) diff --git a/src/mesa/main/draw.c b/src/mesa/main/draw.c index cc3127deb20..771b654e89d 100644 --- a/src/mesa/main/draw.c +++ b/src/mesa/main/draw.c @@ -1198,6 +1198,8 @@ _mesa_draw_arrays(struct gl_context *ctx, GLenum mode, GLint start, draw.start = start; draw.count = count; + st_prepare_draw(ctx, ST_PIPELINE_RENDER_STATE_MASK); + ctx->Driver.DrawGallium(ctx, &info, ctx->DrawID, &draw, 1); if (MESA_DEBUG_FLAGS & DEBUG_ALWAYS_FLUSH) { @@ -1503,6 +1505,8 @@ _mesa_MultiDrawArrays(GLenum mode, const GLint *first, draw[i].count = count[i]; } + st_prepare_draw(ctx, ST_PIPELINE_RENDER_STATE_MASK); + ctx->Driver.DrawGallium(ctx, &info, 0, draw, primcount); if (MESA_DEBUG_FLAGS & DEBUG_ALWAYS_FLUSH) @@ -1650,6 +1654,11 @@ _mesa_validated_drawrangeelements(struct gl_context *ctx, info.max_index = end; draw.count = count; + st_prepare_draw(ctx, ST_PIPELINE_RENDER_STATE_MASK); + + if (!st_prepare_indexed_draw(ctx, &info, &draw, 1)) + return; + ctx->Driver.DrawGallium(ctx, &info, ctx->DrawID, &draw, 1); if (MESA_DEBUG_FLAGS & DEBUG_ALWAYS_FLUSH) { @@ -2030,6 +2039,11 @@ _mesa_validated_multidrawelements(struct gl_context *ctx, } } + st_prepare_draw(ctx, ST_PIPELINE_RENDER_STATE_MASK); + + if (!st_prepare_indexed_draw(ctx, &info, draw, primcount)) + return; + ctx->Driver.DrawGallium(ctx, &info, 0, draw, primcount); } else { /* draw[i].start would overflow. Draw one at a time. */ @@ -2049,6 +2063,11 @@ _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 (!st_prepare_indexed_draw(ctx, &info, &draw, 1)) + return; + ctx->Driver.DrawGallium(ctx, &info, i, &draw, 1); } } @@ -2373,6 +2392,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); + ctx->Driver.DrawGallium(ctx, &info, i, &draw, 1); ptr += stride; } @@ -2484,6 +2505,11 @@ _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 (!st_prepare_indexed_draw(ctx, &info, &draw, 1)) + return; + ctx->Driver.DrawGallium(ctx, &info, i, &draw, 1); ptr += stride; } diff --git a/src/mesa/state_tracker/st_cb_rasterpos.c b/src/mesa/state_tracker/st_cb_rasterpos.c index eff9bd1e296..c728ff92868 100644 --- a/src/mesa/state_tracker/st_cb_rasterpos.c +++ b/src/mesa/state_tracker/st_cb_rasterpos.c @@ -277,6 +277,7 @@ st_RasterPos(struct gl_context *ctx, const GLfloat v[4]) _mesa_set_varying_vp_inputs(ctx, VERT_BIT_POS & ctx->Array._DrawVAO->_EnabledWithMapMode); + st_prepare_draw(ctx, ST_PIPELINE_RENDER_STATE_MASK); st_feedback_draw_vbo(ctx, &rs->info, 0, &rs->draw, 1); _mesa_restore_draw_vao(ctx, old_vao, old_vp_input_filter); diff --git a/src/mesa/state_tracker/st_draw.c b/src/mesa/state_tracker/st_draw.c index 950a2da66e6..a3643e605c7 100644 --- a/src/mesa/state_tracker/st_draw.c +++ b/src/mesa/state_tracker/st_draw.c @@ -139,11 +139,6 @@ st_draw_gallium(struct gl_context *ctx, { struct st_context *st = st_context(ctx); - st_prepare_draw(ctx, ST_PIPELINE_RENDER_STATE_MASK); - - if (!st_prepare_indexed_draw(ctx, info, draws, num_draws)) - return; - cso_draw_vbo(st->cso_context, info, drawid_offset, NULL, draws, num_draws); } @@ -156,11 +151,6 @@ st_draw_gallium_multimode(struct gl_context *ctx, { struct st_context *st = st_context(ctx); - st_prepare_draw(ctx, ST_PIPELINE_RENDER_STATE_MASK); - - if (!st_prepare_indexed_draw(ctx, info, draws, num_draws)) - return; - unsigned i, first; struct cso_context *cso = st->cso_context; @@ -473,11 +463,6 @@ st_hw_select_draw_gallium(struct gl_context *ctx, { struct st_context *st = st_context(ctx); - st_prepare_draw(ctx, ST_PIPELINE_RENDER_STATE_MASK); - - if (!st_prepare_indexed_draw(ctx, info, draws, num_draws)) - return; - if (!st_draw_hw_select_prepare_common(ctx) || !st_draw_hw_select_prepare_mode(ctx, info)) return; @@ -494,11 +479,6 @@ st_hw_select_draw_gallium_multimode(struct gl_context *ctx, { struct st_context *st = st_context(ctx); - st_prepare_draw(ctx, ST_PIPELINE_RENDER_STATE_MASK); - - if (!st_prepare_indexed_draw(ctx, info, draws, num_draws)) - return; - if (!st_draw_hw_select_prepare_common(ctx)) return; diff --git a/src/mesa/state_tracker/st_draw_feedback.c b/src/mesa/state_tracker/st_draw_feedback.c index 8faab0d3f26..4da566849c4 100644 --- a/src/mesa/state_tracker/st_draw_feedback.c +++ b/src/mesa/state_tracker/st_draw_feedback.c @@ -114,16 +114,6 @@ st_feedback_draw_vbo(struct gl_context *ctx, if (!draw) return; - st_flush_bitmap_cache(st); - st_invalidate_readpix_cache(st); - - st_validate_state(st, ST_PIPELINE_RENDER_STATE_MASK); - - if (info->index_size && info->has_user_indices && !info->index_bounds_valid) { - vbo_get_minmax_indices_gallium(ctx, info, draws, num_draws); - info->index_bounds_valid = true; - } - /* must get these after state validation! */ struct st_common_variant_key key; /* We have to use memcpy to make sure that all bits are copied. */ diff --git a/src/mesa/vbo/vbo_exec_draw.c b/src/mesa/vbo/vbo_exec_draw.c index e1e8ca2fdbb..4da9b037ff8 100644 --- a/src/mesa/vbo/vbo_exec_draw.c +++ b/src/mesa/vbo/vbo_exec_draw.c @@ -34,6 +34,7 @@ #include "main/enums.h" #include "main/state.h" #include "main/varray.h" +#include "state_tracker/st_draw.h" #include "vbo_private.h" @@ -340,6 +341,8 @@ vbo_exec_vtx_flush(struct vbo_exec_context *exec) printf("%s %d %d\n", __func__, exec->vtx.prim_count, exec->vtx.vert_count); + st_prepare_draw(ctx, ST_PIPELINE_RENDER_STATE_MASK); + ctx->Driver.DrawGalliumMultiMode(ctx, &exec->vtx.info, exec->vtx.draw, exec->vtx.mode, diff --git a/src/mesa/vbo/vbo_save_draw.c b/src/mesa/vbo/vbo_save_draw.c index 54591e98269..7d46341ebfe 100644 --- a/src/mesa/vbo/vbo_save_draw.c +++ b/src/mesa/vbo/vbo_save_draw.c @@ -38,6 +38,7 @@ #include "main/state.h" #include "main/varray.h" #include "util/bitscan.h" +#include "state_tracker/st_draw.h" #include "vbo_private.h" @@ -350,6 +351,8 @@ vbo_save_playback_vertex_list(struct gl_context *ctx, void *data, bool copy_to_c struct pipe_draw_info *info = (struct pipe_draw_info *) &node->cold->info; + st_prepare_draw(ctx, ST_PIPELINE_RENDER_STATE_MASK); + if (node->modes) { ctx->Driver.DrawGalliumMultiMode(ctx, info, node->start_counts,
