[Bf-blender-cvs] [223016a408b] master: GPUIndexBuf: Find the minimum and maximum index through the builder

Germano Cavalcante noreply at git.blender.org
Mon Jun 7 13:47:34 CEST 2021


Commit: 223016a408bc0086b4cbdeec3a8c1db66c2d2236
Author: Germano Cavalcante
Date:   Mon Jun 7 08:38:38 2021 -0300
Branches: master
https://developer.blender.org/rB223016a408bc0086b4cbdeec3a8c1db66c2d2236

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

===================================================================

M	source/blender/gpu/GPU_index_buffer.h
M	source/blender/gpu/intern/gpu_index_buffer.cc
M	source/blender/gpu/intern/gpu_index_buffer_private.hh

===================================================================

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);



More information about the Bf-blender-cvs mailing list