From 752fc35fa15b6bfee0309354ffcbf5c78211e8a6 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Wed, 24 Jan 2018 11:46:54 +0100 Subject: Depsgraph: Fix crash entering edit mode with CoW enabled The issue was caused by some incompatibility of new API which expects ID block to be specified explicitly, while old code is tagging object's data using object's ID with OB_RECALC_DATA flag. We need to switch all areas to give proper ID and everything, but for until then we'd better stop crashing. --- source/blender/depsgraph/intern/depsgraph_tag.cc | 61 ++++++++++++++++++------ 1 file changed, 47 insertions(+), 14 deletions(-) (limited to 'source') diff --git a/source/blender/depsgraph/intern/depsgraph_tag.cc b/source/blender/depsgraph/intern/depsgraph_tag.cc index e7c13083343..f63a4c90427 100644 --- a/source/blender/depsgraph/intern/depsgraph_tag.cc +++ b/source/blender/depsgraph/intern/depsgraph_tag.cc @@ -262,6 +262,47 @@ void depsgraph_update_editors_tag(Main *bmain, Depsgraph *graph, ID *id) deg_editors_id_update(&update_ctx, id); } +void depsgraph_tag_component(Depsgraph *graph, + IDDepsNode *id_node, + eDepsNode_Type component_type, + eDepsOperation_Code operation_code) +{ + ComponentDepsNode *component_node = + id_node->find_component(component_type); + if (component_node == NULL) { + return; + } + if (operation_code == DEG_OPCODE_OPERATION) { + component_node->tag_update(graph); + } + else { + OperationDepsNode *operation_node = + component_node->find_operation(operation_code); + if (operation_node != NULL) { + operation_node->tag_update(graph); + } + } +} + +/* This is a tag compatibility with legacy code. + * + * Mainly, old code was tagging object with OB_RECALC_DATA tag to inform + * that object's data datablock changed. Now API expects that ID is given + * explicitly, but not all areas are aware of this yet. + */ +void deg_graph_id_tag_legacy_compat(Main *bmain, + ID *id, + eDepsgraph_Tag tag) +{ + if (tag == DEG_TAG_GEOMETRY && GS(id->name) == ID_OB) { + Object *object = (Object *)id; + ID *data_id = (ID *)object->data; + if (data_id != NULL) { + DEG_id_tag_update_ex(bmain, data_id, 0); + } + } +} + void deg_graph_id_tag_update_single_flag(Main *bmain, Depsgraph *graph, ID *id, @@ -303,21 +344,13 @@ void deg_graph_id_tag_update_single_flag(Main *bmain, id_node->tag_update(graph); } else { - ComponentDepsNode *component_node = - id_node->find_component(component_type); - if (component_node != NULL) { - if (operation_code == DEG_OPCODE_OPERATION) { - component_node->tag_update(graph); - } - else { - OperationDepsNode *operation_node = - component_node->find_operation(operation_code); - if (operation_node != NULL) { - operation_node->tag_update(graph); - } - } - } + depsgraph_tag_component(graph, id_node, component_type, operation_code); } + /* TODO(sergey): Get rid of this once all areas are using proper data ID + * for tagging. + */ + deg_graph_id_tag_legacy_compat(bmain, id, tag); + } void deg_graph_id_tag_update(Main *bmain, Depsgraph *graph, ID *id, int flag) -- cgit v1.2.3