[Bf-blender-cvs] [09e05193c7d] temp-pbvh-split: temp-pbvh-split: Use TaskPool API for texture node splitting

Joseph Eagar noreply at git.blender.org
Wed May 11 03:39:42 CEST 2022


Commit: 09e05193c7dd6f1db837dcbf2f6a6deb535b841e
Author: Joseph Eagar
Date:   Tue May 10 18:39:22 2022 -0700
Branches: temp-pbvh-split
https://developer.blender.org/rB09e05193c7dd6f1db837dcbf2f6a6deb535b841e

temp-pbvh-split: Use TaskPool API for texture node splitting

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

M	source/blender/blenkernel/intern/pbvh_pixels.cc

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

diff --git a/source/blender/blenkernel/intern/pbvh_pixels.cc b/source/blender/blenkernel/intern/pbvh_pixels.cc
index 8bf691ba1fa..457a7bc9af1 100644
--- a/source/blender/blenkernel/intern/pbvh_pixels.cc
+++ b/source/blender/blenkernel/intern/pbvh_pixels.cc
@@ -71,18 +71,18 @@ int count_node_pixels(PBVHNode &node)
   return totpixel;
 }
 
-struct SplitThreadData {
+struct SplitQueueData {
   ThreadQueue *queue;
   ThreadQueue *new_nodes;
-  int thread_num, thread_nr;
-  std::atomic<bool> *working;
-
-  std::atomic<int> *nodes_num;
+  int thread_num;
 
   PBVH *pbvh;
   Mesh *mesh;
   Image *image;
   ImageUser *image_user;
+
+  std::atomic<bool> *working;
+  std::atomic<int> *nodes_num;
 };
 
 struct SplitNodePair {
@@ -104,7 +104,7 @@ static void split_pixel_node(PBVH *pbvh,
                              Mesh *mesh,
                              Image *image,
                              ImageUser *image_user,
-                             SplitThreadData *tdata)
+                             SplitQueueData *tdata)
 {
   BB cb;
   PBVHNode *node = &split->node;
@@ -256,7 +256,7 @@ static void split_pixel_node(PBVH *pbvh,
   BLI_thread_queue_push(tdata->queue, static_cast<void *>(split2));
 }
 
-static void split_flush_final_nodes(SplitThreadData *tdata)
+static void split_flush_final_nodes(SplitQueueData *tdata)
 {
   PBVH *pbvh = tdata->pbvh;
   Vector<SplitNodePair *> splits;
@@ -293,10 +293,10 @@ static void split_flush_final_nodes(SplitThreadData *tdata)
   }
 }
 
-extern "C" static void *split_thread_job(void *_tdata)
+extern "C" static void split_thread_job(TaskPool *__restrict pool, void *taskdata)
 {
-  SplitThreadData *tdata = static_cast<SplitThreadData *>(_tdata);
-  int thread_nr = tdata->thread_nr;
+  SplitQueueData *tdata = static_cast<SplitQueueData *>(BLI_task_pool_user_data(pool));
+  int thread_nr = POINTER_AS_UINT(taskdata);
 
   tdata->working[thread_nr].store(false);
 
@@ -306,6 +306,8 @@ extern "C" static void *split_thread_job(void *_tdata)
     if (work) {
       SplitNodePair *split = static_cast<SplitNodePair *>(work);
 
+      /* Signal to other threads that we are working, needed to prevent
+         premature task exit when the queue is temporarily empty. */
       tdata->working[thread_nr].store(true);
       split_pixel_node(tdata->pbvh, split, tdata->mesh, tdata->image, tdata->image_user, tdata);
       tdata->working[thread_nr].store(false);
@@ -321,12 +323,11 @@ extern "C" static void *split_thread_job(void *_tdata)
       }
     }
 
+    /* No nodes left in queue? End task. */
     if (ok) {
       break;
     }
   }
-
-  return nullptr;
 }
 
 static void split_pixel_nodes(PBVH *pbvh, Mesh *mesh, Image *image, ImageUser *image_user)
@@ -343,7 +344,7 @@ static void split_pixel_nodes(PBVH *pbvh, Mesh *mesh, Image *image, ImageUser *i
     pbvh->pixel_leaf_limit = 256 * 256; /* TODO: move into a constant */
   }
 
-  SplitThreadData tdata;
+  SplitQueueData tdata;
 
   tdata.nodes_num = MEM_new<std::atomic<int>>("tdata.nodes_num");
   tdata.nodes_num->store(pbvh->totnode);
@@ -369,24 +370,22 @@ static void split_pixel_nodes(PBVH *pbvh, Mesh *mesh, Image *image, ImageUser *i
     }
   }
 
-  Vector<SplitThreadData> tdatas;
   int thread_num = tdata.thread_num = G.debug_value != 892 ? BLI_system_thread_count() : 1;
-
   tdata.working = new std::atomic<bool>[thread_num];
 
-  ListBase threads;
-  BLI_threadpool_init(&threads, split_thread_job, thread_num);
+#if 0
+  TaskPool *pool = BLI_task_pool_create_no_threads(&tdata);
+#else
+  TaskPool *pool = BLI_task_pool_create_suspended(&tdata, TASK_PRIORITY_HIGH);
+#endif
 
   for (int i : IndexRange(thread_num)) {
-    tdata.thread_nr = i;
-    tdatas.append(tdata);
+    BLI_task_pool_push(pool, split_thread_job, POINTER_FROM_UINT(i), false, nullptr);
   }
 
-  for (int i : IndexRange(thread_num)) {
-    BLI_threadpool_insert(&threads, &tdatas[i]);
-  }
+  BLI_task_pool_work_and_wait(pool);
+  BLI_task_pool_free(pool);
 
-  BLI_threadpool_end(&threads);
   split_flush_final_nodes(&tdata);
 
   delete[] tdata.working;
@@ -763,7 +762,11 @@ void pbvh_pixels_free(PBVHNode *node)
 {
   NodeData *node_data = static_cast<NodeData *>(node->pixels.node_data);
 
-  if (node->flag & PBVH_Leaf) {
+  if (!node_data) {
+    return;
+  }
+
+  if (node_data->triangles && (node->flag & PBVH_Leaf)) {
     MEM_delete<Triangles>(node_data->triangles);
   }



More information about the Bf-blender-cvs mailing list