[Bf-blender-cvs] [45d59e0df5f] master: BLI: add threading namespace

Jacques Lucke noreply at git.blender.org
Wed Jun 16 16:15:26 CEST 2021


Commit: 45d59e0df5fe749d428ebf662b61844561df64c4
Author: Jacques Lucke
Date:   Wed Jun 16 16:13:53 2021 +0200
Branches: master
https://developer.blender.org/rB45d59e0df5fe749d428ebf662b61844561df64c4

BLI: add threading namespace

This namespace groups threading related functions/classes. This avoids
adding more threading related stuff to the blender namespace. Also it
makes naming a bit easier, e.g. the c++ version of BLI_task_isolate could
become blender::threading::isolate_task or something similar.

Differential Revision: https://developer.blender.org/D11624

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

M	source/blender/blenkernel/intern/mesh_validate.cc
M	source/blender/blenkernel/intern/spline_base.cc
M	source/blender/blenkernel/intern/spline_bezier.cc
M	source/blender/blenlib/BLI_enumerable_thread_specific.hh
M	source/blender/blenlib/BLI_task.hh
M	source/blender/blenlib/intern/mesh_boolean.cc
M	source/blender/modifiers/intern/MOD_nodes_evaluator.cc
M	source/blender/nodes/geometry/nodes/node_geo_align_rotation_to_vector.cc
M	source/blender/nodes/geometry/nodes/node_geo_attribute_color_ramp.cc
M	source/blender/nodes/geometry/nodes/node_geo_attribute_curve_map.cc
M	source/blender/nodes/geometry/nodes/node_geo_attribute_map_range.cc
M	source/blender/nodes/geometry/nodes/node_geo_attribute_math.cc
M	source/blender/nodes/geometry/nodes/node_geo_attribute_mix.cc
M	source/blender/nodes/geometry/nodes/node_geo_attribute_proximity.cc
M	source/blender/nodes/geometry/nodes/node_geo_attribute_randomize.cc
M	source/blender/nodes/geometry/nodes/node_geo_attribute_sample_texture.cc
M	source/blender/nodes/geometry/nodes/node_geo_attribute_vector_math.cc
M	source/blender/nodes/geometry/nodes/node_geo_attribute_vector_rotate.cc
M	source/blender/nodes/geometry/nodes/node_geo_curve_reverse.cc
M	source/blender/nodes/geometry/nodes/node_geo_curve_to_points.cc
M	source/blender/nodes/geometry/nodes/node_geo_mesh_to_curve.cc
M	source/blender/nodes/geometry/nodes/node_geo_point_instance.cc
M	source/blender/nodes/geometry/nodes/node_geo_select_by_material.cc

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

