[Bf-blender-cvs] [607a2d80d3f] cloth-improvements: Replace collision spinlocks with atomic_ops

Luca Rood noreply at git.blender.org
Mon Apr 3 18:00:55 CEST 2017


Commit: 607a2d80d3f3f9d8d77364915c66b268ecb08182
Author: Luca Rood
Date:   Mon Apr 3 16:49:38 2017 +0200
Branches: cloth-improvements
https://developer.blender.org/rB607a2d80d3f3f9d8d77364915c66b268ecb08182

Replace collision spinlocks with atomic_ops

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

M	source/blender/blenkernel/intern/collision.c

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

diff --git a/source/blender/blenkernel/intern/collision.c b/source/blender/blenkernel/intern/collision.c
index 0e7d5bb3f17..b89cfe76e9c 100644
--- a/source/blender/blenkernel/intern/collision.c
+++ b/source/blender/blenkernel/intern/collision.c
@@ -54,6 +54,8 @@
 #include "BLI_kdopbvh.h"
 #include "BKE_collision.h"
 
+#include "atomic_ops.h"
+
 #ifdef WITH_ELTOPO
 #include "eltopo-capi.h"
 #endif
@@ -70,18 +72,16 @@ typedef struct ColDetectData {
 	CollisionModifierData *collmd;
 	BVHTreeOverlap *overlap;
 	CollPair *collisions;
-	int *colind;
+	unsigned int *colind;
 	bool culling;
 	bool use_normal;
-	SpinLock *lock;
 } ColDetectData;
 
 typedef struct SelfColDetectData {
 	ClothModifierData *clmd;
 	BVHTreeOverlap *overlap;
 	CollPair *collisions;
-	int *colind;
-	SpinLock *lock;
+	unsigned int *colind;
 } SelfColDetectData;
 
 /***********************************
@@ -1027,7 +1027,7 @@ static void cloth_collision(void *userdata, void *UNUSED(userdata_chunk), const
 	ClothModifierData *clmd = data->clmd;
 	CollisionModifierData *collmd = data->collmd;
 	CollPair *collpair = data->collisions;
-	int *colind = data->colind;
+	unsigned int *colind = data->colind;
 	const MVertTri *tri_a, *tri_b;
 	ClothVertex *verts1 = clmd->clothObject->verts;
 	float distance = 0.0f;
@@ -1046,9 +1046,7 @@ static void cloth_collision(void *userdata, void *UNUSED(userdata_chunk), const
 	if ((distance <= (epsilon1 + epsilon2 + ALMOST_ZERO)) && (len_squared_v3(vect) > FLT_EPSILON)) {
 		int ind;
 
-		BLI_spin_lock(data->lock);
-		ind = ++(*colind);
-		BLI_spin_unlock(data->lock);
+		ind = atomic_add_and_fetch_u(colind, 1);
 
 		/* fill face_a */
 		collpair[ind].ap1 = tri_a->tri[0];
@@ -1077,7 +1075,7 @@ static void cloth_selfcollision(void *userdata, void *UNUSED(userdata_chunk), co
 
 	ClothModifierData *clmd = data->clmd;
 	CollPair *collpair = data->collisions;
-	int *colind = data->colind;
+	unsigned int *colind = data->colind;
 	const MVertTri *tri_a, *tri_b;
 	ClothVertex *verts1 = clmd->clothObject->verts;
 	float distance = 0.0f;
@@ -1110,9 +1108,7 @@ static void cloth_selfcollision(void *userdata, void *UNUSED(userdata_chunk), co
 	if ((distance <= (epsilon * 2.0f + ALMOST_ZERO)) && (len_squared_v3(vect) > FLT_EPSILON)) {
 		int ind;
 
-		BLI_spin_lock(data->lock);
-		ind = ++(*colind);
-		BLI_spin_unlock(data->lock);
+		ind = atomic_add_and_fetch_u(colind, 1);
 
 		/* fill face_a */
 		collpair[ind].ap1 = tri_a->tri[0];
@@ -1286,12 +1282,9 @@ void free_collider_cache(ListBase **colliders)
 }
 
 static void cloth_bvh_objcollisions_nearcheck(ClothModifierData * clmd, CollisionModifierData *collmd,
-                                              CollPair **collisions, int *colind, int numresult,
+                                              CollPair **collisions, unsigned int *colind, int numresult,
                                               BVHTreeOverlap *overlap, bool culling, bool use_normal)
 {
-	SpinLock lock;
-	BLI_spin_init(&lock);
-
 	*collisions = (CollPair *)MEM_mallocN(sizeof(CollPair) * numresult, "collision array");
 	*colind = -1;
 
@@ -1301,35 +1294,26 @@ static void cloth_bvh_objcollisions_nearcheck(ClothModifierData * clmd, Collisio
 	                      .collisions = *collisions,
 	                      .colind = colind,
 	                      .culling = culling,
-	                      .use_normal = use_normal,
-	                      .lock = &lock};
+	                      .use_normal = use_normal};
 
 	BLI_task_parallel_range_ex(0, numresult, &data, NULL, 0, cloth_collision, true, false);
-
-	BLI_spin_end(&lock);
 }
 
-static void cloth_bvh_selfcollisions_nearcheck(ClothModifierData * clmd, CollPair *collisions, int *colind,
+static void cloth_bvh_selfcollisions_nearcheck(ClothModifierData * clmd, CollPair *collisions, unsigned int *colind,
                                                int numresult, BVHTreeOverlap *overlap)
 {
-	SpinLock lock;
-	BLI_spin_init(&lock);
-
 	*colind = -1;
 
 	SelfColDetectData data = {.clmd = clmd,
 	                          .overlap = overlap,
 	                          .collisions = collisions,
-	                          .colind = colind,
-	                          .lock = &lock};
+	                          .colind = colind};
 
 	BLI_task_parallel_range_ex(0, numresult, &data, NULL, 0, cloth_selfcollision, true, false);
-
-	BLI_spin_end(&lock);
 }
 
 static int cloth_bvh_objcollisions_resolve (ClothModifierData * clmd, Object **collobjs, CollPair **collisions,
-                                            int *collisions_index, const unsigned int numcollobj, const float dt)
+                                            unsigned int *collisions_index, const unsigned int numcollobj, const float dt)
 {
 	Cloth *cloth = clmd->clothObject;
 	int i = 0, j = 0, mvert_num = 0;
@@ -1489,7 +1473,7 @@ int cloth_bvh_objcollision(Object *ob, ClothModifierData *clmd, float step, floa
 
 		if (clmd->coll_parms->flags & CLOTH_COLLSETTINGS_FLAG_ENABLED) {
 			CollPair **collisions;
-			int *collisions_index;
+			unsigned int *collisions_index;
 
 			collisions = MEM_callocN(sizeof(CollPair *) *numcollobj, "CollPair");
 			collisions_index = MEM_callocN(sizeof(*collisions_index) *numcollobj, "CollPair");
@@ -1538,7 +1522,7 @@ int cloth_bvh_objcollision(Object *ob, ClothModifierData *clmd, float step, floa
 			BVHTreeOverlap *overlap = NULL;
 			unsigned int result = 0;
 			CollPair *collisions = NULL;
-			int collisions_index;
+			unsigned int collisions_index;
 
 			// collisions = 1;
 			verts = cloth->verts; // needed for openMP




More information about the Bf-blender-cvs mailing list