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,

Reply via email to