diff options
Diffstat (limited to 'source/blender/modifiers/intern/MOD_fluid.c')
-rw-r--r-- | source/blender/modifiers/intern/MOD_fluid.c | 44 |
1 files changed, 39 insertions, 5 deletions
diff --git a/source/blender/modifiers/intern/MOD_fluid.c b/source/blender/modifiers/intern/MOD_fluid.c index a14d582063a..e087b8411f8 100644 --- a/source/blender/modifiers/intern/MOD_fluid.c +++ b/source/blender/modifiers/intern/MOD_fluid.c @@ -25,6 +25,7 @@ #include "MEM_guardedalloc.h" +#include "BLI_task.h" #include "BLI_utildefines.h" #include "BLT_translation.h" @@ -112,6 +113,31 @@ static void requiredDataMask(Object *UNUSED(ob), } } +typedef struct FluidIsolationData { + Depsgraph *depsgraph; + Object *object; + Mesh *mesh; + FluidModifierData *fmd; + + Mesh *result; +} FluidIsolationData; + +#ifdef WITH_FLUID +static void fluid_modifier_do_isolated(void *userdata) +{ + FluidIsolationData *isolation_data = (FluidIsolationData *)userdata; + + Scene *scene = DEG_get_evaluated_scene(isolation_data->depsgraph); + + Mesh *result = BKE_fluid_modifier_do(isolation_data->fmd, + isolation_data->depsgraph, + scene, + isolation_data->object, + isolation_data->mesh); + isolation_data->result = result ? result : isolation_data->mesh; +} +#endif /* WITH_FLUID */ + static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *me) { #ifndef WITH_FLUID @@ -119,16 +145,24 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh * return me; #else FluidModifierData *fmd = (FluidModifierData *)md; - Mesh *result = NULL; if (ctx->flag & MOD_APPLY_ORCO) { return me; } - Scene *scene = DEG_get_evaluated_scene(ctx->depsgraph); - - result = BKE_fluid_modifier_do(fmd, ctx->depsgraph, scene, ctx->object, me); - return result ? result : me; + /* Isolate execution of Mantaflow when running from dependency graph. The reason for this is + * because Mantaflow uses TBB to parallel its own computation which without isolation will start + * stealing tasks from dependency graph. Stealing tasks from the dependency graph might cause + * a recursive lock when Python drivers are used (because Mantaflow is interfaced via Python as + * well. */ + FluidIsolationData isolation_data; + isolation_data.depsgraph = ctx->depsgraph; + isolation_data.object = ctx->object; + isolation_data.mesh = me; + isolation_data.fmd = fmd; + BLI_task_isolate(fluid_modifier_do_isolated, &isolation_data); + + return isolation_data.result; #endif /* WITH_FLUID */ } |