[Bf-blender-cvs] [64355e33232] lineart-shadow: LineArt: Individual locks for each tile.

YimingWu noreply at git.blender.org
Fri Apr 22 11:20:29 CEST 2022


Commit: 64355e332322454dcd53227e1f90b127d4f326b5
Author: YimingWu
Date:   Wed Apr 20 11:02:08 2022 +0800
Branches: lineart-shadow
https://developer.blender.org/rB64355e332322454dcd53227e1f90b127d4f326b5

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 a9d9c11e0f3..c69746040ce 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
+++ b/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
@@ -290,9 +290,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. */
@@ -572,7 +569,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 d96284d6b56..f5c410e9593 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
+++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
@@ -3953,6 +3953,16 @@ static void lineart_main_get_view_vector(LineartRenderBuffer *rb)
   }
 }
 
+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_keep_init(LineartRenderBuffer *rb)
 {
   if (rb == NULL) {
@@ -3969,8 +3979,14 @@ static void lineart_destroy_render_data_keep_init(LineartRenderBuffer *rb)
   if (rb->pending_edges.array) {
     MEM_freeN(rb->pending_edges.array);
   }
+
+  for (int i = 0; i < rb->bounding_area_initial_count; i++) {
+    lineart_end_bounding_area_recursive(&rb->initial_bounding_areas[i]);
+  }
+
   lineart_mem_destroy(&rb->render_data_pool);
 }
+
 static void lineart_destroy_render_data(LineartRenderBuffer *rb)
 {
   if (rb == NULL) {
@@ -3981,10 +3997,6 @@ static void lineart_destroy_render_data(LineartRenderBuffer *rb)
   BLI_spin_end(&rb->lock_cuts);
   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_destroy_render_data_keep_init(rb);
 }
 
@@ -4189,10 +4201,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;
@@ -4220,7 +4230,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. */
@@ -4593,7 +4603,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) {
@@ -4640,7 +4650,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