Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGermano Cavalcante <mano-wii>2021-06-07 14:38:38 +0300
committerGermano Cavalcante <germano.costa@ig.com.br>2021-06-07 14:41:38 +0300
commit223016a408bc0086b4cbdeec3a8c1db66c2d2236 (patch)
tree1c7eeca0848546793747ab21cb1107bd52e70d1a
parent6e6a1838ea6923df147813954ce08b0093cf00be (diff)
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
-rw-r--r--source/blender/gpu/GPU_index_buffer.h2
-rw-r--r--source/blender/gpu/intern/gpu_index_buffer.cc42
-rw-r--r--source/blender/gpu/intern/gpu_index_buffer_private.hh2
3 files changed, 23 insertions, 23 deletions
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);