Depsgraph: Fix wrong layers flush form children to parent
authorSergey Sharybin <sergey.vfx@gmail.com>
Mon, 30 May 2016 10:32:38 +0000 (12:32 +0200)
committerSergey Sharybin <sergey.vfx@gmail.com>
Mon, 30 May 2016 10:35:03 +0000 (12:35 +0200)
It was possible to have issues in cases when several child dependencies
goes to IDs with different layers. In this case order of flushing was not
really well defined, which could lead to cases when indirect dependency
via invisible object wouldn't work.

Need some sort of barrier to prevent scheduling of parent nodes for until
all children are done, but that's becoming quite nasty thing to implement.

Added a temp field to component for now. maybe it's not so crazy actually
and we might use it for evaluation as well, so we wouldn't flush updates
to components which does not affect visible stuff.

intern/cycles/blender/blender_curves.cpp
source/blender/depsgraph/intern/builder/deg_builder.cc
source/blender/depsgraph/intern/nodes/deg_node_component.cc
source/blender/depsgraph/intern/nodes/deg_node_component.h

index 8fbb2414741be5ce5e5986801b44bcff6615e9c4..a1e2617d66f2d365cc0556ba0b3d91c815a10c1a 100644 (file)
@@ -657,6 +657,7 @@ static void ExportCurveSegmentsMotion(Mesh *mesh, ParticleCurveData *CData, int
                                                radius = 0.0f;
 
                                        mP[i] = ickey_loc;
+                                       (void)radius;
 
                                        /* unlike mesh coordinates, these tend to be slightly different
                                         * between frames due to particle transforms into/out of object
index cf9b0cee6b24e19cc8e4d79e98be739a7acbe110..9f80c21a6a46473767769f2cf25a07bb1a1462fd 100644 (file)
@@ -61,9 +61,10 @@ void deg_graph_build_finalize(Depsgraph *graph)
        std::stack<OperationDepsNode *> stack;
 
        foreach (OperationDepsNode *node, graph->operations) {
+               IDDepsNode *id_node = node->owner->owner;
                node->done = 0;
                node->num_links_pending = 0;
-               foreach (DepsRelation *rel, node->inlinks) {
+               foreach (DepsRelation *rel, node->outlinks) {
                        if ((rel->from->type == DEPSNODE_TYPE_OPERATION) &&
                            (rel->flag & DEPSREL_FLAG_CYCLIC) == 0)
                        {
@@ -72,36 +73,33 @@ void deg_graph_build_finalize(Depsgraph *graph)
                }
                if (node->num_links_pending == 0) {
                        stack.push(node);
+                       node->done = 1;
                }
-               IDDepsNode *id_node = node->owner->owner;
+               node->owner->layers = id_node->layers;
                id_node->id->tag |= LIB_TAG_DOIT;
        }
 
        while (!stack.empty()) {
                OperationDepsNode *node = stack.top();
-               if (node->done == 0 && node->outlinks.size() != 0) {
-                       foreach (DepsRelation *rel, node->outlinks) {
-                               if (rel->to->type == DEPSNODE_TYPE_OPERATION) {
-                                       OperationDepsNode *to = (OperationDepsNode *)rel->to;
-                                       if ((rel->flag & DEPSREL_FLAG_CYCLIC) == 0) {
-                                               BLI_assert(to->num_links_pending > 0);
-                                               --to->num_links_pending;
-                                       }
-                                       if (to->num_links_pending == 0) {
-                                               stack.push(to);
-                                       }
-                               }
+               stack.pop();
+               /* Flush layers to parents. */
+               foreach (DepsRelation *rel, node->inlinks) {
+                       if (rel->from->type == DEPSNODE_TYPE_OPERATION) {
+                               OperationDepsNode *from = (OperationDepsNode *)rel->from;
+                               from->owner->layers |= node->owner->layers;
                        }
-                       node->done = 1;
                }
-               else {
-                       stack.pop();
-                       IDDepsNode *id_node = node->owner->owner;
-                       foreach (DepsRelation *rel, node->outlinks) {
-                               if (rel->to->type == DEPSNODE_TYPE_OPERATION) {
-                                       OperationDepsNode *to = (OperationDepsNode *)rel->to;
-                                       IDDepsNode *id_to = to->owner->owner;
-                                       id_node->layers |= id_to->layers;
+               /* Schedule parent nodes. */
+               foreach (DepsRelation *rel, node->inlinks) {
+                       if (rel->from->type == DEPSNODE_TYPE_OPERATION) {
+                               OperationDepsNode *from = (OperationDepsNode *)rel->from;
+                               if ((rel->flag & DEPSREL_FLAG_CYCLIC) == 0) {
+                                       BLI_assert(from->num_links_pending > 0);
+                                       --from->num_links_pending;
+                               }
+                               if (from->num_links_pending == 0 && from->done == 0) {
+                                       stack.push(from);
+                                       from->done = 1;
                                }
                        }
                }
@@ -110,6 +108,12 @@ void deg_graph_build_finalize(Depsgraph *graph)
        /* Re-tag IDs for update if it was tagged before the relations update tag. */
        GHASH_FOREACH_BEGIN(IDDepsNode *, id_node, graph->id_hash)
        {
+               GHASH_FOREACH_BEGIN(ComponentDepsNode *, comp, id_node->components)
+               {
+                       id_node->layers |= comp->layers;
+               }
+               GHASH_FOREACH_END();
+
                ID *id = id_node->id;
                if (id->tag & LIB_TAG_ID_RECALC_ALL &&
                    id->tag & LIB_TAG_DOIT)
index d18047c5112e421101559fd719c439a7c9c49fcc..c529e2ecfe660803360fb6643937045339da0ff8 100644 (file)
@@ -86,7 +86,8 @@ static void comp_node_hash_value_free(void *value_v)
 ComponentDepsNode::ComponentDepsNode() :
     entry_operation(NULL),
     exit_operation(NULL),
-    flags(0)
+    flags(0),
+    layers(0)
 {
        operations_map = BLI_ghash_new(comp_node_hash_key,
                                       comp_node_hash_key_cmp,
@@ -119,7 +120,10 @@ string ComponentDepsNode::identifier() const
        char typebuf[7];
        sprintf(typebuf, "(%d)", type);
 
-       return string(typebuf) + name + " : " + idname;
+       char layers[7];
+       sprintf(layers, "%d", this->layers);
+
+       return string(typebuf) + name + " : " + idname + " (Layers: " + layers + ")";
 }
 
 OperationDepsNode *ComponentDepsNode::find_operation(OperationIDKey key) const
index 17e6e7e0030c9537da58a364ea31f98b16bc1eca..df321ea9299d380188b0a9378a253334396d4806 100644 (file)
@@ -166,6 +166,9 @@ struct ComponentDepsNode : public DepsNode {
        // XXX: a poll() callback to check if component's first node can be started?
 
        int flags;
+
+       /* Temporary bitmask, used during graph construction. */
+       int layers;
 };
 
 /* ---------------------------------------- */