[Bf-blender-cvs] [ff29d5876f8] temp-lineart-contained: Revert "LineArt: Experimental smaller chunks on add_triangles."

YimingWu noreply at git.blender.org
Fri Apr 22 10:42:54 CEST 2022


Commit: ff29d5876f828fe9b94c3c40304910890c97cf44
Author: YimingWu
Date:   Fri Apr 22 15:05:07 2022 +0800
Branches: temp-lineart-contained
https://developer.blender.org/rBff29d5876f828fe9b94c3c40304910890c97cf44

Revert "LineArt: Experimental smaller chunks on add_triangles."

This reverts commit 962e699d340c5d75a15d740a8dd9fb471352df83.

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

M	release/datafiles/locale
M	release/scripts/addons
M	source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
M	source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
M	source/tools

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

diff --git a/release/datafiles/locale b/release/datafiles/locale
index 11e2ea5c359..245306b56bd 160000
--- a/release/datafiles/locale
+++ b/release/datafiles/locale
@@ -1 +1 @@
-Subproject commit 11e2ea5c35988130f09ac10d4cbbad87ff2a7501
+Subproject commit 245306b56bda2aa39af219c3dd705666363e2c54
diff --git a/release/scripts/addons b/release/scripts/addons
index a254b56d417..754d05ac7eb 160000
--- a/release/scripts/addons
+++ b/release/scripts/addons
@@ -1 +1 @@
-Subproject commit a254b56d417a3cd6d23a29a1d45c5ac1e16f0fbe
+Subproject commit 754d05ac7ebb78377bbe6d80068542c43d347974
diff --git a/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h b/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
index b9c9a74ac4f..ac3cdc43235 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
+++ b/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
@@ -238,9 +238,6 @@ typedef struct LineartRenderBuffer {
   ListBase line_buffer_pointers;
   ListBase triangle_buffer_pointers;
 
-  LineartElementLinkNode *isect_scheduled_up_to;
-  int isect_scheduled_up_to_index;
-
   /** This one's memory is not from main pool and is free()ed after culling stage. */
   ListBase triangle_adjacent_pointers;
 
diff --git a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
index 23cc0b1a835..dd3d5f3f5d8 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
+++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
@@ -58,12 +58,14 @@ typedef struct LineartIsecSingle {
 } LineartIsecSingle;
 typedef struct LineartIsecThread {
   int thread_id;
-
-  /* Scheduled work range. */
-  LineartElementLinkNode *pending_from;
-  LineartElementLinkNode *pending_to;
-  int index_from;
-  int index_to;
+  /* Thread triangle data. */
+  /* Used to roughly spread the load. */
+  int count_pending;
+  /* An array of triangle element link nodes. */
+  LineartElementLinkNode **pending_triangle_nodes;
+  /* Count of above array. */
+  int current_pending;
+  int max_pending;
 
   /* Thread intersection result data. */
   LineartIsecSingle *array;
@@ -2727,13 +2729,13 @@ static void lineart_object_load_worker(TaskPool *__restrict UNUSED(pool),
   //- Print size of pending objects.
   //- Try to feed this with an array instead of via the pool instead of a custom list
   //- Assign the number of objects instead of number of threads
-  // printf("thread start: %d\n", olti->thread_id);
+  printf("thread start: %d\n", olti->thread_id);
   for (LineartObjectInfo *obi = olti->pending; obi; obi = obi->next) {
     lineart_geometry_object_load_no_bmesh(obi, olti->rb);
     // lineart_geometry_object_load(obi, olti->rb);
-    // printf("thread id: %d processed: %d\n", olti->thread_id, obi->original_me->totpoly);
+    printf("thread id: %d processed: %d\n", olti->thread_id, obi->original_me->totpoly);
   }
-  // printf("thread end: %d\n", olti->thread_id);
+  printf("thread end: %d\n", olti->thread_id);
 }
 
 static uchar lineart_intersection_mask_check(Collection *c, Object *ob)
@@ -3642,44 +3644,21 @@ static void lineart_add_isec_thread(LineartIsecThread *th,
   th->current++;
 }
 
-#define LRT_ISECT_TRIANGLE_PER_THREAD 4096;
-
-static bool lineart_schedule_new_triangle_task(LineartIsecThread *th)
+static void lineart_add_eln_thread(LineartIsecThread *th, LineartElementLinkNode *eln)
 {
-  LineartRenderBuffer *rb = th->rb;
-  int remaining = LRT_ISECT_TRIANGLE_PER_THREAD;
-
-  BLI_spin_lock(&rb->lock_task);
-  LineartElementLinkNode *eln = rb->isect_scheduled_up_to;
-
-  if (!eln) {
-    BLI_spin_unlock(&rb->lock_task);
-    return false;
-  }
-
-  th->pending_from = eln;
-  th->index_from = rb->isect_scheduled_up_to_index;
-
-  while (remaining > 0 && eln) {
-    int remaining_this_eln = eln->element_count - rb->isect_scheduled_up_to_index;
-    int added_count = MIN2(remaining, remaining_this_eln);
-    remaining -= added_count;
-    if (remaining || added_count == remaining_this_eln) {
-      eln = eln->next;
-      rb->isect_scheduled_up_to = eln;
-      rb->isect_scheduled_up_to_index = 0;
-    }
-    else {
-      rb->isect_scheduled_up_to_index += added_count;
-    }
-  }
-
-  th->pending_to = eln ? eln : rb->triangle_buffer_pointers.last;
-  th->index_to = rb->isect_scheduled_up_to_index;
-
-  BLI_spin_unlock(&rb->lock_task);
-
-  return true;
+  if (th->current_pending == th->max_pending) {
+
+    LineartElementLinkNode **new_array = MEM_mallocN(
+        sizeof(LineartElementLinkNode *) * th->max_pending * 2, "LineartIsecSingle");
+    memcpy(
+        new_array, th->pending_triangle_nodes, sizeof(LineartElementLinkNode *) * th->max_pending);
+    th->max_pending *= 2;
+    MEM_freeN(th->pending_triangle_nodes);
+    th->pending_triangle_nodes = new_array;
+  }
+  th->pending_triangle_nodes[th->current_pending] = eln;
+  th->count_pending += eln->element_count;
+  th->current_pending++;
 }
 
 static void lineart_init_isec_thread(LineartIsecData *d, LineartRenderBuffer *rb, int thread_count)
@@ -3687,10 +3666,6 @@ static void lineart_init_isec_thread(LineartIsecData *d, LineartRenderBuffer *rb
   d->threads = MEM_callocN(sizeof(LineartIsecThread) * thread_count, "LineartIsecThread arr");
   d->rb = rb;
   d->thread_count = thread_count;
-
-  rb->isect_scheduled_up_to = rb->triangle_buffer_pointers.first;
-  rb->isect_scheduled_up_to_index = 0;
-
   for (int i = 0; i < thread_count; i++) {
     LineartIsecThread *it = &d->threads[i];
     it->array = MEM_mallocN(sizeof(LineartIsecSingle) * 100, "LineartIsecSingle arr");
@@ -3702,9 +3677,26 @@ static void lineart_init_isec_thread(LineartIsecData *d, LineartRenderBuffer *rb
 #define OBJ_PER_ISEC_THREAD 8 /* Largely arbitrary, no need to be big. */
   for (int i = 0; i < thread_count; i++) {
     LineartIsecThread *it = &d->threads[i];
+    it->pending_triangle_nodes = MEM_mallocN(
+        sizeof(LineartElementLinkNode *) * OBJ_PER_ISEC_THREAD, "LineartIsec eln arr");
+    it->max_pending = OBJ_PER_ISEC_THREAD;
+    it->current_pending = 0;
     it->rb = rb;
   }
 #undef OBJ_PER_ISEC_THREAD
+
+  for (LineartElementLinkNode *eln = rb->triangle_buffer_pointers.first; eln; eln = eln->next) {
+    /* Find threads with least triangle count inside. */
+    LineartIsecThread *min_tri = &d->threads[0];
+    for (int i = 0; i < thread_count; i++) {
+      LineartIsecThread *it = &d->threads[i];
+      if (min_tri->count_pending > it->count_pending) {
+        min_tri = it;
+      }
+    }
+    /* Assign it. */
+    lineart_add_eln_thread(min_tri, eln);
+  }
 }
 
 static void lineart_destroy_isec_thread(LineartIsecData *d)
@@ -3712,6 +3704,7 @@ static void lineart_destroy_isec_thread(LineartIsecData *d)
   for (int i = 0; i < d->thread_count; i++) {
     LineartIsecThread *it = &d->threads[i];
     MEM_freeN(it->array);
+    MEM_freeN(it->pending_triangle_nodes);
   }
   MEM_freeN(d->threads);
 }
@@ -4715,48 +4708,45 @@ LineartBoundingArea *MOD_lineart_get_bounding_area(LineartRenderBuffer *rb, doub
 
 static void lineart_add_triangles_worker(TaskPool *__restrict UNUSED(pool), LineartIsecThread *th)
 {
-  LineartRenderBuffer *rb = th->rb;
-  int _dir_control = 0;
-  while (lineart_schedule_new_triangle_task(th)) {
-    for (LineartElementLinkNode *eln = th->pending_from; eln != th->pending_to->next;
-         eln = eln->next) {
-      int index_start = eln == th->pending_from ? th->index_from : 0;
-      int index_end = eln == th->pending_to ? th->index_to : eln->element_count;
-      LineartTriangle *tri = (void *)(((uchar *)eln->pointer) + rb->triangle_size * index_start);
-      for (int ei = index_start; ei < index_end; ei++) {
-        int x1, x2, y1, y2;
-        int r, co;
-        LineartRenderBuffer *rb = th->rb;
-        if ((tri->flags & LRT_CULL_USED) || (tri->flags & LRT_CULL_DISCARD)) {
-          tri = (void *)(((uchar *)tri) + rb->triangle_size);
-          continue;
-        }
-        if (lineart_get_triangle_bounding_areas(rb, tri, &y1, &y2, &x1, &x2)) {
-          _dir_control++;
-          for (co = x1; co <= x2; co++) {
-            for (r = y1; r <= y2; r++) {
-              int col = co, row = r;
-              if (_dir_control % 2) {
-                col = x2 - (co - x1);
-              }
-              if ((_dir_control / 2) % 2) {
-                row = y2 - (r - y1);
-              }
-              lineart_bounding_area_link_triangle(
-                  rb,
-                  &rb->initial_bounding_areas[row * LRT_BA_ROWS + col],
-                  tri,
-                  0,
-                  1,
-                  0,
-                  (!(tri->flags & LRT_TRIANGLE_NO_INTERSECTION)),
-                  true,
-                  th);
-            }
-          }
-        } /* Else throw away. */
+  for (int ei = 0; ei < th->current_pending; ei++) {
+    LineartElementLinkNode *eln = th->pending_triangle_nodes[ei];
+    LineartTriangle *tri = eln->pointer;
+    int i, lim = eln->element_count;
+    int x1, x2, y1, y2;
+    int r, co;
+    LineartRenderBuffer *rb = th->rb;
+    int _dir_control = 0;
+
+    for (i = 0; i < lim; i++) {
+      if ((tri->flags & LRT_CULL_USED) || (tri->flags & LRT_CULL_DISCARD)) {
         tri = (void *)(((uchar *)tri) + rb->triangle_size);
+        continue;
       }
+      if (lineart_get_triangle_bounding_areas(rb, tri, &y1, &y2, &x1, &x2)) {
+        _dir_control++;
+        for (co = x1; co <= x2; co++) {
+          for (r = y1; r <= y2; r++) {
+            int col = co, row = r;
+            if (_dir_control % 2) {
+              col = x2 - (co - x1);
+            }
+            if ((_dir_control / 2) % 2) {
+              row = y2 - (r - y1);
+            }
+            lineart_bounding_area_link_triangle(
+                rb,
+                &rb->initial_bounding_areas[row * LRT_BA_ROWS + col],
+                tri,
+                0,
+                1,
+                0,
+                (!(tri->flags & LRT_TRIANGLE_NO_INTERSECTION)),
+                true,
+                th);
+          }
+        }
+      } /* Else throw away. */
+      tri = (void *)(((uchar *)tri) + rb->triangle_size);
     }
   }
 }
diff --git a/source/tools b/source/too

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list