Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/bmesh/intern/bmesh_mesh.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/source/blender/bmesh/intern/bmesh_mesh.c b/source/blender/bmesh/intern/bmesh_mesh.c
index 701fdf07710..175ef21953d 100644
--- a/source/blender/bmesh/intern/bmesh_mesh.c
+++ b/source/blender/bmesh/intern/bmesh_mesh.c
@@ -687,7 +687,6 @@ void BM_mesh_elem_table_ensure(BMesh *bm, const char htype)
bm->vtable = MEM_mallocN(sizeof(void **) * bm->totvert, "bm->vtable");
bm->vtable_tot = bm->totvert;
}
- bm->elem_table_dirty &= ~BM_VERT;
}
if (htype_needed & BM_EDGE) {
if (bm->etable && bm->totedge <= bm->etable_tot && bm->totedge * 2 >= bm->etable_tot) {
@@ -699,7 +698,6 @@ void BM_mesh_elem_table_ensure(BMesh *bm, const char htype)
bm->etable = MEM_mallocN(sizeof(void **) * bm->totedge, "bm->etable");
bm->etable_tot = bm->totedge;
}
- bm->elem_table_dirty &= ~BM_EDGE;
}
if (htype_needed & BM_FACE) {
if (bm->ftable && bm->totface <= bm->ftable_tot && bm->totface * 2 >= bm->ftable_tot) {
@@ -711,7 +709,6 @@ void BM_mesh_elem_table_ensure(BMesh *bm, const char htype)
bm->ftable = MEM_mallocN(sizeof(void **) * bm->totface, "bm->ftable");
bm->ftable_tot = bm->totface;
}
- bm->elem_table_dirty &= ~BM_FACE;
}
#pragma omp parallel sections if (bm->totvert + bm->totedge + bm->totface >= BM_OMP_LIMIT)
@@ -735,6 +732,20 @@ void BM_mesh_elem_table_ensure(BMesh *bm, const char htype)
}
}
}
+
+ /* 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;
+ }
}
/* use BM_mesh_elem_table_ensure where possible to avoid full rebuild */