Mesa (main): util/prim_restart: break out draw rewriting into separate function
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Wed Jun 23 03:52:35 UTC 2021
Module: Mesa
Branch: main
Commit: 4673febf919014cb72266b7d978ef6bc6e3aba82
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=4673febf919014cb72266b7d978ef6bc6e3aba82
Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date: Fri May 21 06:27:19 2021 -0400
util/prim_restart: break out draw rewriting into separate function
this enables doing the draw rewrites without calling draw_vbo
Reviewed-by: Rob Clark <robdclark at chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10973>
---
src/gallium/auxiliary/util/u_prim_restart.c | 116 +++++++++++++++++-----------
src/gallium/auxiliary/util/u_prim_restart.h | 9 +++
2 files changed, 78 insertions(+), 47 deletions(-)
diff --git a/src/gallium/auxiliary/util/u_prim_restart.c b/src/gallium/auxiliary/util/u_prim_restart.c
index a29286129d5..85ce9f17490 100644
--- a/src/gallium/auxiliary/util/u_prim_restart.c
+++ b/src/gallium/auxiliary/util/u_prim_restart.c
@@ -220,6 +220,63 @@ add_range(enum pipe_prim_type mode, struct range_info *info, unsigned start, uns
return TRUE;
}
+struct pipe_draw_start_count_bias *
+util_prim_restart_convert_to_direct(const void *index_map,
+ const struct pipe_draw_info *info,
+ const struct pipe_draw_start_count_bias *draw,
+ unsigned *num_draws,
+ unsigned *min_index,
+ unsigned *max_index,
+ unsigned *total_index_count)
+{
+ struct range_info ranges = { .min_index = UINT32_MAX, 0 };
+ unsigned i, start, count;
+ ranges.min_index = UINT32_MAX;
+
+ assert(info->index_size);
+ assert(info->primitive_restart);
+
+#define SCAN_INDEXES(TYPE) \
+ for (i = 0; i <= draw->count; i++) { \
+ if (i == draw->count || \
+ ((const TYPE *) index_map)[i] == info->restart_index) { \
+ /* cut / restart */ \
+ if (count > 0) { \
+ if (!add_range(info->mode, &ranges, draw->start + start, count, draw->index_bias)) { \
+ return NULL; \
+ } \
+ } \
+ start = i + 1; \
+ count = 0; \
+ } \
+ else { \
+ count++; \
+ } \
+ }
+
+ start = 0;
+ count = 0;
+ switch (info->index_size) {
+ case 1:
+ SCAN_INDEXES(uint8_t);
+ break;
+ case 2:
+ SCAN_INDEXES(uint16_t);
+ break;
+ case 4:
+ SCAN_INDEXES(uint32_t);
+ break;
+ default:
+ assert(!"Bad index size");
+ return NULL;
+ }
+
+ *num_draws = ranges.count;
+ *min_index = ranges.min_index;
+ *max_index = ranges.max_index;
+ *total_index_count = ranges.total_index_count;
+ return ranges.draws;
+}
/**
* Implement primitive restart by breaking an indexed primitive into
@@ -235,12 +292,12 @@ util_draw_vbo_without_prim_restart(struct pipe_context *context,
const struct pipe_draw_start_count_bias *draw)
{
const void *src_map;
- struct range_info ranges = { .min_index = UINT32_MAX, 0 };
struct pipe_draw_info new_info = *info;
struct pipe_draw_start_count_bias new_draw = *draw;
struct pipe_transfer *src_transfer = NULL;
- unsigned i, start, count;
DrawElementsIndirectCommand indirect;
+ struct pipe_draw_start_count_bias *direct_draws;
+ unsigned num_draws = 0;
assert(info->index_size);
assert(info->primitive_restart);
@@ -283,54 +340,19 @@ util_draw_vbo_without_prim_restart(struct pipe_context *context,
+ new_draw.start * info->index_size;
}
-#define SCAN_INDEXES(TYPE) \
- for (i = 0; i <= new_draw.count; i++) { \
- if (i == new_draw.count || \
- ((const TYPE *) src_map)[i] == info->restart_index) { \
- /* cut / restart */ \
- if (count > 0) { \
- if (!add_range(info->mode, &ranges, new_draw.start + start, count, new_draw.index_bias)) { \
- if (src_transfer) \
- pipe_buffer_unmap(context, src_transfer); \
- return PIPE_ERROR_OUT_OF_MEMORY; \
- } \
- } \
- start = i + 1; \
- count = 0; \
- } \
- else { \
- count++; \
- } \
- }
-
- start = 0;
- count = 0;
- switch (info->index_size) {
- case 1:
- SCAN_INDEXES(uint8_t);
- break;
- case 2:
- SCAN_INDEXES(uint16_t);
- break;
- case 4:
- SCAN_INDEXES(uint32_t);
- break;
- default:
- assert(!"Bad index size");
- return PIPE_ERROR_BAD_INPUT;
- }
- new_info.primitive_restart = FALSE;
- new_info.index_bounds_valid = true;
- new_info.min_index = ranges.min_index;
- new_info.max_index = ranges.max_index;
-
+ unsigned total_index_count;
+ direct_draws = util_prim_restart_convert_to_direct(src_map, &new_info, &new_draw, &num_draws,
+ &new_info.min_index, &new_info.max_index,
+ &total_index_count);
/* unmap index buffer */
if (src_transfer)
pipe_buffer_unmap(context, src_transfer);
- context->draw_vbo(context, &new_info, drawid_offset, NULL, ranges.draws, ranges.count);
-
- FREE(ranges.draws);
+ new_info.primitive_restart = FALSE;
+ new_info.index_bounds_valid = true;
+ if (direct_draws)
+ context->draw_vbo(context, &new_info, drawid_offset, NULL, direct_draws, num_draws);
+ free(direct_draws);
- return PIPE_OK;
+ return num_draws > 0 ? PIPE_OK : PIPE_ERROR_OUT_OF_MEMORY;
}
diff --git a/src/gallium/auxiliary/util/u_prim_restart.h b/src/gallium/auxiliary/util/u_prim_restart.h
index e4c8b6fd29f..eb06b8e7744 100644
--- a/src/gallium/auxiliary/util/u_prim_restart.h
+++ b/src/gallium/auxiliary/util/u_prim_restart.h
@@ -53,6 +53,15 @@ util_translate_prim_restart_ib(struct pipe_context *context,
const struct pipe_draw_start_count_bias *draw,
struct pipe_resource **dst_buffer);
+struct pipe_draw_start_count_bias *
+util_prim_restart_convert_to_direct(const void *index_map,
+ const struct pipe_draw_info *info,
+ const struct pipe_draw_start_count_bias *draw,
+ unsigned *num_draws,
+ unsigned *min_index,
+ unsigned *max_index,
+ unsigned *total_index_count);
+
enum pipe_error
util_draw_vbo_without_prim_restart(struct pipe_context *context,
const struct pipe_draw_info *info,
More information about the mesa-commit
mailing list