[Bf-blender-cvs] [dbfaf575494] temp-lineart-contained: LineArt: Individual locks for each tile.

YimingWu noreply at git.blender.org
Wed Apr 20 05:09:11 CEST 2022


Commit: dbfaf575494f6dcca314eb4fd851d512060e9fc2
Author: YimingWu
Date:   Wed Apr 20 11:02:08 2022 +0800
Branches: temp-lineart-contained
https://developer.blender.org/rBdbfaf575494f6dcca314eb4fd851d512060e9fc2

LineArt: Individual locks for each tile.

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

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 716dc02ec30..245306b56bd 160000
--- a/release/datafiles/locale
+++ b/release/datafiles/locale
@@ -1 +1 @@
-Subproject commit 716dc02ec30c0810513f7b4adc4ae865ae50c4e6
+Subproject commit 245306b56bda2aa39af219c3dd705666363e2c54
diff --git a/release/scripts/addons b/release/scripts/addons
index 22c1eb5c3d5..754d05ac7eb 160000
--- a/release/scripts/addons
+++ b/release/scripts/addons
@@ -1 +1 @@
-Subproject commit 22c1eb5c3d505d85e953c3921317856af103a2eb
+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 a66412b854c..ac3cdc43235 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
+++ b/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
@@ -229,9 +229,6 @@ typedef struct LineartRenderBuffer {
   struct LineartBoundingArea *initial_bounding_areas;
   unsigned int bounding_area_initial_count;
 
-  /* Array of thread_count length for spatial locks. */
-  SpinLock *lock_bounding_areas;
-
   /* When splitting bounding areas, if there's an ortho camera placed at a straight angle, there
    * will be a lot of triangles aligned in line which can not be separated by continue subdividing
    * the tile. So we set a strict limit when using ortho camera. See eLineArtTileRecursiveLimit. */
@@ -467,7 +464,7 @@ typedef struct LineartBoundingArea {
   /** 1,2,3,4 quadrant */
   struct LineartBoundingArea *child;
 
-  SpinLock *lock;
+  SpinLock lock;
 
   ListBase lp;
   ListBase rp;
diff --git a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
index 2a3f7653bdb..3e19a0cad97 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
+++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
@@ -3792,6 +3792,16 @@ static void lineart_main_get_view_vector(LineartRenderBuffer *rb)
   copy_v3db_v3fl(rb->view_vector, trans);
 }
 
+static void lineart_end_bounding_area_recursive(LineartBoundingArea *ba)
+{
+  BLI_spin_end(&ba->lock);
+  if (ba->child) {
+    for (int i = 0; i < 4; i++) {
+      lineart_end_bounding_area_recursive(&ba->child[i]);
+    }
+  }
+}
+
 static void lineart_destroy_render_data(LineartRenderBuffer *rb)
 {
   if (rb == NULL) {
@@ -3818,7 +3828,7 @@ static void lineart_destroy_render_data(LineartRenderBuffer *rb)
   BLI_spin_end(&rb->render_data_pool.lock_mem);
 
   for (int i = 0; i < rb->bounding_area_initial_count; i++) {
-    BLI_spin_end(&rb->lock_bounding_areas[i]);
+    lineart_end_bounding_area_recursive(&rb->initial_bounding_areas[i]);
   }
 
   MEM_freeN(rb->pending_edges.array);
@@ -4019,10 +4029,8 @@ static void lineart_main_bounding_area_make_initial(LineartRenderBuffer *rb)
   rb->bounding_area_initial_count = sp_w * sp_h;
   rb->initial_bounding_areas = lineart_mem_acquire(
       &rb->render_data_pool, sizeof(LineartBoundingArea) * rb->bounding_area_initial_count);
-  rb->lock_bounding_areas = lineart_mem_acquire(
-      &rb->render_data_pool, sizeof(SpinLock) * rb->bounding_area_initial_count);
   for (int i = 0; i < rb->bounding_area_initial_count; i++) {
-    BLI_spin_init(&rb->lock_bounding_areas[i]);
+    BLI_spin_init(&rb->initial_bounding_areas[i].lock);
   }
 
   int i_ba = 0;
@@ -4050,7 +4058,7 @@ static void lineart_main_bounding_area_make_initial(LineartRenderBuffer *rb)
                                              sizeof(LineartEdge *) * ba->max_line_count);
 
       /* Spatial lock assignment. */
-      ba->lock = &rb->lock_bounding_areas[i_ba % rb->bounding_area_initial_count];
+      BLI_spin_init(&ba->lock);
       i_ba++;
 
       /* Link adjacent ones. */
@@ -4423,7 +4431,7 @@ static void lineart_bounding_area_link_triangle(LineartRenderBuffer *rb,
    * bounding area r/w access for now, so whether we split or do anything inside the bounding area,
    * it's not relevant to other threads. */
   if (do_lock) {
-    BLI_spin_lock(root_ba->lock);
+    BLI_spin_lock(&root_ba->lock);
   }
 
   if (root_ba->child == NULL) {
@@ -4470,7 +4478,7 @@ static void lineart_bounding_area_link_triangle(LineartRenderBuffer *rb,
   }
 
   if (do_lock) {
-    BLI_spin_unlock(root_ba->lock);
+    BLI_spin_unlock(&root_ba->lock);
   }
 }
 
diff --git a/source/tools b/source/tools
index 1e658ca996f..f4af5ed5a70 160000
--- a/source/tools
+++ b/source/tools
@@ -1 +1 @@
-Subproject commit 1e658ca996f11e5ff3398d89bd81f5b719304a57
+Subproject commit f4af5ed5a705c5d048b137ba56a6cf9295681ec5



More information about the Bf-blender-cvs mailing list