diff options
author | Jacques Lucke <jacques@blender.org> | 2022-02-08 14:12:49 +0300 |
---|---|---|
committer | Jacques Lucke <jacques@blender.org> | 2022-02-08 14:12:49 +0300 |
commit | de718605558f31fd67d8f135c8e25d9fb9b6ac67 (patch) | |
tree | 037345705024f02659c30228015aa736ee9c6bd3 /source/blender/blenkernel/intern/mesh_normals.cc | |
parent | 1995aae6e3bf3c51b3945d6d31b4ad20fd11fb73 (diff) |
Fix T95570: missing task isolation when computing normals
Diffstat (limited to 'source/blender/blenkernel/intern/mesh_normals.cc')
-rw-r--r-- | source/blender/blenkernel/intern/mesh_normals.cc | 58 |
1 files changed, 35 insertions, 23 deletions
diff --git a/source/blender/blenkernel/intern/mesh_normals.cc b/source/blender/blenkernel/intern/mesh_normals.cc index 08a17060549..1b3c7e01be8 100644 --- a/source/blender/blenkernel/intern/mesh_normals.cc +++ b/source/blender/blenkernel/intern/mesh_normals.cc @@ -43,6 +43,7 @@ #include "BLI_span.hh" #include "BLI_stack.h" #include "BLI_task.h" +#include "BLI_task.hh" #include "BLI_utildefines.h" #include "BKE_customdata.h" @@ -373,22 +374,28 @@ const float (*BKE_mesh_vertex_normals_ensure(const Mesh *mesh))[3] return (const float(*)[3])CustomData_get_layer(&mesh->vdata, CD_NORMAL); } - Mesh &mesh_mutable = *const_cast<Mesh *>(mesh); + float(*vert_normals)[3]; + float(*poly_normals)[3]; - float(*vert_normals)[3] = BKE_mesh_vertex_normals_for_write(&mesh_mutable); - float(*poly_normals)[3] = BKE_mesh_poly_normals_for_write(&mesh_mutable); + /* Isolate task because a mutex is locked and computing normals is multi-threaded. */ + blender::threading::isolate_task([&]() { + Mesh &mesh_mutable = *const_cast<Mesh *>(mesh); - mesh_calc_normals_poly_and_vertex(mesh_mutable.mvert, - mesh_mutable.totvert, - mesh_mutable.mloop, - mesh_mutable.totloop, - mesh_mutable.mpoly, - mesh_mutable.totpoly, - poly_normals, - vert_normals); + vert_normals = BKE_mesh_vertex_normals_for_write(&mesh_mutable); + poly_normals = BKE_mesh_poly_normals_for_write(&mesh_mutable); - BKE_mesh_vertex_normals_clear_dirty(&mesh_mutable); - BKE_mesh_poly_normals_clear_dirty(&mesh_mutable); + mesh_calc_normals_poly_and_vertex(mesh_mutable.mvert, + mesh_mutable.totvert, + mesh_mutable.mloop, + mesh_mutable.totloop, + mesh_mutable.mpoly, + mesh_mutable.totpoly, + poly_normals, + vert_normals); + + BKE_mesh_vertex_normals_clear_dirty(&mesh_mutable); + BKE_mesh_poly_normals_clear_dirty(&mesh_mutable); + }); BLI_mutex_unlock(normals_mutex); return vert_normals; @@ -413,19 +420,24 @@ const float (*BKE_mesh_poly_normals_ensure(const Mesh *mesh))[3] return (const float(*)[3])CustomData_get_layer(&mesh->pdata, CD_NORMAL); } - Mesh &mesh_mutable = *const_cast<Mesh *>(mesh); + float(*poly_normals)[3]; + + /* Isolate task because a mutex is locked and computing normals is multi-threaded. */ + blender::threading::isolate_task([&]() { + Mesh &mesh_mutable = *const_cast<Mesh *>(mesh); - float(*poly_normals)[3] = BKE_mesh_poly_normals_for_write(&mesh_mutable); + poly_normals = BKE_mesh_poly_normals_for_write(&mesh_mutable); - BKE_mesh_calc_normals_poly(mesh_mutable.mvert, - mesh_mutable.totvert, - mesh_mutable.mloop, - mesh_mutable.totloop, - mesh_mutable.mpoly, - mesh_mutable.totpoly, - poly_normals); + BKE_mesh_calc_normals_poly(mesh_mutable.mvert, + mesh_mutable.totvert, + mesh_mutable.mloop, + mesh_mutable.totloop, + mesh_mutable.mpoly, + mesh_mutable.totpoly, + poly_normals); - BKE_mesh_poly_normals_clear_dirty(&mesh_mutable); + BKE_mesh_poly_normals_clear_dirty(&mesh_mutable); + }); BLI_mutex_unlock(normals_mutex); return poly_normals; |