Mesa (main): aux/primconvert: break out primconvert internals into util function
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Fri Nov 12 03:08:16 UTC 2021
Module: Mesa
Branch: main
Commit: e1948c9a71cc7bc9da62fe771276ef1681e3d2fb
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=e1948c9a71cc7bc9da62fe771276ef1681e3d2fb
Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date: Fri Nov 5 11:56:22 2021 -0400
aux/primconvert: break out primconvert internals into util function
this should (ideally) be no functional changes
Reviewed-by: Rob Clark <robdclark at chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13742>
---
src/gallium/auxiliary/indices/u_primconvert.c | 162 ++++++++++++++------------
1 file changed, 88 insertions(+), 74 deletions(-)
diff --git a/src/gallium/auxiliary/indices/u_primconvert.c b/src/gallium/auxiliary/indices/u_primconvert.c
index 5ce8dddfa1f..30da20ddb63 100644
--- a/src/gallium/auxiliary/indices/u_primconvert.c
+++ b/src/gallium/auxiliary/indices/u_primconvert.c
@@ -102,16 +102,14 @@ util_primconvert_save_flatshade_first(struct primconvert_context *pc, bool flats
pc->api_pv = flatshade_first ? PV_FIRST : PV_LAST;
}
-void
-util_primconvert_draw_vbo(struct primconvert_context *pc,
- 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)
+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)
{
- struct pipe_draw_info new_info;
- struct pipe_draw_start_count_bias new_draw;
struct pipe_draw_start_count_bias *direct_draws = NULL;
unsigned num_direct_draws = 0;
struct pipe_transfer *src_transfer = NULL;
@@ -123,32 +121,6 @@ util_primconvert_draw_vbo(struct primconvert_context *pc,
unsigned total_index_count = draws->count;
void *rewrite_buffer = NULL;
- 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
- */
- unsigned draw_count = 0;
- struct u_indirect_params *new_draws = util_draw_indirect_read(pc->pipe, info, indirect, &draw_count);
- if (!new_draws)
- 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);
- free(new_draws);
- return;
- }
-
- if (num_draws > 1) {
- 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);
- if (info->increment_draw_id)
- drawid++;
- }
- return;
- }
-
const struct pipe_draw_start_count_bias *draw = &draws[0];
/* Filter out degenerate primitives, u_upload_alloc() will assert
@@ -156,20 +128,20 @@ util_primconvert_draw_vbo(struct primconvert_context *pc,
*/
if (!info->primitive_restart &&
!u_trim_pipe_prim(info->mode, (unsigned*)&draw->count))
- return;
+ return false;
- util_draw_init_info(&new_info);
- new_info.index_bounds_valid = info->index_bounds_valid;
- new_info.min_index = info->min_index;
- new_info.max_index = info->max_index;
- new_info.start_instance = info->start_instance;
- new_info.instance_count = info->instance_count;
- new_info.primitive_restart = info->primitive_restart;
- new_info.restart_index = info->restart_index;
+ util_draw_init_info(new_info);
+ new_info->index_bounds_valid = info->index_bounds_valid;
+ new_info->min_index = info->min_index;
+ new_info->max_index = info->max_index;
+ new_info->start_instance = info->start_instance;
+ new_info->instance_count = info->instance_count;
+ new_info->primitive_restart = info->primitive_restart;
+ new_info->restart_index = info->restart_index;
if (info->index_size) {
- enum pipe_prim_type mode = new_info.mode = u_index_prim_type_convert(pc->cfg.primtypes_mask, info->mode, true);
+ enum pipe_prim_type mode = new_info->mode = u_index_prim_type_convert(pc->cfg.primtypes_mask, info->mode, true);
unsigned index_size = info->index_size;
- new_info.index_size = u_index_size_convert(info->index_size);
+ new_info->index_size = u_index_size_convert(info->index_size);
src = info->has_user_indices ? info->index.user : NULL;
if (!src) {
@@ -189,8 +161,8 @@ util_primconvert_draw_vbo(struct primconvert_context *pc,
* this pre-filters degenerate primitives
*/
direct_draws = util_prim_restart_convert_to_direct(src, info, draw, &num_direct_draws,
- &new_info.min_index, &new_info.max_index, &total_index_count);
- new_info.primitive_restart = false;
+ &new_info->min_index, &new_info->max_index, &total_index_count);
+ new_info->primitive_restart = false;
/* step 2: get a translator function which does nothing but handle any index size conversions
* which may or may not occur (8bit -> 16bit)
*/
@@ -198,10 +170,10 @@ util_primconvert_draw_vbo(struct primconvert_context *pc,
info->mode, index_size, total_index_count,
pc->api_pv, pc->api_pv,
PR_DISABLE,
- &mode, &index_size, &new_draw.count,
+ &mode, &index_size, &new_draw->count,
&direct_draw_func);
/* this should always be a direct translation */
- assert(new_draw.count == total_index_count);
+ assert(new_draw->count == total_index_count);
/* step 3: allocate a temp buffer for an intermediate rewrite step
* if no indices were found, this was a single incomplete restart and can be discarded
*/
@@ -210,18 +182,18 @@ util_primconvert_draw_vbo(struct primconvert_context *pc,
if (!rewrite_buffer) {
if (src_transfer)
pipe_buffer_unmap(pc->pipe, src_transfer);
- return;
+ return false;
}
}
/* (step 4: get the actual primitive conversion translator function) */
u_index_translator(pc->cfg.primtypes_mask,
info->mode, index_size, total_index_count,
pc->api_pv, pc->api_pv,
- new_info.primitive_restart ? PR_ENABLE : PR_DISABLE,
- &mode, &index_size, &new_draw.count,
+ new_info->primitive_restart ? PR_ENABLE : PR_DISABLE,
+ &mode, &index_size, &new_draw->count,
&trans_func);
- assert(new_info.mode == mode);
- assert(new_info.index_size == index_size);
+ assert(new_info->mode == mode);
+ assert(new_info->index_size == index_size);
}
else {
enum pipe_prim_type mode = 0;
@@ -230,17 +202,17 @@ util_primconvert_draw_vbo(struct primconvert_context *pc,
u_index_generator(pc->cfg.primtypes_mask,
info->mode, draw->start, draw->count,
pc->api_pv, pc->api_pv,
- &mode, &index_size, &new_draw.count,
+ &mode, &index_size, &new_draw->count,
&gen_func);
- new_info.mode = mode;
- new_info.index_size = index_size;
+ new_info->mode = mode;
+ new_info->index_size = index_size;
}
/* (step 5: allocate gpu memory sized for the FINAL index count) */
- u_upload_alloc(pc->pipe->stream_uploader, 0, new_info.index_size * new_draw.count, 4,
- &ib_offset, &new_info.index.resource, &dst);
- new_draw.start = ib_offset / new_info.index_size;
- new_draw.index_bias = info->index_size ? draw->index_bias : 0;
+ u_upload_alloc(pc->pipe->stream_uploader, 0, new_info->index_size * new_draw->count, 4,
+ &ib_offset, &new_info->index.resource, &dst);
+ new_draw->start = ib_offset / new_info->index_size;
+ new_draw->index_bias = info->index_size ? draw->index_bias : 0;
if (info->index_size) {
if (num_direct_draws) {
@@ -260,24 +232,24 @@ util_primconvert_draw_vbo(struct primconvert_context *pc,
/* step 6c: handle the primitive type conversion rewriting to the converted index count */
trans_func(ptr, 0, direct_draws[i].count, tmp_count, info->restart_index, dst_ptr);
/* step 6d: increment the temp buffer and mapped final index buffer pointers */
- ptr += new_info.index_size * direct_draws[i].count;
- dst_ptr += new_info.index_size * tmp_count;
+ ptr += new_info->index_size * direct_draws[i].count;
+ dst_ptr += new_info->index_size * tmp_count;
}
/* step 7: set the final index count, which is the converted total index count from the original draw rewrite */
- new_draw.count = u_index_count_converted_indices(pc->cfg.primtypes_mask, true, info->mode, total_index_count);
+ new_draw->count = u_index_count_converted_indices(pc->cfg.primtypes_mask, true, info->mode, total_index_count);
} else
- trans_func(src, draw->start, draw->count, new_draw.count, info->restart_index, dst);
+ trans_func(src, draw->start, draw->count, new_draw->count, info->restart_index, dst);
- if (pc->cfg.fixed_prim_restart && new_info.primitive_restart) {
- new_info.restart_index = (1ull << (new_info.index_size * 8)) - 1;
- if (info->restart_index != new_info.restart_index)
- util_translate_prim_restart_data(new_info.index_size, dst, dst,
- new_draw.count,
+ if (pc->cfg.fixed_prim_restart && new_info->primitive_restart) {
+ new_info->restart_index = (1ull << (new_info->index_size * 8)) - 1;
+ if (info->restart_index != new_info->restart_index)
+ util_translate_prim_restart_data(new_info->index_size, dst, dst,
+ new_draw->count,
info->restart_index);
}
}
else {
- gen_func(draw->start, new_draw.count, dst);
+ gen_func(draw->start, new_draw->count, dst);
}
if (src_transfer)
@@ -285,10 +257,52 @@ util_primconvert_draw_vbo(struct primconvert_context *pc,
u_upload_unmap(pc->pipe->stream_uploader);
- /* to the translated draw: */
- pc->pipe->draw_vbo(pc->pipe, &new_info, drawid_offset, NULL, &new_draw, 1);
free(direct_draws);
free(rewrite_buffer);
+ return true;
+}
+
+void
+util_primconvert_draw_vbo(struct primconvert_context *pc,
+ 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)
+{
+ 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
+ */
+ unsigned draw_count = 0;
+ struct u_indirect_params *new_draws = util_draw_indirect_read(pc->pipe, info, indirect, &draw_count);
+ if (!new_draws)
+ 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);
+ free(new_draws);
+ return;
+ }
+
+ if (num_draws > 1) {
+ 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);
+ 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);
}
More information about the mesa-commit
mailing list