From 223016a408bc0086b4cbdeec3a8c1db66c2d2236 Mon Sep 17 00:00:00 2001 From: Germano Cavalcante Date: Mon, 7 Jun 2021 08:38:38 -0300 Subject: GPUIndexBuf: Find the minimum and maximum index through the builder Moving the bounds code to the builder can be useful for future optimizations like building multithreaded. Reviewed By: fclem, jbakker Differential Revision: https://developer.blender.org/D11455 --- source/blender/gpu/GPU_index_buffer.h | 2 ++ source/blender/gpu/intern/gpu_index_buffer.cc | 42 +++++++++++----------- .../blender/gpu/intern/gpu_index_buffer_private.hh | 2 +- 3 files changed, 23 insertions(+), 23 deletions(-) (limited to 'source/blender/gpu') diff --git a/source/blender/gpu/GPU_index_buffer.h b/source/blender/gpu/GPU_index_buffer.h index 8362dbcaccc..4e8d854c7ce 100644 --- a/source/blender/gpu/GPU_index_buffer.h +++ b/source/blender/gpu/GPU_index_buffer.h @@ -40,6 +40,8 @@ typedef struct GPUIndexBufBuilder { uint max_allowed_index; uint max_index_len; uint index_len; + uint index_min; + uint index_max; GPUPrimType prim_type; uint32_t *data; } GPUIndexBufBuilder; diff --git a/source/blender/gpu/intern/gpu_index_buffer.cc b/source/blender/gpu/intern/gpu_index_buffer.cc index 20a26c0fe9d..9f283a3a944 100644 --- a/source/blender/gpu/intern/gpu_index_buffer.cc +++ b/source/blender/gpu/intern/gpu_index_buffer.cc @@ -52,6 +52,8 @@ void GPU_indexbuf_init_ex(GPUIndexBufBuilder *builder, builder->max_allowed_index = vertex_len - 1; builder->max_index_len = index_len; builder->index_len = 0; // start empty + builder->index_min = UINT32_MAX; + builder->index_max = 0; builder->prim_type = prim_type; builder->data = (uint *)MEM_callocN(builder->max_index_len * sizeof(uint), "GPUIndexBuf data"); } @@ -84,6 +86,8 @@ void GPU_indexbuf_add_generic_vert(GPUIndexBufBuilder *builder, uint v) assert(v <= builder->max_allowed_index); #endif builder->data[builder->index_len++] = v; + builder->index_min = MIN2(builder->index_min, v); + builder->index_max = MAX2(builder->index_max, v); } void GPU_indexbuf_add_primitive_restart(GPUIndexBufBuilder *builder) @@ -142,9 +146,9 @@ void GPU_indexbuf_set_point_vert(GPUIndexBufBuilder *builder, uint elem, uint v1 BLI_assert(builder->prim_type == GPU_PRIM_POINTS); BLI_assert(elem < builder->max_index_len); builder->data[elem++] = v1; - if (builder->index_len < elem) { - builder->index_len = elem; - } + builder->index_min = MIN2(builder->index_min, v1); + builder->index_max = MAX2(builder->index_max, v1); + builder->index_len = MAX2(builder->index_len, elem); } void GPU_indexbuf_set_line_verts(GPUIndexBufBuilder *builder, uint elem, uint v1, uint v2) @@ -157,9 +161,9 @@ void GPU_indexbuf_set_line_verts(GPUIndexBufBuilder *builder, uint elem, uint v1 uint idx = elem * 2; builder->data[idx++] = v1; builder->data[idx++] = v2; - if (builder->index_len < idx) { - builder->index_len = idx; - } + builder->index_min = MIN3(builder->index_min, v1, v2); + builder->index_max = MAX3(builder->index_max, v1, v2); + builder->index_len = MAX2(builder->index_len, idx); } void GPU_indexbuf_set_tri_verts(GPUIndexBufBuilder *builder, uint elem, uint v1, uint v2, uint v3) @@ -174,9 +178,10 @@ void GPU_indexbuf_set_tri_verts(GPUIndexBufBuilder *builder, uint elem, uint v1, builder->data[idx++] = v1; builder->data[idx++] = v2; builder->data[idx++] = v3; - if (builder->index_len < idx) { - builder->index_len = idx; - } + + builder->index_min = MIN4(builder->index_min, v1, v2, v3); + builder->index_max = MAX4(builder->index_max, v1, v2, v3); + builder->index_len = MAX2(builder->index_len, idx); } void GPU_indexbuf_set_point_restart(GPUIndexBufBuilder *builder, uint elem) @@ -184,9 +189,7 @@ void GPU_indexbuf_set_point_restart(GPUIndexBufBuilder *builder, uint elem) BLI_assert(builder->prim_type == GPU_PRIM_POINTS); BLI_assert(elem < builder->max_index_len); builder->data[elem++] = RESTART_INDEX; - if (builder->index_len < elem) { - builder->index_len = elem; - } + builder->index_len = MAX2(builder->index_len, elem); } void GPU_indexbuf_set_line_restart(GPUIndexBufBuilder *builder, uint elem) @@ -196,9 +199,7 @@ void GPU_indexbuf_set_line_restart(GPUIndexBufBuilder *builder, uint elem) uint idx = elem * 2; builder->data[idx++] = RESTART_INDEX; builder->data[idx++] = RESTART_INDEX; - if (builder->index_len < idx) { - builder->index_len = idx; - } + builder->index_len = MAX2(builder->index_len, idx); } void GPU_indexbuf_set_tri_restart(GPUIndexBufBuilder *builder, uint elem) @@ -209,9 +210,7 @@ void GPU_indexbuf_set_tri_restart(GPUIndexBufBuilder *builder, uint elem) builder->data[idx++] = RESTART_INDEX; builder->data[idx++] = RESTART_INDEX; builder->data[idx++] = RESTART_INDEX; - if (builder->index_len < idx) { - builder->index_len = idx; - } + builder->index_len = MAX2(builder->index_len, idx); } /** \} */ @@ -229,7 +228,7 @@ IndexBuf::~IndexBuf() } } -void IndexBuf::init(uint indices_len, uint32_t *indices) +void IndexBuf::init(uint indices_len, uint32_t *indices, uint min_index, uint max_index) { is_init_ = true; data_ = indices; @@ -239,8 +238,7 @@ void IndexBuf::init(uint indices_len, uint32_t *indices) #if GPU_TRACK_INDEX_RANGE /* Everything remains 32 bit while building to keep things simple. * Find min/max after, then convert to smallest index type possible. */ - uint min_index, max_index; - uint range = this->index_range(&min_index, &max_index); + uint range = min_index < max_index ? max_index - min_index : 0; /* count the primitive restart index. */ range += 1; @@ -366,7 +364,7 @@ void GPU_indexbuf_build_in_place(GPUIndexBufBuilder *builder, GPUIndexBuf *elem) BLI_assert(builder->data != nullptr); /* Transfer data ownership to GPUIndexBuf. * It will be uploaded upon first use. */ - unwrap(elem)->init(builder->index_len, builder->data); + unwrap(elem)->init(builder->index_len, builder->data, builder->index_min, builder->index_max); builder->data = nullptr; } diff --git a/source/blender/gpu/intern/gpu_index_buffer_private.hh b/source/blender/gpu/intern/gpu_index_buffer_private.hh index 358258604bf..e8a47417604 100644 --- a/source/blender/gpu/intern/gpu_index_buffer_private.hh +++ b/source/blender/gpu/intern/gpu_index_buffer_private.hh @@ -73,7 +73,7 @@ class IndexBuf { IndexBuf(){}; virtual ~IndexBuf(); - void init(uint indices_len, uint32_t *indices); + void init(uint indices_len, uint32_t *indices, uint min_index, uint max_index); void init_subrange(IndexBuf *elem_src, uint start, uint length); void init_build_on_device(uint index_len); -- cgit v1.2.3