From 12d88d500dae9d67db0c33f316ba327cf5aaed4e Mon Sep 17 00:00:00 2001 From: Jesse Natalie Date: Tue, 26 Apr 2022 16:03:16 -0700 Subject: [PATCH] u_primconvert: Refactor to remove recursion from util_primconvert_draw_vbo This prevents having unused copies of pipe_draw_info and pipe_draw_start_count_bias on the stack, and makes it easier to do things once for a multi-draw, which will matter in the next patch. Reviewed-by: Mike Blumenkrantz Reviewed-by: Sil Vilerino Part-of: --- src/util/indices/u_primconvert.c | 40 +++++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/src/util/indices/u_primconvert.c b/src/util/indices/u_primconvert.c index 5d0de36..1ee4f39 100644 --- a/src/util/indices/u_primconvert.c +++ b/src/util/indices/u_primconvert.c @@ -105,7 +105,6 @@ util_primconvert_save_flatshade_first(struct primconvert_context *pc, bool flats static bool primconvert_init_draw(struct primconvert_context *pc, const struct pipe_draw_info *info, - const struct pipe_draw_indirect_info *indirect, const struct pipe_draw_start_count_bias *draws, struct pipe_draw_info *new_info, struct pipe_draw_start_count_bias *new_draw) @@ -270,6 +269,23 @@ primconvert_init_draw(struct primconvert_context *pc, return true; } +static void +util_primconvert_draw_single_vbo(struct primconvert_context *pc, + const struct pipe_draw_info *info, + unsigned drawid_offset, + const struct pipe_draw_start_count_bias *draw) +{ + struct pipe_draw_info new_info; + struct pipe_draw_start_count_bias new_draw; + + if (!primconvert_init_draw(pc, info, draw, &new_info, &new_draw)) + return; + /* to the translated draw: */ + pc->pipe->draw_vbo(pc->pipe, &new_info, drawid_offset, NULL, &new_draw, 1); + + pipe_resource_reference(&new_info.index.resource, NULL); +} + void util_primconvert_draw_vbo(struct primconvert_context *pc, const struct pipe_draw_info *info, @@ -278,9 +294,6 @@ util_primconvert_draw_vbo(struct primconvert_context *pc, const struct pipe_draw_start_count_bias *draws, unsigned num_draws) { - struct pipe_draw_info new_info; - struct pipe_draw_start_count_bias new_draw; - if (indirect && indirect->buffer) { /* this is stupid, but we're already doing a readback, * so this thing may as well get the rest of the job done @@ -291,28 +304,17 @@ util_primconvert_draw_vbo(struct primconvert_context *pc, return; for (unsigned i = 0; i < draw_count; i++) - util_primconvert_draw_vbo(pc, &new_draws[i].info, drawid_offset + i, NULL, &new_draws[i].draw, 1); + util_primconvert_draw_single_vbo(pc, &new_draws[i].info, drawid_offset + i, &new_draws[i].draw); free(new_draws); - return; - } - - if (num_draws > 1) { + } else { unsigned drawid = drawid_offset; for (unsigned i = 0; i < num_draws; i++) { if (draws[i].count && info->instance_count) - util_primconvert_draw_vbo(pc, info, drawid, NULL, &draws[i], 1); + util_primconvert_draw_single_vbo(pc, info, drawid, &draws[i]); if (info->increment_draw_id) drawid++; } - return; } - - if (!primconvert_init_draw(pc, info, indirect, draws, &new_info, &new_draw)) - return; - /* to the translated draw: */ - pc->pipe->draw_vbo(pc->pipe, &new_info, drawid_offset, NULL, &new_draw, 1); - - pipe_resource_reference(&new_info.index.resource, NULL); } void @@ -344,7 +346,7 @@ util_primconvert_draw_vertex_state(struct primconvert_context *pc, dinfo.index_size = 4; dinfo.instance_count = 1; dinfo.index.resource = vstate->input.indexbuf; - if (!primconvert_init_draw(pc, &dinfo, NULL, draws, &new_info, &new_draw)) + if (!primconvert_init_draw(pc, &dinfo, draws, &new_info, &new_draw)) return; struct pipe_vertex_state *new_state = pc->pipe->screen->create_vertex_state(pc->pipe->screen, -- 2.7.4