diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations_drivers.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations_drivers.cc index 6aff7c1bfd2..95f6e3da410 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_relations_drivers.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_relations_drivers.cc @@ -245,12 +245,26 @@ bool data_path_maybe_shared(const ID &id, const StringRef data_path) /* As it is hard to generally detect implicit sharing, this is implemented as * a 'known to not share' list. */ + /* Allow concurrent writes to custom properties. #140706 shows that this + * shouldn't be a problem in practice. */ + if (data_path.startswith("[\"") && data_path.endswith("\"]")) { + return false; + } + if (GS(id.name) == ID_OB) { const Object &ob = *reinterpret_cast(&id); const bool is_thread_safe = (ob.type == OB_ARMATURE && data_path.startswith("pose.bones[")); return !is_thread_safe; } + /* Allow concurrent writes to shapekey values. #140706 shows that this + * shouldn't be a problem in practice. */ + if (GS(id.name) == ID_KE) { + const bool is_thread_safe = data_path.startswith("key_blocks[") && + data_path.endswith("].value"); + return !is_thread_safe; + } + return true; }