diff options
Diffstat (limited to 'source/blender/bmesh')
-rw-r--r-- | source/blender/bmesh/intern/bmesh_mesh.c | 17 |
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 */ |