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
This commit is contained in:
parent
6e6a1838ea
commit
223016a408
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue