diff options
Diffstat (limited to 'source/blender/gpu')
-rw-r--r-- | source/blender/gpu/GPU_index_buffer.h | 14 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_index_buffer.cc | 21 |
2 files changed, 10 insertions, 25 deletions
diff --git a/source/blender/gpu/GPU_index_buffer.h b/source/blender/gpu/GPU_index_buffer.h index 03d60c60b4b..48f80e321b6 100644 --- a/source/blender/gpu/GPU_index_buffer.h +++ b/source/blender/gpu/GPU_index_buffer.h @@ -44,7 +44,6 @@ typedef struct GPUIndexBufBuilder { uint index_max; GPUPrimType prim_type; uint32_t *data; - const struct GPUIndexBufBuilder *parent; } GPUIndexBufBuilder; /* supports all primitive types. */ @@ -55,17 +54,12 @@ void GPU_indexbuf_init(GPUIndexBufBuilder *, GPUPrimType, uint prim_len, uint ve GPUIndexBuf *GPU_indexbuf_build_on_device(uint index_len); /* - * Thread safe sub builders. + * Thread safe. * - * Note that `GPU_indexbuf_subbuilder_init` and `GPU_indexbuf_subbuilder_finish` are not thread - * safe and should be called when no threads are active. The pattern is to create a subbuilder for - * each thread/task. Each thread/task would update their sub builder. When all thread are completed - * the sub-builders can then be merged back to the parent builder. + * Function inspired by the reduction directives of multithread work APIs.. */ -void GPU_indexbuf_subbuilder_init(const GPUIndexBufBuilder *parent_builder, - GPUIndexBufBuilder *sub_builder); -void GPU_indexbuf_subbuilder_finish(GPUIndexBufBuilder *builder, - const GPUIndexBufBuilder *parent_builder); +void GPU_indexbuf_join_copies(GPUIndexBufBuilder *builder, + const GPUIndexBufBuilder *parent_builder); void GPU_indexbuf_add_generic_vert(GPUIndexBufBuilder *, uint v); void GPU_indexbuf_add_primitive_restart(GPUIndexBufBuilder *); diff --git a/source/blender/gpu/intern/gpu_index_buffer.cc b/source/blender/gpu/intern/gpu_index_buffer.cc index 3cdcaac5544..993bcdf743b 100644 --- a/source/blender/gpu/intern/gpu_index_buffer.cc +++ b/source/blender/gpu/intern/gpu_index_buffer.cc @@ -57,7 +57,6 @@ void GPU_indexbuf_init_ex(GPUIndexBufBuilder *builder, builder->index_max = 0; builder->prim_type = prim_type; builder->data = (uint *)MEM_callocN(builder->max_index_len * sizeof(uint), "GPUIndexBuf data"); - builder->parent = nullptr; } void GPU_indexbuf_init(GPUIndexBufBuilder *builder, @@ -80,21 +79,13 @@ GPUIndexBuf *GPU_indexbuf_build_on_device(uint index_len) return elem_; } -void GPU_indexbuf_subbuilder_init(const GPUIndexBufBuilder *parent_builder, - GPUIndexBufBuilder *sub_builder) +void GPU_indexbuf_join_copies(GPUIndexBufBuilder *builder_to, + const GPUIndexBufBuilder *builder_from) { - BLI_assert(parent_builder->parent == nullptr); - memcpy(sub_builder, parent_builder, sizeof(GPUIndexBufBuilder)); - sub_builder->parent = parent_builder; -} - -void GPU_indexbuf_subbuilder_finish(GPUIndexBufBuilder *parent_builder, - const GPUIndexBufBuilder *sub_builder) -{ - BLI_assert(parent_builder == sub_builder->parent); - parent_builder->index_len = max_uu(parent_builder->index_len, sub_builder->index_len); - parent_builder->index_min = min_uu(parent_builder->index_min, sub_builder->index_min); - parent_builder->index_max = max_uu(parent_builder->index_max, sub_builder->index_max); + BLI_assert(builder_to->data == builder_from->data); + builder_to->index_len = max_uu(builder_to->index_len, builder_from->index_len); + builder_to->index_min = min_uu(builder_to->index_min, builder_from->index_min); + builder_to->index_max = max_uu(builder_to->index_max, builder_from->index_max); } void GPU_indexbuf_add_generic_vert(GPUIndexBufBuilder *builder, uint v) |