Merge branch 'master' into blender2.8
authorSergey Sharybin <sergey.vfx@gmail.com>
Mon, 23 Apr 2018 14:44:09 +0000 (16:44 +0200)
committerSergey Sharybin <sergey.vfx@gmail.com>
Mon, 23 Apr 2018 14:44:09 +0000 (16:44 +0200)
source/blender/depsgraph/intern/builder/deg_builder_relations.cc
source/blender/depsgraph/intern/builder/deg_builder_relations.h
source/blender/depsgraph/intern/builder/deg_builder_relations_impl.h
source/blender/depsgraph/intern/debug/deg_debug_relations_graphviz.cc
source/blender/depsgraph/intern/depsgraph.h
source/blender/depsgraph/intern/eval/deg_eval_flush.cc

index 9a59dd46759f7a99ba77ecd38a2f3d082f064460..f1869fdd916805a05f75ca062b1149ff129b9169 100644 (file)
@@ -241,13 +241,14 @@ bool DepsgraphRelationBuilder::has_node(const OperationKey &key) const
        return find_node(key) != NULL;
 }
 
-void DepsgraphRelationBuilder::add_time_relation(TimeSourceDepsNode *timesrc,
-                                                 DepsNode *node_to,
-                                                 const char *description,
-                                                 bool check_unique)
+DepsRelation *DepsgraphRelationBuilder::add_time_relation(
+        TimeSourceDepsNode *timesrc,
+        DepsNode *node_to,
+        const char *description,
+        bool check_unique)
 {
        if (timesrc && node_to) {
-               graph_->add_new_relation(timesrc, node_to, description, check_unique);
+               return graph_->add_new_relation(timesrc, node_to, description, check_unique);
        }
        else {
                DEG_DEBUG_PRINTF(BUILD, "add_time_relation(%p = %s, %p = %s, %s) Failed\n",
@@ -255,16 +256,20 @@ void DepsgraphRelationBuilder::add_time_relation(TimeSourceDepsNode *timesrc,
                                 node_to,   (node_to) ? node_to->identifier().c_str() : "<None>",
                                 description);
        }
+       return NULL;
 }
 
-void DepsgraphRelationBuilder::add_operation_relation(
+DepsRelation *DepsgraphRelationBuilder::add_operation_relation(
         OperationDepsNode *node_from,
         OperationDepsNode *node_to,
         const char *description,
         bool check_unique)
 {
        if (node_from && node_to) {
-               graph_->add_new_relation(node_from, node_to, description, check_unique);
+               return graph_->add_new_relation(node_from,
+                                               node_to,
+                                               description,
+                                               check_unique);
        }
        else {
                DEG_DEBUG_PRINTF(BUILD, "add_operation_relation(%p = %s, %p = %s, %s) Failed\n",
@@ -272,6 +277,7 @@ void DepsgraphRelationBuilder::add_operation_relation(
                                 node_to,   (node_to)   ? node_to->identifier().c_str() : "<None>",
                                 description);
        }
+       return NULL;
 }
 
 void DepsgraphRelationBuilder::add_collision_relations(
index ed2d4b1162f859fa2fbbc30f6b8235067281231d..7469540521b83f7f93afb25fb40616b8cc46beff 100644 (file)
@@ -83,6 +83,7 @@ namespace DEG {
 struct Depsgraph;
 struct DepsNode;
 struct DepsNodeHandle;
+struct DepsRelation;
 struct RootDepsNode;
 struct IDDepsNode;
 struct TimeSourceDepsNode;
@@ -176,22 +177,22 @@ struct DepsgraphRelationBuilder
        void begin_build();
 
        template <typename KeyFrom, typename KeyTo>
-       void add_relation(const KeyFrom& key_from,
-                         const KeyTo& key_to,
-                         const char *description,
-                         bool check_unique = false);
+       DepsRelation *add_relation(const KeyFrom& key_from,
+                                  const KeyTo& key_to,
+                                  const char *description,
+                                  bool check_unique = false);
 
        template <typename KeyTo>
-       void add_relation(const TimeSourceKey& key_from,
-                         const KeyTo& key_to,
-                         const char *description,
-                         bool check_unique = false);
+       DepsRelation *add_relation(const TimeSourceKey& key_from,
+                                  const KeyTo& key_to,
+                                  const char *description,
+                                  bool check_unique = false);
 
        template <typename KeyType>
-       void add_node_handle_relation(const KeyType& key_from,
-                                     const DepsNodeHandle *handle,
-                                     const char *description,
-                                     bool check_unique = false);
+       DepsRelation *add_node_handle_relation(const KeyType& key_from,
+                                              const DepsNodeHandle *handle,
+                                              const char *description,
+                                              bool check_unique = false);
 
        void build_view_layer(Scene *scene, ViewLayer *view_layer);
        void build_group(Object *object, Group *group);
@@ -280,14 +281,14 @@ protected:
        OperationDepsNode *find_node(const OperationKey &key) const;
        bool has_node(const OperationKey &key) const;
 
-       void add_time_relation(TimeSourceDepsNode *timesrc,
-                              DepsNode *node_to,
-                              const char *description,
-                              bool check_unique = false);
-       void add_operation_relation(OperationDepsNode *node_from,
-                                   OperationDepsNode *node_to,
-                                   const char *description,
-                                   bool check_unique = false);
+       DepsRelation *add_time_relation(TimeSourceDepsNode *timesrc,
+                                       DepsNode *node_to,
+                                       const char *description,
+                                       bool check_unique = false);
+       DepsRelation *add_operation_relation(OperationDepsNode *node_from,
+                                            OperationDepsNode *node_to,
+                                            const char *description,
+                                            bool check_unique = false);
 
        template <typename KeyType>
        DepsNodeHandle create_node_handle(const KeyType& key,
index 485586e844f754a2da77a1b576d90eb05b095160..894d4172c0041f9006c6e8201987a1ecc1d6d5c8 100644 (file)
@@ -46,17 +46,17 @@ OperationDepsNode *DepsgraphRelationBuilder::find_operation_node(const KeyType&
 }
 
 template <typename KeyFrom, typename KeyTo>
-void DepsgraphRelationBuilder::add_relation(const KeyFrom &key_from,
-                                            const KeyTo &key_to,
-                                            const char *description,
-                                            bool check_unique)
+DepsRelation *DepsgraphRelationBuilder::add_relation(const KeyFrom &key_from,
+                                                     const KeyTo &key_to,
+                                                     const char *description,
+                                                     bool check_unique)
 {
        DepsNode *node_from = get_node(key_from);
        DepsNode *node_to = get_node(key_to);
        OperationDepsNode *op_from = node_from ? node_from->get_exit_operation() : NULL;
        OperationDepsNode *op_to = node_to ? node_to->get_entry_operation() : NULL;
        if (op_from && op_to) {
-               add_operation_relation(op_from, op_to, description, check_unique);
+               return add_operation_relation(op_from, op_to, description, check_unique);
        }
        else {
                if (!op_from) {
@@ -78,24 +78,27 @@ void DepsgraphRelationBuilder::add_relation(const KeyFrom &key_from,
                                description, key_to.identifier().c_str());
                }
        }
+       return NULL;
 }
 
 template <typename KeyTo>
-void DepsgraphRelationBuilder::add_relation(const TimeSourceKey &key_from,
-                                            const KeyTo &key_to,
-                                            const char *description,
-                                            bool check_unique)
+DepsRelation *DepsgraphRelationBuilder::add_relation(
+        const TimeSourceKey &key_from,
+        const KeyTo &key_to,
+        const char *description,
+        bool check_unique)
 {
        TimeSourceDepsNode *time_from = get_node(key_from);
        DepsNode *node_to = get_node(key_to);
        OperationDepsNode *op_to = node_to ? node_to->get_entry_operation() : NULL;
        if (time_from != NULL && op_to != NULL) {
-               add_time_relation(time_from, op_to, description, check_unique);
+               return add_time_relation(time_from, op_to, description, check_unique);
        }
+       return NULL;
 }
 
 template <typename KeyType>
-void DepsgraphRelationBuilder::add_node_handle_relation(
+DepsRelation *DepsgraphRelationBuilder::add_node_handle_relation(
         const KeyType &key_from,
         const DepsNodeHandle *handle,
         const char *description,
@@ -105,7 +108,7 @@ void DepsgraphRelationBuilder::add_node_handle_relation(
        OperationDepsNode *op_from = node_from ? node_from->get_exit_operation() : NULL;
        OperationDepsNode *op_to = handle->node->get_entry_operation();
        if (op_from != NULL && op_to != NULL) {
-               add_operation_relation(op_from, op_to, description, check_unique);
+               return add_operation_relation(op_from, op_to, description, check_unique);
        }
        else {
                if (!op_from) {
@@ -117,6 +120,7 @@ void DepsgraphRelationBuilder::add_node_handle_relation(
                                description, key_from.identifier().c_str());
                }
        }
+       return NULL;
 }
 
 template <typename KeyType>
index ee40ca50ab5369bc63fe2c448f65ef422fbf25cd..d64ab79d918fbf64caa14269c5ea9154332e6d88 100644 (file)
@@ -259,6 +259,18 @@ static void deg_debug_graphviz_relation_color(const DebugContext &ctx,
        deg_debug_fprintf(ctx, "%s", color);
 }
 
+static void deg_debug_graphviz_relation_style(const DebugContext &ctx,
+                                              const DepsRelation *rel)
+{
+       const char *style_default = "solid";
+       const char *style_no_flush = "dashed";
+       const char *style = style_default;
+       if (rel->flag & DEPSREL_FLAG_NO_FLUSH) {
+               style = style_no_flush;
+       }
+       deg_debug_fprintf(ctx, "%s", style);
+}
+
 static void deg_debug_graphviz_node_style(const DebugContext &ctx, const DepsNode *node)
 {
        const char *base_style = "filled"; /* default style */
@@ -468,16 +480,23 @@ static void deg_debug_graphviz_node_relations(const DebugContext &ctx,
                /* Note: without label an id seem necessary to avoid bugs in graphviz/dot */
                deg_debug_fprintf(ctx, "id=\"%s\"", rel->name);
                // deg_debug_fprintf(ctx, "label=\"%s\"", rel->name);
-               deg_debug_fprintf(ctx, ",color="); deg_debug_graphviz_relation_color(ctx, rel);
+               deg_debug_fprintf(ctx, ",color=");
+               deg_debug_graphviz_relation_color(ctx, rel);
+               deg_debug_fprintf(ctx, ",style=");
+               deg_debug_graphviz_relation_style(ctx, rel);
                deg_debug_fprintf(ctx, ",penwidth=\"%f\"", penwidth);
                /* NOTE: edge from node to own cluster is not possible and gives graphviz
                 * warning, avoid this here by just linking directly to the invisible
                 * placeholder node
                 */
-               if (deg_debug_graphviz_is_cluster(tail) && !deg_debug_graphviz_is_owner(head, tail)) {
+               if (deg_debug_graphviz_is_cluster(tail) &&
+                   !deg_debug_graphviz_is_owner(head, tail))
+               {
                        deg_debug_fprintf(ctx, ",ltail=\"cluster_%p\"", tail);
                }
-               if (deg_debug_graphviz_is_cluster(head) && !deg_debug_graphviz_is_owner(tail, head)) {
+               if (deg_debug_graphviz_is_cluster(head) &&
+                   !deg_debug_graphviz_is_owner(tail, head))
+               {
                        deg_debug_fprintf(ctx, ",lhead=\"cluster_%p\"", head);
                }
                deg_debug_fprintf(ctx, "];" NL);
index 62059600b7215eec7be8ad4da558696045f47ba9..e10f7d5b115f3ad174cd954924d46e43d0fa2973 100644 (file)
@@ -68,6 +68,8 @@ typedef enum eDepsRelation_Flag {
         * which triggers a cyclic relationship to exist in the graph.
         */
        DEPSREL_FLAG_CYCLIC     = (1 << 0),
+       /* Update flush will not go through this relation. */
+       DEPSREL_FLAG_NO_FLUSH   = (1 << 1),
 } eDepsRelation_Flag;
 
 /* B depends on A (A -> B) */
index 60fde1e69ee81c0ad990ecd5fabf9fee84e36802..864d9d9e1ff1b665cd471695921d9e85ea029c0f 100644 (file)
@@ -182,6 +182,9 @@ BLI_INLINE OperationDepsNode *flush_schedule_children(
 {
        OperationDepsNode *result = NULL;
        foreach (DepsRelation *rel, op_node->outlinks) {
+               if (rel->flag & DEPSREL_FLAG_NO_FLUSH) {
+                       continue;
+               }
                OperationDepsNode *to_node = (OperationDepsNode *)rel->to;
                if (to_node->scheduled == false) {
                        if (result != NULL) {