[Bf-blender-cvs] [729b68d] depsgraph_refactor: Fixed logic for verify_entry_exit_ops()
Joshua Leung
noreply at git.blender.org
Thu Dec 18 05:09:29 CET 2014
Commit: 729b68dcbd41503ef1c4a0f6c1ee21b9cb5fbcd6
Author: Joshua Leung
Date: Thu Dec 18 16:55:49 2014 +1300
Branches: depsgraph_refactor
https://developer.blender.org/rB729b68dcbd41503ef1c4a0f6c1ee21b9cb5fbcd6
Fixed logic for verify_entry_exit_ops()
This was assuming that there were relationships between nodes when checking for
inlinks and outlinks. However, since relationships are computed in a later pass,
there are always none, and it ends up nearly always adding unncessary entry/exit
noops (unless there's just a single op in the component).
===================================================================
M source/blender/depsgraph/intern/depsgraph_build.cpp
===================================================================
diff --git a/source/blender/depsgraph/intern/depsgraph_build.cpp b/source/blender/depsgraph/intern/depsgraph_build.cpp
index 7f6e2aa..a2f4818 100644
--- a/source/blender/depsgraph/intern/depsgraph_build.cpp
+++ b/source/blender/depsgraph/intern/depsgraph_build.cpp
@@ -242,18 +242,23 @@ void DepsgraphNodeBuilder::verify_entry_exit_operations(ComponentDepsNode *node)
/* cache these in a vector, so we don't invalidate the iterators
* by adding operations inside the loop
*/
- OperationsVector entry_ops, exit_ops;
+ OperationsVector source_ops, sink_ops; /* nodes without any links (i.e. all of them when this gets called) */
+ OperationsVector entry_ops, exit_ops; /* nodes tagged as being entry/exit points */
for (ComponentDepsNode::OperationMap::const_iterator it = node->operations.begin(); it != node->operations.end(); ++it) {
OperationDepsNode *op_node = it->second;
/* entry node? */
- if (op_node->inlinks.empty())
+ if (op_node->optype == DEPSOP_TYPE_INIT)
entry_ops.push_back(op_node);
+ else if (op_node->inlinks.empty())
+ source_ops.push_back(op_node);
/* exit node? */
- if (op_node->outlinks.empty())
+ if (op_node->optype == DEPSOP_TYPE_POST)
exit_ops.push_back(op_node);
+ else if (op_node->outlinks.empty())
+ sink_ops.push_back(op_node);
}
if (entry_ops.size() == 1) {
@@ -268,6 +273,14 @@ void DepsgraphNodeBuilder::verify_entry_exit_operations(ComponentDepsNode *node)
m_graph->add_new_relation(node->entry_operation, op_node, DEPSREL_TYPE_OPERATION, "Component entry relation");
}
}
+ else if (source_ops.size() == 1) {
+ /* single unlinked op, just use directly */
+ node->entry_operation = source_ops.front();
+ }
+ else if (source_ops.size() > 1) {
+ /* multiple unlinked op, add a barrier node as a single entry point */
+ // XXX: problematic for drivers
+ }
if (exit_ops.size() == 1) {
/* single exit op, just use this directly */
@@ -281,6 +294,14 @@ void DepsgraphNodeBuilder::verify_entry_exit_operations(ComponentDepsNode *node)
m_graph->add_new_relation(op_node, node->exit_operation, DEPSREL_TYPE_OPERATION, "Component exit relation");
}
}
+ else if (sink_ops.size() == 1) {
+ /* single unlinked op, just use this directly */
+ node->exit_operation = sink_ops.front();
+ }
+ else if (sink_ops.size() > 1) {
+ /* multiple unlinked ops, add a barrier node as a single exit point */
+ // XXX: problematic for drivers
+ }
}
void DepsgraphNodeBuilder::verify_entry_exit_operations()
More information about the Bf-blender-cvs
mailing list