[Bf-blender-cvs] [a17de773fd8] blender2.8: Merge branch 'master' into blender2.8
Sergey Sharybin
noreply at git.blender.org
Thu Feb 22 11:21:48 CET 2018
Commit: a17de773fd86320c33668cd6d22e9d31954d2b34
Author: Sergey Sharybin
Date: Thu Feb 22 11:20:28 2018 +0100
Branches: blender2.8
https://developer.blender.org/rBa17de773fd86320c33668cd6d22e9d31954d2b34
Merge branch 'master' into blender2.8
===================================================================
===================================================================
diff --cc source/blender/depsgraph/CMakeLists.txt
index c42d06bd0a2,50c0910ef02..c2f69343456
--- a/source/blender/depsgraph/CMakeLists.txt
+++ b/source/blender/depsgraph/CMakeLists.txt
@@@ -42,10 -42,10 +42,11 @@@ set(INC_SY
set(SRC
intern/builder/deg_builder.cc
intern/builder/deg_builder_cycle.cc
+ intern/builder/deg_builder_map.cc
intern/builder/deg_builder_nodes.cc
+ intern/builder/deg_builder_nodes_layer_collection.cc
intern/builder/deg_builder_nodes_rig.cc
- intern/builder/deg_builder_nodes_scene.cc
+ intern/builder/deg_builder_nodes_view_layer.cc
intern/builder/deg_builder_pchanmap.cc
intern/builder/deg_builder_relations.cc
intern/builder/deg_builder_relations_keys.cc
diff --cc source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
index b65c16591dc,7572ee90c0b..d115111b7e8
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
@@@ -174,44 -161,11 +174,44 @@@ DepsgraphNodeBuilder::DepsgraphNodeBuil
DepsgraphNodeBuilder::~DepsgraphNodeBuilder()
{
+ if (cow_id_hash_ != NULL) {
+ BLI_ghash_free(cow_id_hash_, NULL, free_copy_on_write_datablock);
+ }
}
- IDDepsNode *DepsgraphNodeBuilder::add_id_node(ID *id, bool do_tag)
+ IDDepsNode *DepsgraphNodeBuilder::add_id_node(ID *id)
{
- return graph_->add_id_node(id, id->name);
+ if (!DEG_depsgraph_use_copy_on_write()) {
- return graph_->add_id_node(id, do_tag);
++ return graph_->add_id_node(id);
+ }
+ IDDepsNode *id_node = NULL;
+ ID *id_cow = (ID *)BLI_ghash_lookup(cow_id_hash_, id);
+ if (id_cow != NULL) {
+ /* TODO(sergey): Is it possible to lookup and pop element from GHash
+ * at the same time?
+ */
+ BLI_ghash_remove(cow_id_hash_, id, NULL, NULL);
+ }
- id_node = graph_->add_id_node(id, do_tag, id_cow);
++ id_node = graph_->add_id_node(id, id_cow);
+ /* Currently all ID nodes are supposed to have copy-on-write logic.
+ *
+ * NOTE: Zero number of components indicates that ID node was just created.
+ */
+ if (BLI_ghash_len(id_node->components) == 0) {
+ ComponentDepsNode *comp_cow =
+ id_node->add_component(DEG_NODE_TYPE_COPY_ON_WRITE);
+ OperationDepsNode *op_cow = comp_cow->add_operation(
+ function_bind(deg_evaluate_copy_on_write, _1, graph_, id_node),
+ DEG_OPCODE_COPY_ON_WRITE,
+ "", -1);
+ graph_->operations.push_back(op_cow);
+ }
+ return id_node;
+}
+
+IDDepsNode *DepsgraphNodeBuilder::find_id_node(ID *id)
+{
+ return graph_->find_id_node(id);
}
TimeSourceDepsNode *DepsgraphNodeBuilder::add_time_source()
@@@ -322,156 -276,46 +322,137 @@@ OperationDepsNode *DepsgraphNodeBuilder
return find_operation_node(id, comp_type, "", opcode, name, name_tag);
}
+ID *DepsgraphNodeBuilder::get_cow_id(const ID *id_orig) const
+{
+ return graph_->get_cow_id(id_orig);
+}
+
+ID *DepsgraphNodeBuilder::ensure_cow_id(ID *id_orig)
+{
+ if (id_orig->tag & LIB_TAG_COPY_ON_WRITE) {
+ /* ID is already remapped to copy-on-write. */
+ return id_orig;
+ }
- IDDepsNode *id_node = add_id_node(id_orig, false);
++ IDDepsNode *id_node = add_id_node(id_orig);
+ return id_node->id_cow;
+}
+
+ID *DepsgraphNodeBuilder::expand_cow_id(IDDepsNode *id_node)
+{
+ return deg_expand_copy_on_write_datablock(graph_, id_node, this, true);
+}
+
+ID *DepsgraphNodeBuilder::expand_cow_id(ID *id_orig)
+{
+ IDDepsNode *id_node = add_id_node(id_orig);
+ return expand_cow_id(id_node);
+}
+
/* **** Build functions for entity nodes **** */
void DepsgraphNodeBuilder::begin_build() {
- /* LIB_TAG_DOIT is used to indicate whether node for given ID was already
- * created or not. This flag is being set in add_id_node(), so functions
- * shouldn't bother with setting it, they only might query this flag when
- * needed.
- */
- BKE_main_id_tag_all(bmain_, LIB_TAG_DOIT, false);
- /* XXX nested node trees are not included in tag-clearing above,
- * so we need to do this manually.
- */
- FOREACH_NODETREE(bmain_, nodetree, id)
- {
- if (id != (ID *)nodetree) {
- nodetree->id.tag &= ~LIB_TAG_DOIT;
- }
- }
- FOREACH_NODETREE_END;
-
+ if (DEG_depsgraph_use_copy_on_write()) {
+ /* Store existing copy-on-write versions of datablock, so we can re-use
+ * them for new ID nodes.
+ */
+ cow_id_hash_ = BLI_ghash_ptr_new("Depsgraph id hash");
+ foreach (IDDepsNode *id_node, graph_->id_nodes) {
+ if (deg_copy_on_write_is_expanded(id_node->id_cow)) {
+ BLI_ghash_insert(cow_id_hash_,
+ id_node->id_orig,
+ id_node->id_cow);
+ id_node->id_cow = NULL;
+ }
+ }
+ }
+
+ GSET_FOREACH_BEGIN(OperationDepsNode *, op_node, graph_->entry_tags)
+ {
+ ComponentDepsNode *comp_node = op_node->owner;
+ IDDepsNode *id_node = comp_node->owner;
+
+ SavedEntryTag entry_tag;
+ entry_tag.id = id_node->id_orig;
+ entry_tag.component_type = comp_node->type;
+ entry_tag.opcode = op_node->opcode;
+ saved_entry_tags_.push_back(entry_tag);
+ };
+ GSET_FOREACH_END();
+
+ /* Make sure graph has no nodes left from previous state. */
+ graph_->clear_all_nodes();
+ graph_->operations.clear();
+ BLI_gset_clear(graph_->entry_tags, NULL);
+}
+
+void DepsgraphNodeBuilder::end_build()
+{
+ foreach (const SavedEntryTag& entry_tag, saved_entry_tags_) {
+ IDDepsNode *id_node = find_id_node(entry_tag.id);
+ if (id_node == NULL) {
+ continue;
+ }
+ ComponentDepsNode *comp_node =
+ id_node->find_component(entry_tag.component_type);
+ if (comp_node == NULL) {
+ continue;
+ }
+ OperationDepsNode *op_node = comp_node->find_operation(entry_tag.opcode);
+ if (op_node == NULL) {
+ continue;
+ }
+ op_node->tag_update(graph_);
+ }
}
-void DepsgraphNodeBuilder::build_group(Base *base, Group *group)
+void DepsgraphNodeBuilder::build_group(Group *group)
{
- ID *group_id = &group->id;
- if (group_id->tag & LIB_TAG_DOIT) {
+ if (built_map_.checkIsBuiltAndTag(group)) {
return;
}
- group_id->tag |= LIB_TAG_DOIT;
- LISTBASE_FOREACH (GroupObject *, go, &group->gobject) {
- build_object(base, go->ob);
+ /* Build group objects. */
+ LISTBASE_FOREACH (Base *, base, &group->view_layer->object_bases) {
+ build_object(NULL, base->object, DEG_ID_LINKED_INDIRECTLY);
}
+ /* Operation to evaluate the whole view layer.
+ *
+ * NOTE: We re-use DONE opcode even though the function does everything.
+ * This way we wouldn't need to worry about possible relations from DONE,
+ * regardless whether it's a group or scene or something else.
+ */
- add_id_node(group_id);
++ add_id_node(&group->id);
+ Group *group_cow = get_cow_datablock(group);
- add_operation_node(group_id,
++ add_operation_node(&group->id,
+ DEG_NODE_TYPE_LAYER_COLLECTIONS,
+ function_bind(BKE_group_eval_view_layers,
+ _1,
+ group_cow),
+ DEG_OPCODE_VIEW_LAYER_DONE);
}
-void DepsgraphNodeBuilder::build_object(Base *base, Object *object)
+void DepsgraphNodeBuilder::build_object(Base *base,
+ Object *object,
+ eDepsNode_LinkedState_Type linked_state)
{
+ const bool has_object = built_map_.checkIsBuiltAndTag(object);
- IDDepsNode *id_node = (has_object)
- ? graph_->find_id_node(&object->id)
- : add_id_node(&object->id);
- /* Update node layers.
- * Do it for both new and existing ID nodes. This is so because several
- * bases might be sharing same object.
- */
- if (base != NULL) {
- id_node->layers |= base->lay;
- }
- if (object->type == OB_CAMERA) {
- /* Camera should always be updated, it used directly by viewport.
- *
- * TODO(sergey): Make it only for active scene camera.
- */
- id_node->layers |= (unsigned int)(-1);
- }
/* Skip rest of components if the ID node was already there. */
- if (object->id.tag & LIB_TAG_DOIT) {
+ if (has_object) {
+ IDDepsNode *id_node = find_id_node(&object->id);
+ /* We need to build some extra stuff if object becomes linked
+ * directly.
+ */
+ if (id_node->linked_state == DEG_ID_LINKED_INDIRECTLY) {
+ build_object_flags(base, object, linked_state);
+ }
+ id_node->linked_state = max(id_node->linked_state, linked_state);
return;
}
- object->id.tag |= LIB_TAG_DOIT;
+ /* Create ID node for object and begin init. */
+ IDDepsNode *id_node = add_id_node(&object->id);
+ id_node->linked_state = linked_state;
object->customdata_mask = 0;
+ /* Various flags, flushing from bases/collections. */
+ build_object_flags(base, object, linked_state);
/* Transform. */
build_object_transform(object);
/* Parent. */
@@@ -748,19 -545,16 +729,18 @@@ OperationDepsNode *DepsgraphNodeBuilder
/* Recursively build graph for world */
void DepsgraphNodeBuilder::build_world(World *world)
{
- ID *world_id = &world->id;
- if (world_id->tag & LIB_TAG_DOIT) {
+ if (built_map_.checkIsBuiltAndTag(world)) {
return;
}
- ID *world_id = &world->id;
- build_animdata(world_id);
+ /* Animation. */
- build_animdata(world_id);
++ build_animdata(&world->id);
/* world itself */
-- add_operation_node(world_id,
- DEG_NODE_TYPE_PARAMETERS,
- NULL,
- DEG_OPCODE_PARAMETERS_EVAL);
++ add_operation_node(&world->id,
+ DEG_NODE_TYPE_SHADING,
+ function_bind(BKE_world_eval,
+ _1,
+ get_cow_datablock(world)),
+ DEG_OPCODE_WORLD_UPDATE);
/* textures */
build_texture_stack(world->mtex);
/* world's nodetree */
@@@ -905,35 -673,8 +885,33 @@@ void DepsgraphNodeBuilder::build_partic
}
}
- /* pointcache */
- // TODO...
+ /* TODO(sergey): Do we need a point cache operations here? */
+ add_operation_node(&object->id,
+ DEG_NODE_TYPE_CACHE,
+ function_bind(BKE_ptcache_object_reset,
+ scene_cow,
+ ob_cow,
+
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list