diff --git a/source/blender/blenkernel/intern/mesh_validate.cc b/source/blender/blenkernel/intern/mesh_validate.cc
index 0b0aeb50d37..574ab785445 100644
--- a/source/blender/blenkernel/intern/mesh_validate.cc
+++ b/source/blender/blenkernel/intern/mesh_validate.cc
@@ -87,7 +87,7 @@ static void reserve_hash_maps(const Mesh *mesh,
                               MutableSpan<EdgeMap> edge_maps)
 {
   const int totedge_guess = std::max(keep_existing_edges ? mesh->totedge : 0, mesh->totpoly * 2);
-  parallel_for_each(
+  threading::parallel_for_each(
       edge_maps, [&](EdgeMap &edge_map) { edge_map.reserve(totedge_guess / edge_maps.size()); });
 }
 
@@ -96,7 +96,7 @@ static void add_existing_edges_to_hash_maps(Mesh *mesh,
                                             uint32_t parallel_mask)
 {
   /* Assume existing edges are valid. */
-  parallel_for_each(edge_maps, [&](EdgeMap &edge_map) {
+  threading::parallel_for_each(edge_maps, [&](EdgeMap &edge_map) {
     const int task_index = &edge_map - &edge_maps[0];
     for (const MEdge &edge : Span(mesh->medge, mesh->totedge)) {
       OrderedEdge ordered_edge{edge.v1, edge.v2};
@@ -113,7 +113,7 @@ static void add_polygon_edges_to_hash_maps(Mesh *mesh,
                                            uint32_t parallel_mask)
 {
   const Span<MLoop> loops{mesh->mloop, mesh->totloop};
-  parallel_for_each(edge_maps, [&](EdgeMap &edge_map) {
+  threading::parallel_for_each(edge_maps, [&](EdgeMap &edge_map) {
     const int task_index = &edge_map - &edge_maps[0];
     for (const MPoly &poly : Span(mesh->mpoly, mesh->totpoly)) {
       Span<MLoop> poly_loops = loops.slice(poly.loopstart, poly.totloop);
@@ -146,7 +146,7 @@ static void serialize_and_initialize_deduplicated_edges(MutableSpan<EdgeMap> edg
     edge_index_offsets[i + 1] = edge_index_offsets[i] + edge_maps[i].size();
   }
 
-  parallel_for_each(edge_maps, [&](EdgeMap &edge_map) {
+  threading::parallel_for_each(edge_maps, [&](EdgeMap &edge_map) {
     const int task_index = &edge_map - &edge_maps[0];
 
     int new_edge_index = edge_index_offsets[task_index];
@@ -174,7 +174,7 @@ static void update_edge_indices_in_poly_loops(Mesh *mesh,
                                               uint32_t parallel_mask)
 {
   const MutableSpan<MLoop> loops{mesh->mloop, mesh->totloop};
-  parallel_for(IndexRange(mesh->totpoly), 100, [&](IndexRange range) {
+  threading::parallel_for(IndexRange(mesh->totpoly), 100, [&](IndexRange range) {
     for (const int poly_index : range) {
       MPoly &poly = mesh->mpoly[poly_index];
       MutableSpan<MLoop> poly_loops = loops.slice(poly.loopstart, poly.totloop);
@@ -215,7 +215,7 @@ static int get_parallel_maps_count(const Mesh *mesh)
 
 static void clear_hash_tables(MutableSpan<EdgeMap> edge_maps)
 {
-  parallel_for_each(edge_maps, [](EdgeMap &edge_map) { edge_map.clear(); });
+  threading::parallel_for_each(edge_maps, [](EdgeMap &edge_map) { edge_map.clear(); });
 }
 
 }  // namespace blender::bke::calc_edges
diff --git a/source/blender/blenkernel/intern/spline_base.cc b/source/blender/blenkernel/intern/spline_base.cc
index c9d4f62845f..f58d15c06fe 100644
--- a/source/blender/blenkernel/intern/spline_base.cc
+++ b/source/blender/blenkernel/intern/spline_base.cc
@@ -378,7 +378,7 @@ void Spline::sample_based_on_index_factors(const GVArray &src,
     using T = decltype(dummy);
     const GVArray_Typed<T> src_typed = src.typed<T>();
     MutableSpan<T> dst_typed = dst.typed<T>();
-    blender::parallel_for(dst_typed.index_range(), 1024, [&](IndexRange range) {
+    blender::threading::parallel_for(dst_typed.index_range(), 1024, [&](IndexRange range) {
       for (const int i : range) {
         const LookupResult interp = this->lookup_data_from_index_factor(index_factors[i]);
         dst_typed[i] = blender::attribute_math::mix2(interp.factor,
diff --git a/source/blender/blenkernel/intern/spline_bezier.cc b/source/blender/blenkernel/intern/spline_bezier.cc
index bd68d49df21..88b680850cf 100644
--- a/source/blender/blenkernel/intern/spline_bezier.cc
+++ b/source/blender/blenkernel/intern/spline_bezier.cc
@@ -417,7 +417,7 @@ static void calculate_mappings_linear_resolution(Span<int> offsets,
   }
 
   const int grain_size = std::max(2048 / resolution, 1);
-  parallel_for(IndexRange(1, size - 2), grain_size, [&](IndexRange range) {
+  blender::threading::parallel_for(IndexRange(1, size - 2), grain_size, [&](IndexRange range) {
     for (const int i_control_point : range) {
       const int segment_len = offsets[i_control_point + 1] - offsets[i_control_point];
       const float segment_len_inv = 1.0f / segment_len;
@@ -497,7 +497,7 @@ Span<float3> BezierSpline::evaluated_positions() const
   Span<int> offsets = this->control_point_offsets();
 
   const int grain_size = std::max(512 / resolution_, 1);
-  parallel_for(IndexRange(size - 1), grain_size, [&](IndexRange range) {
+  blender::threading::parallel_for(IndexRange(size - 1), grain_size, [&](IndexRange range) {
     for (const int i : range) {
       this->evaluate_segment(i, i + 1, positions.slice(offsets[i], offsets[i + 1] - offsets[i]));
     }
diff --git a/source/blender/blenlib/BLI_enumerable_thread_specific.hh b/source/blender/blenlib/BLI_enumerable_thread_specific.hh
index 89be4cad848..a05f7724dd2 100644
--- a/source/blender/blenlib/BLI_enumerable_thread_specific.hh
+++ b/source/blender/blenlib/BLI_enumerable_thread_specific.hh
@@ -26,7 +26,7 @@
 #include "BLI_map.hh"
 #include "BLI_utility_mixins.hh"
 
-namespace blender {
+namespace blender::threading {
 
 namespace enumerable_thread_specific_utils {
 inline std::atomic<int> next_id = 0;
@@ -70,4 +70,4 @@ template<typename T> class EnumerableThreadSpecific : NonCopyable, NonMovable {
 #endif /* WITH_TBB */
 };
 
-}  // namespace blender
+}  // namespace blender::threading
diff --git a/source/blender/blenlib/BLI_task.hh b/source/blender/blenlib/BLI_task.hh
index 8e963c958b2..cdf7759ef41 100644
--- a/source/blender/blenlib/BLI_task.hh
+++ b/source/blender/blenlib/BLI_task.hh
@@ -44,7 +44,7 @@
 #include "BLI_index_range.hh"
 #include "BLI_utildefines.h"
 
-namespace blender {
+namespace blender::threading {
 
 template<typename Range, typename Function>
 void parallel_for_each(Range &range, const Function &function)
@@ -75,4 +75,4 @@ void parallel_for(IndexRange range, int64_t grain_size, const Function &function
 #endif
 }
 
-}  // namespace blender
+}  // namespace blender::threading
diff --git a/source/blender/blenlib/intern/mesh_boolean.cc b/source/blender/blenlib/intern/mesh_boolean.cc
index c5c830bb4dd..9f7824a0029 100644
--- a/source/blender/blenlib/intern/mesh_boolean.cc
+++ b/source/blender/blenlib/intern/mesh_boolean.cc
@@ -1983,7 +1983,7 @@ static void populate_comp_bbs(const Vector<Vector<int>> &components,
    * absolute value of any coordinate. Do it first per component,
    * then get the overall max. */
   Array<double> max_abs(components.size(), 0.0);
-  parallel_for(components.index_range(), comp_grainsize, [&](IndexRange comp_range) {
+  threading::parallel_for(components.index_range(), comp_grainsize, [&](IndexRange comp_range) {
     for (int c : comp_range) {
       BoundingBox &bb = comp_bb[c];
       double &maxa = max_abs[c];
@@ -2691,7 +2691,7 @@ static IMesh raycast_tris_boolean(const IMesh &tm,
   tbb::spin_mutex mtx;
 #  endif
   const int grainsize = 256;
-  parallel_for(IndexRange(tm.face_size()), grainsize, [&](IndexRange range) {
+  threading::parallel_for(IndexRange(tm.face_size()), grainsize, [&](IndexRange range) {
     Array<float> in_shape(nshapes, 0);
     Array<int> winding(nshapes, 0);
     for (int t : range) {
@@ -3391,7 +3391,7 @@ static IMesh polymesh_from_trimesh_with_dissolve(const IMesh &tm_out,
   }
   /* For now: need plane normals for all triangles. */
   const int grainsize = 1024;
-  parallel_for(tm_out.face_index_range(), grainsize, [&](IndexRange range) {
+  threading::parallel_for(tm_out.face_index_range(), grainsize, [&](IndexRange range) {
     for (int i : range) {
       Face *tri = tm_out.face(i);
       tri->populate_plane(false);
diff --git a/source/blender/modifiers/intern/MOD_nodes_evaluator.cc b/source/blender/modifiers/intern/MOD_nodes_evaluator.cc
index bcd10cdbf33..3de7497ae3f 100644
--- a/source/blender/modifiers/intern/MOD_nodes_evaluator.cc
+++ b/source/blender/modifiers/intern/MOD_nodes_evaluator.cc
@@ -352,7 +352,7 @@ class GeometryNodesEvaluator {
    *   on cache line boundaries. Note, just because a value is allocated in one specific thread,
    *   does not mean that it will only be used by that thread.
    */
-  EnumerableThreadSpecific<LinearAllocator<>> local_allocators_;
+  threading::EnumerableThreadSpecific<LinearAllocator<>> local_allocators_;
 
   /**
    * Every node that is reachable from the output gets its own state. Once all states have been
@@ -426,12 +426,13 @@ class GeometryNodesEvaluator {
     /* Initialize the more complex parts of the node states in parallel. At this point no new
      * node states are added anymore, so it is safe to lookup states from `node_states_` from
      * multiple threads. */
-    parallel_for(IndexRange(node_states_.size()), 50, [&, this](const IndexRange range) {
-      LinearAllocator<> &allocator = this->local_allocators_.local();
-      for (const NodeWithState &item : node_states_.as_span().slice(range)) {
-        this->initialize_node_state(item.node, *item.state, allocator);
-      }
-    });
+    threading::parallel_for(
+        IndexRange(node_states_.size()), 50, [&, this](const IndexRange range) {
+          LinearAllocator<> &allocator = this->local_allocators_.local();
+          for (const NodeWithState &item : node_states_.as_span().slice(range)) {
+            this->initialize_node_state(item.node, *item.state, allocator);
+          }
+        });
   }
 
   void initialize_node_state(const DNode node, NodeState &node_state, LinearAllocator<> &allocator)
@@ -507,11 +508,12 @@ class GeometryNodesEvaluator {
 
   void destruct_node_states()
   {
-    parallel_for(IndexRange(node_states_.size()), 50, [&, this](const IndexRange range) {
-      for (const NodeWithState &item : node_states_.as_span().slice(range)) {
-        this->destruct_node_state(item.node, *item.state);
-      }
- 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list