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:
Diffstat (limited to 'source/blender/modifiers/intern/MOD_fluid.c')
-rw-r--r--source/blender/modifiers/intern/MOD_fluid.c44
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 */
}