diff options
author | Kévin Dietrich <kevin.dietrich@mailoo.org> | 2022-02-11 15:48:09 +0300 |
---|---|---|
committer | Kévin Dietrich <kevin.dietrich@mailoo.org> | 2022-02-11 15:48:09 +0300 |
commit | cc6ddfbf68fa702ad4c06d9eda0eefb62eb4c6c6 (patch) | |
tree | 1e7b0909f1867c9016f5477699c1f16e0e6dd636 /source | |
parent | a816eaa1ce69924e392b6208d64ffad5d71482c1 (diff) | |
parent | 2496a943848b2cb84e95b738929499b01bf3542c (diff) |
Merge remote-tracking branch 'origin/blender-v3.1-release'
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenkernel/intern/mesh_wrapper.c | 50 |
1 files changed, 36 insertions, 14 deletions
diff --git a/source/blender/blenkernel/intern/mesh_wrapper.c b/source/blender/blenkernel/intern/mesh_wrapper.c index de0097e9a9a..267020fb675 100644 --- a/source/blender/blenkernel/intern/mesh_wrapper.c +++ b/source/blender/blenkernel/intern/mesh_wrapper.c @@ -301,19 +301,10 @@ int BKE_mesh_wrapper_poly_len(const Mesh *me) /** \name CPU Subdivision Evaluation * \{ */ -Mesh *BKE_mesh_wrapper_ensure_subdivision(const Object *ob, Mesh *me) +static Mesh *mesh_wrapper_ensure_subdivision(const Object *ob, Mesh *me) { - ThreadMutex *mesh_eval_mutex = (ThreadMutex *)me->runtime.eval_mutex; - BLI_mutex_lock(mesh_eval_mutex); - - if (me->runtime.wrapper_type == ME_WRAPPER_TYPE_SUBD) { - BLI_mutex_unlock(mesh_eval_mutex); - return me->runtime.mesh_eval; - } - SubsurfModifierData *smd = BKE_object_get_last_subsurf_modifier(ob); if (!smd) { - BLI_mutex_unlock(mesh_eval_mutex); return me; } @@ -325,7 +316,6 @@ Mesh *BKE_mesh_wrapper_ensure_subdivision(const Object *ob, Mesh *me) mesh_settings.use_optimal_display = me->runtime.subsurf_use_optimal_display; if (mesh_settings.resolution < 3) { - BLI_mutex_unlock(mesh_eval_mutex); return me; } @@ -334,7 +324,6 @@ Mesh *BKE_mesh_wrapper_ensure_subdivision(const Object *ob, Mesh *me) SubdivSettings subdiv_settings; BKE_subsurf_modifier_subdiv_settings_init(&subdiv_settings, smd, apply_render); if (subdiv_settings.level == 0) { - BLI_mutex_unlock(mesh_eval_mutex); return me; } @@ -343,7 +332,6 @@ Mesh *BKE_mesh_wrapper_ensure_subdivision(const Object *ob, Mesh *me) Subdiv *subdiv = BKE_subsurf_modifier_subdiv_descriptor_ensure(smd, &subdiv_settings, me, false); if (subdiv == NULL) { /* Happens on bad topology, but also on empty input mesh. */ - BLI_mutex_unlock(mesh_eval_mutex); return me; } @@ -361,8 +349,42 @@ Mesh *BKE_mesh_wrapper_ensure_subdivision(const Object *ob, Mesh *me) me->runtime.wrapper_type = ME_WRAPPER_TYPE_SUBD; } - BLI_mutex_unlock(mesh_eval_mutex); return me->runtime.mesh_eval; } +typedef struct SubdivisionWrapperIsolatedTaskData { + const Object *ob; + Mesh *me; + Mesh *result; +} SubdivisionWrapperIsolatedTaskData; + +static void mesh_wrapper_ensure_subdivision_isolated(void *userdata) +{ + SubdivisionWrapperIsolatedTaskData *task_data = (SubdivisionWrapperIsolatedTaskData *)userdata; + const Object *ob = task_data->ob; + Mesh *me = task_data->me; + task_data->result = mesh_wrapper_ensure_subdivision(ob, me); +} + +Mesh *BKE_mesh_wrapper_ensure_subdivision(const Object *ob, Mesh *me) +{ + ThreadMutex *mesh_eval_mutex = (ThreadMutex *)me->runtime.eval_mutex; + BLI_mutex_lock(mesh_eval_mutex); + + if (me->runtime.wrapper_type == ME_WRAPPER_TYPE_SUBD) { + BLI_mutex_unlock(mesh_eval_mutex); + return me->runtime.mesh_eval; + } + + SubdivisionWrapperIsolatedTaskData task_data; + task_data.ob = ob; + task_data.me = me; + + /* Must isolate multithreaded tasks while holding a mutex lock. */ + BLI_task_isolate(mesh_wrapper_ensure_subdivision_isolated, &task_data); + + BLI_mutex_unlock(mesh_eval_mutex); + return task_data.result; +} + /** \} */ |