From c4e2e821a2085687585dd63e792da33e21d01408 Mon Sep 17 00:00:00 2001 From: Rob Clark Date: Sun, 5 Feb 2023 11:45:35 -0800 Subject: [PATCH] freedreno: Push num_draws down to backend Signed-off-by: Rob Clark Part-of: --- src/gallium/drivers/freedreno/a2xx/fd2_draw.c | 15 ++++++++++++++- src/gallium/drivers/freedreno/a3xx/fd3_draw.c | 15 ++++++++++++++- src/gallium/drivers/freedreno/a4xx/fd4_draw.c | 15 ++++++++++++++- src/gallium/drivers/freedreno/a5xx/fd5_draw.c | 15 ++++++++++++++- src/gallium/drivers/freedreno/a6xx/fd6_draw.c | 15 ++++++++++++++- src/gallium/drivers/freedreno/freedreno_context.h | 11 ++++++----- src/gallium/drivers/freedreno/freedreno_draw.c | 4 +--- 7 files changed, 77 insertions(+), 13 deletions(-) diff --git a/src/gallium/drivers/freedreno/a2xx/fd2_draw.c b/src/gallium/drivers/freedreno/a2xx/fd2_draw.c index d0afc3f0916..2b8510cdc66 100644 --- a/src/gallium/drivers/freedreno/a2xx/fd2_draw.c +++ b/src/gallium/drivers/freedreno/a2xx/fd2_draw.c @@ -228,6 +228,19 @@ fd2_draw_vbo(struct fd_context *ctx, const struct pipe_draw_info *pinfo, return true; } +static void +fd2_draw_vbos(struct fd_context *ctx, const struct pipe_draw_info *info, + unsigned drawid_offset, + const struct pipe_draw_indirect_info *indirect, + const struct pipe_draw_start_count_bias *draws, + unsigned num_draws, + unsigned index_offset) + assert_dt +{ + for (unsigned i = 0; i < num_draws; i++) + fd2_draw_vbo(ctx, info, drawid_offset, indirect, &draws[i], index_offset); +} + static void clear_state(struct fd_batch *batch, struct fd_ringbuffer *ring, unsigned buffers, bool fast_clear) assert_dt @@ -651,6 +664,6 @@ void fd2_draw_init(struct pipe_context *pctx) disable_thread_safety_analysis { struct fd_context *ctx = fd_context(pctx); - ctx->draw_vbo = fd2_draw_vbo; + ctx->draw_vbos = fd2_draw_vbos; ctx->clear = fd2_clear; } diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_draw.c b/src/gallium/drivers/freedreno/a3xx/fd3_draw.c index ef42641e6b4..915c7928f9c 100644 --- a/src/gallium/drivers/freedreno/a3xx/fd3_draw.c +++ b/src/gallium/drivers/freedreno/a3xx/fd3_draw.c @@ -165,9 +165,22 @@ fd3_draw_vbo(struct fd_context *ctx, const struct pipe_draw_info *info, return true; } +static void +fd3_draw_vbos(struct fd_context *ctx, const struct pipe_draw_info *info, + unsigned drawid_offset, + const struct pipe_draw_indirect_info *indirect, + const struct pipe_draw_start_count_bias *draws, + unsigned num_draws, + unsigned index_offset) + assert_dt +{ + for (unsigned i = 0; i < num_draws; i++) + fd3_draw_vbo(ctx, info, drawid_offset, indirect, &draws[i], index_offset); +} + void fd3_draw_init(struct pipe_context *pctx) disable_thread_safety_analysis { struct fd_context *ctx = fd_context(pctx); - ctx->draw_vbo = fd3_draw_vbo; + ctx->draw_vbos = fd3_draw_vbos; } diff --git a/src/gallium/drivers/freedreno/a4xx/fd4_draw.c b/src/gallium/drivers/freedreno/a4xx/fd4_draw.c index 803db56c7cf..040ad2f995c 100644 --- a/src/gallium/drivers/freedreno/a4xx/fd4_draw.c +++ b/src/gallium/drivers/freedreno/a4xx/fd4_draw.c @@ -176,9 +176,22 @@ fd4_draw_vbo(struct fd_context *ctx, const struct pipe_draw_info *info, return true; } +static void +fd4_draw_vbos(struct fd_context *ctx, const struct pipe_draw_info *info, + unsigned drawid_offset, + const struct pipe_draw_indirect_info *indirect, + const struct pipe_draw_start_count_bias *draws, + unsigned num_draws, + unsigned index_offset) + assert_dt +{ + for (unsigned i = 0; i < num_draws; i++) + fd4_draw_vbo(ctx, info, drawid_offset, indirect, &draws[i], index_offset); +} + void fd4_draw_init(struct pipe_context *pctx) disable_thread_safety_analysis { struct fd_context *ctx = fd_context(pctx); - ctx->draw_vbo = fd4_draw_vbo; + ctx->draw_vbos = fd4_draw_vbos; } diff --git a/src/gallium/drivers/freedreno/a5xx/fd5_draw.c b/src/gallium/drivers/freedreno/a5xx/fd5_draw.c index 2c932f7cfae..fadb093ee2f 100644 --- a/src/gallium/drivers/freedreno/a5xx/fd5_draw.c +++ b/src/gallium/drivers/freedreno/a5xx/fd5_draw.c @@ -149,6 +149,19 @@ fd5_draw_vbo(struct fd_context *ctx, const struct pipe_draw_info *info, return true; } +static void +fd5_draw_vbos(struct fd_context *ctx, const struct pipe_draw_info *info, + unsigned drawid_offset, + const struct pipe_draw_indirect_info *indirect, + const struct pipe_draw_start_count_bias *draws, + unsigned num_draws, + unsigned index_offset) + assert_dt +{ + for (unsigned i = 0; i < num_draws; i++) + fd5_draw_vbo(ctx, info, drawid_offset, indirect, &draws[i], index_offset); +} + static bool is_z32(enum pipe_format format) { @@ -348,6 +361,6 @@ void fd5_draw_init(struct pipe_context *pctx) disable_thread_safety_analysis { struct fd_context *ctx = fd_context(pctx); - ctx->draw_vbo = fd5_draw_vbo; + ctx->draw_vbos = fd5_draw_vbos; ctx->clear = fd5_clear; } diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_draw.c b/src/gallium/drivers/freedreno/a6xx/fd6_draw.c index a045757c03c..14279585cb2 100644 --- a/src/gallium/drivers/freedreno/a6xx/fd6_draw.c +++ b/src/gallium/drivers/freedreno/a6xx/fd6_draw.c @@ -362,6 +362,19 @@ fd6_draw_vbo(struct fd_context *ctx, const struct pipe_draw_info *info, return true; } +static void +fd6_draw_vbos(struct fd_context *ctx, const struct pipe_draw_info *info, + unsigned drawid_offset, + const struct pipe_draw_indirect_info *indirect, + const struct pipe_draw_start_count_bias *draws, + unsigned num_draws, + unsigned index_offset) + assert_dt +{ + for (unsigned i = 0; i < num_draws; i++) + fd6_draw_vbo(ctx, info, drawid_offset, indirect, &draws[i], index_offset); +} + static void fd6_clear_lrz(struct fd_batch *batch, struct fd_resource *zsbuf, double depth) assert_dt { @@ -534,6 +547,6 @@ void fd6_draw_init(struct pipe_context *pctx) disable_thread_safety_analysis { struct fd_context *ctx = fd_context(pctx); - ctx->draw_vbo = fd6_draw_vbo; + ctx->draw_vbos = fd6_draw_vbos; ctx->clear = fd6_clear; } diff --git a/src/gallium/drivers/freedreno/freedreno_context.h b/src/gallium/drivers/freedreno/freedreno_context.h index 223f834f787..e9e13fa850f 100644 --- a/src/gallium/drivers/freedreno/freedreno_context.h +++ b/src/gallium/drivers/freedreno/freedreno_context.h @@ -488,11 +488,12 @@ struct fd_context { void (*emit_sysmem_fini)(struct fd_batch *batch) dt; /* draw: */ - bool (*draw_vbo)(struct fd_context *ctx, const struct pipe_draw_info *info, - unsigned drawid_offset, - const struct pipe_draw_indirect_info *indirect, - const struct pipe_draw_start_count_bias *draw, - unsigned index_offset) dt; + void (*draw_vbos)(struct fd_context *ctx, const struct pipe_draw_info *info, + unsigned drawid_offset, + const struct pipe_draw_indirect_info *indirect, + const struct pipe_draw_start_count_bias *draws, + unsigned num_draws, + unsigned index_offset) dt; bool (*clear)(struct fd_context *ctx, unsigned buffers, const union pipe_color_union *color, double depth, unsigned stencil) dt; diff --git a/src/gallium/drivers/freedreno/freedreno_draw.c b/src/gallium/drivers/freedreno/freedreno_draw.c index 51efc3991a4..4af873b8047 100644 --- a/src/gallium/drivers/freedreno/freedreno_draw.c +++ b/src/gallium/drivers/freedreno/freedreno_draw.c @@ -389,9 +389,7 @@ fd_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info, batch->cost += ctx->draw_cost; - for (unsigned i = 0; i < num_draws; i++) { - ctx->draw_vbo(ctx, info, drawid_offset, indirect, &draws[i], index_offset); - } + ctx->draw_vbos(ctx, info, drawid_offset, indirect, draws, num_draws, index_offset); if (unlikely(ctx->stats_users > 0)) update_draw_stats(ctx, info, draws, num_draws);