[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