[Bf-blender-cvs] [8355955] master: Avoid openmp sections in BM_mesh_elem_index_ensure

Campbell Barton noreply at git.blender.org
Thu Jun 5 10:50:46 CEST 2014


Commit: 835595505858fcfcc106ce721c2f270923ead2b7
Author: Campbell Barton
Date:   Thu Jun 5 18:50:10 2014 +1000
https://developer.blender.org/rB835595505858fcfcc106ce721c2f270923ead2b7

Avoid openmp sections in BM_mesh_elem_index_ensure

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

M	source/blender/bmesh/intern/bmesh_mesh.c

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

diff --git a/source/blender/bmesh/intern/bmesh_mesh.c b/source/blender/bmesh/intern/bmesh_mesh.c
index 56a5702..e66d126 100644
--- a/source/blender/bmesh/intern/bmesh_mesh.c
+++ b/source/blender/bmesh/intern/bmesh_mesh.c
@@ -789,13 +789,22 @@ void bmesh_edit_end(BMesh *bm, BMOpTypeFlag type_flag)
 
 void BM_mesh_elem_index_ensure(BMesh *bm, const char htype)
 {
+	const char htype_needed = bm->elem_index_dirty & htype;
+
 #ifdef DEBUG
 	BM_ELEM_INDEX_VALIDATE(bm, "Should Never Fail!", __func__);
 #endif
 
-#pragma omp parallel sections if (bm->totvert + bm->totedge + bm->totface >= BM_OMP_LIMIT)
+	if (htype_needed == 0) {
+		goto finally;
+	}
+
+	/* skip if we only need to operate on one element */
+#pragma omp parallel sections if ((!ELEM5(htype_needed, BM_VERT, BM_EDGE, BM_FACE, BM_LOOP, BM_FACE | BM_LOOP)) && \
+	                              (bm->totvert + bm->totedge + bm->totface >= BM_OMP_LIMIT))
 	{
 #pragma omp section
+
 		{
 			if (htype & BM_VERT) {
 				if (bm->elem_index_dirty & BM_VERT) {
@@ -873,6 +882,8 @@ void BM_mesh_elem_index_ensure(BMesh *bm, const char htype)
 		}
 	}
 
+
+finally:
 	bm->elem_index_dirty &= ~htype;
 }
 
@@ -1005,7 +1016,7 @@ void BM_mesh_elem_table_ensure(BMesh *bm, const char htype)
 	BLI_assert(BM_mesh_elem_table_check(bm) == true);
 
 	if (htype_needed == 0) {
-		return;
+		goto finally;
 	}
 
 	if (htype_needed & BM_VERT) {
@@ -1066,19 +1077,12 @@ void BM_mesh_elem_table_ensure(BMesh *bm, const char htype)
 		}
 	}
 
+finally:
 	/* Only clear dirty flags when all the pointers and data are actually valid.
 	 * This prevents possible threading issues when dirty flag check failed but
 	 * data wasn't ready still.
 	 */
-	if (htype_needed & BM_VERT) {
-		bm->elem_table_dirty &= ~BM_VERT;
-	}
-	if (htype_needed & BM_EDGE) {
-		bm->elem_table_dirty &= ~BM_EDGE;
-	}
-	if (htype_needed & BM_FACE) {
-		bm->elem_table_dirty &= ~BM_FACE;
-	}
+	bm->elem_table_dirty &= ~htype_needed;
 }
 
 /* use BM_mesh_elem_table_ensure where possible to avoid full rebuild */




More information about the Bf-blender-cvs mailing list