[Bf-blender-cvs] [62e2bbd068d] blender2.8: Fix T57488: crash in Shrinkwrap constraint due to unsafe multi-threading.

Alexander Gavrilov noreply at git.blender.org
Mon Oct 29 18:34:31 CET 2018


Commit: 62e2bbd068dd689620063ccf9e75db71e9931056
Author: Alexander Gavrilov
Date:   Mon Oct 29 20:30:31 2018 +0300
Branches: blender2.8
https://developer.blender.org/rB62e2bbd068dd689620063ccf9e75db71e9931056

Fix T57488: crash in Shrinkwrap constraint due to unsafe multi-threading.

- Constraints must not use mesh_get_eval_final as it isn't thread-safe.
- Depsgraph should keep lastDataMask when re-running COW.

===================================================================

M	source/blender/blenkernel/intern/constraint.c
M	source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc

===================================================================

diff --git a/source/blender/blenkernel/intern/constraint.c b/source/blender/blenkernel/intern/constraint.c
index f343a62eaf7..f44f13ac4d5 100644
--- a/source/blender/blenkernel/intern/constraint.c
+++ b/source/blender/blenkernel/intern/constraint.c
@@ -3411,7 +3411,7 @@ static void shrinkwrap_flush_tars(bConstraint *con, ListBase *list, bool no_copy
 }
 
 
-static void shrinkwrap_get_tarmat(struct Depsgraph *depsgraph, bConstraint *con, bConstraintOb *cob, bConstraintTarget *ct, float UNUSED(ctime))
+static void shrinkwrap_get_tarmat(struct Depsgraph *UNUSED(depsgraph), bConstraint *con, bConstraintOb *cob, bConstraintTarget *ct, float UNUSED(ctime))
 {
 	bShrinkwrapConstraint *scon = (bShrinkwrapConstraint *) con->data;
 
@@ -3423,7 +3423,7 @@ static void shrinkwrap_get_tarmat(struct Depsgraph *depsgraph, bConstraint *con,
 		float track_no[3] = {0.0f, 0.0f, 0.0f};
 
 		SpaceTransform transform;
-		Mesh *target_eval = mesh_get_eval_final(depsgraph, DEG_get_input_scene(depsgraph), ct->tar, CD_MASK_BAREMESH);
+		Mesh *target_eval = ct->tar->runtime.mesh_eval;
 
 		copy_m4_m4(ct->matrix, cob->matrix);
 
@@ -4156,8 +4156,7 @@ static void followtrack_evaluate(bConstraint *con, bConstraintOb *cob, ListBase
 
 			if (data->depth_ob) {
 				Object *depth_ob = data->depth_ob;
-				Mesh *target_eval = mesh_get_eval_final(
-				                        depsgraph, DEG_get_input_scene(depsgraph), depth_ob, CD_MASK_BAREMESH);
+				Mesh *target_eval = depth_ob->runtime.mesh_eval;
 				if (target_eval) {
 					BVHTreeFromMesh treeData = NULL_BVHTreeFromMesh;
 					BVHTreeRayHit hit;
diff --git a/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc b/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc
index d7575c35e45..f6c3703a703 100644
--- a/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc
+++ b/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc
@@ -725,6 +725,7 @@ static void deg_update_copy_on_write_animation(const Depsgraph *depsgraph,
 typedef struct ObjectRuntimeBackup {
 	Object_Runtime runtime;
 	short base_flag;
+	CustomDataMask lastDataMask;
 } ObjectRuntimeBackup;
 
 /* Make a backup of object's evaluation runtime data, additionally
@@ -748,6 +749,7 @@ static void deg_backup_object_runtime(
 	}
 	/* Make a backup of base flags. */
 	object_runtime_backup->base_flag = object->base_flag;
+	object_runtime_backup->lastDataMask = object->lastDataMask;
 }
 
 static void deg_restore_object_runtime(
@@ -782,6 +784,7 @@ static void deg_restore_object_runtime(
 		}
 	}
 	object->base_flag = object_runtime_backup->base_flag;
+	object->lastDataMask = object_runtime_backup->lastDataMask;
 }
 
 ID *deg_update_copy_on_write_datablock(const Depsgraph *depsgraph,



More information about the Bf-blender-cvs mailing list