[Bf-blender-cvs] [b21a3e77027] master: Depsgraph: Use BLI::Map in more places

Jacques Lucke noreply at git.blender.org
Tue Apr 28 12:53:24 CEST 2020


Commit: b21a3e770277aef4d7a17b9b72c1c622493a5eb9
Author: Jacques Lucke
Date:   Tue Apr 28 12:49:52 2020 +0200
Branches: master
https://developer.blender.org/rBb21a3e770277aef4d7a17b9b72c1c622493a5eb9

Depsgraph: Use BLI::Map in more places

Reviewers: sergey

Differential Revision: https://developer.blender.org/D7519

===================================================================

M	source/blender/depsgraph/intern/builder/deg_builder.cc
M	source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
M	source/blender/depsgraph/intern/builder/deg_builder_nodes.h
M	source/blender/depsgraph/intern/builder/deg_builder_relations.cc
M	source/blender/depsgraph/intern/debug/deg_debug_relations_graphviz.cc
M	source/blender/depsgraph/intern/depsgraph.cc
M	source/blender/depsgraph/intern/depsgraph.h
M	source/blender/depsgraph/intern/depsgraph_debug.cc
M	source/blender/depsgraph/intern/depsgraph_physics.cc
M	source/blender/depsgraph/intern/depsgraph_query_foreach.cc
M	source/blender/depsgraph/intern/depsgraph_tag.cc
M	source/blender/depsgraph/intern/eval/deg_eval_flush.cc
M	source/blender/depsgraph/intern/eval/deg_eval_stats.cc
M	source/blender/depsgraph/intern/node/deg_node_component.h
M	source/blender/depsgraph/intern/node/deg_node_id.cc
M	source/blender/depsgraph/intern/node/deg_node_id.h

===================================================================

diff --git a/source/blender/depsgraph/intern/builder/deg_builder.cc b/source/blender/depsgraph/intern/builder/deg_builder.cc
index d880618753c..5971ccb4b23 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder.cc
@@ -157,10 +157,9 @@ void deg_graph_build_flush_visibility(Depsgraph *graph)
 
   BLI_Stack *stack = BLI_stack_new(sizeof(OperationNode *), "DEG flush layers stack");
   for (IDNode *id_node : graph->id_nodes) {
-    GHASH_FOREACH_BEGIN (ComponentNode *, comp_node, id_node->components) {
+    for (ComponentNode *comp_node : id_node->components.values()) {
       comp_node->affects_directly_visible |= id_node->is_directly_visible;
     }
-    GHASH_FOREACH_END();
   }
   for (OperationNode *op_node : graph->operations) {
     op_node->custom_flags = 0;
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
index 0c0cc8ebc97..031f67b780e 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
@@ -120,20 +120,6 @@ extern "C" {
 
 namespace DEG {
 
-namespace {
-
-void free_copy_on_write_datablock(void *id_info_v)
-{
-  DepsgraphNodeBuilder::IDInfo *id_info = (DepsgraphNodeBuilder::IDInfo *)id_info_v;
-  if (id_info->id_cow != nullptr) {
-    deg_free_copy_on_write_datablock(id_info->id_cow);
-    MEM_freeN(id_info->id_cow);
-  }
-  MEM_freeN(id_info);
-}
-
-} /* namespace */
-
 /* ************ */
 /* Node Builder */
 
@@ -147,15 +133,18 @@ DepsgraphNodeBuilder::DepsgraphNodeBuilder(Main *bmain,
       view_layer_(nullptr),
       view_layer_index_(-1),
       collection_(nullptr),
-      is_parent_collection_visible_(true),
-      id_info_hash_(nullptr)
+      is_parent_collection_visible_(true)
 {
 }
 
 DepsgraphNodeBuilder::~DepsgraphNodeBuilder()
 {
-  if (id_info_hash_ != nullptr) {
-    BLI_ghash_free(id_info_hash_, nullptr, free_copy_on_write_datablock);
+  for (IDInfo *id_info : id_info_hash_.values()) {
+    if (id_info->id_cow != nullptr) {
+      deg_free_copy_on_write_datablock(id_info->id_cow);
+      MEM_freeN(id_info->id_cow);
+    }
+    MEM_freeN(id_info);
   }
 }
 
@@ -166,7 +155,7 @@ IDNode *DepsgraphNodeBuilder::add_id_node(ID *id)
   IDComponentsMask previously_visible_components_mask = 0;
   uint32_t previous_eval_flags = 0;
   DEGCustomDataMeshMasks previous_customdata_masks;
-  IDInfo *id_info = (IDInfo *)BLI_ghash_lookup(id_info_hash_, id);
+  IDInfo *id_info = id_info_hash_.lookup_default(id, nullptr);
   if (id_info != nullptr) {
     id_cow = id_info->id_cow;
     previously_visible_components_mask = id_info->previously_visible_components_mask;
@@ -182,7 +171,7 @@ IDNode *DepsgraphNodeBuilder::add_id_node(ID *id)
   /* 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) {
+  if (id_node->components.is_empty()) {
     ComponentNode *comp_cow = id_node->add_component(NodeType::COPY_ON_WRITE);
     OperationNode *op_cow = comp_cow->add_operation(
         function_bind(deg_evaluate_copy_on_write, _1, id_node),
@@ -320,7 +309,6 @@ void DepsgraphNodeBuilder::begin_build()
 {
   /* Store existing copy-on-write versions of datablock, so we can re-use
    * them for new ID nodes. */
-  id_info_hash_ = BLI_ghash_ptr_new("Depsgraph id hash");
   for (IDNode *id_node : graph_->id_nodes) {
     /* It is possible that the ID does not need to have CoW version in which case id_cow is the
      * same as id_orig. Additionally, such ID might have been removed, which makes the check
@@ -344,7 +332,7 @@ void DepsgraphNodeBuilder::begin_build()
     id_info->previously_visible_components_mask = id_node->visible_components_mask;
     id_info->previous_eval_flags = id_node->eval_flags;
     id_info->previous_customdata_masks = id_node->customdata_masks;
-    BLI_ghash_insert(id_info_hash_, id_node->id_orig, id_info);
+    id_info_hash_.add_new(id_node->id_orig, id_info);
     id_node->id_cow = nullptr;
   }
 
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h
index 15c1a42574f..2950f2c2c53 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h
@@ -277,7 +277,7 @@ class DepsgraphNodeBuilder : public DepsgraphBuilder {
   bool is_parent_collection_visible_;
 
   /* Indexed by original ID, values are IDInfo. */
-  GHash *id_info_hash_;
+  Map<const ID *, IDInfo *> id_info_hash_;
 
   /* Set of IDs which were already build. Makes it easier to keep track of
    * what was already built and what was not. */
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
index fb7199bfae1..14ce8dc1552 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
@@ -2632,7 +2632,7 @@ void DepsgraphRelationBuilder::build_copy_on_write_relations(IDNode *id_node)
   Node *node_cow = find_node(copy_on_write_key);
   OperationNode *op_cow = node_cow->get_exit_operation();
   /* Plug any other components to this one. */
-  GHASH_FOREACH_BEGIN (ComponentNode *, comp_node, id_node->components) {
+  for (ComponentNode *comp_node : id_node->components.values()) {
     if (comp_node->type == NodeType::COPY_ON_WRITE) {
       /* Copy-on-write component never depends on itself. */
       continue;
@@ -2709,7 +2709,6 @@ void DepsgraphRelationBuilder::build_copy_on_write_relations(IDNode *id_node)
      * evaluation step needs geometry, it will have transitive dependency
      * to Mesh copy-on-write already. */
   }
-  GHASH_FOREACH_END();
   /* TODO(sergey): This solves crash for now, but causes too many
    * updates potentially. */
   if (GS(id_orig->name) == ID_OB) {
diff --git a/source/blender/depsgraph/intern/debug/deg_debug_relations_graphviz.cc b/source/blender/depsgraph/intern/debug/deg_debug_relations_graphviz.cc
index 7080f8a1a9b..87f8917a510 100644
--- a/source/blender/depsgraph/intern/debug/deg_debug_relations_graphviz.cc
+++ b/source/blender/depsgraph/intern/debug/deg_debug_relations_graphviz.cc
@@ -407,15 +407,14 @@ static void deg_debug_graphviz_node(const DebugContext &ctx, const Node *node)
   switch (node->type) {
     case NodeType::ID_REF: {
       const IDNode *id_node = (const IDNode *)node;
-      if (BLI_ghash_len(id_node->components) == 0) {
+      if (id_node->components.is_empty()) {
         deg_debug_graphviz_node_single(ctx, node);
       }
       else {
         deg_debug_graphviz_node_cluster_begin(ctx, node);
-        GHASH_FOREACH_BEGIN (const ComponentNode *, comp, id_node->components) {
+        for (const ComponentNode *comp : id_node->components.values()) {
           deg_debug_graphviz_node(ctx, comp);
         }
-        GHASH_FOREACH_END();
         deg_debug_graphviz_node_cluster_end(ctx);
       }
       break;
@@ -472,7 +471,7 @@ static bool deg_debug_graphviz_is_cluster(const Node *node)
   switch (node->type) {
     case NodeType::ID_REF: {
       const IDNode *id_node = (const IDNode *)node;
-      return BLI_ghash_len(id_node->components) > 0;
+      return !id_node->components.is_empty();
     }
     case NodeType::PARAMETERS:
     case NodeType::ANIMATION:
@@ -568,12 +567,11 @@ static void deg_debug_graphviz_graph_nodes(const DebugContext &ctx, const Depsgr
 static void deg_debug_graphviz_graph_relations(const DebugContext &ctx, const Depsgraph *graph)
 {
   for (IDNode *id_node : graph->id_nodes) {
-    GHASH_FOREACH_BEGIN (ComponentNode *, comp_node, id_node->components) {
+    for (ComponentNode *comp_node : id_node->components.values()) {
       for (OperationNode *op_node : comp_node->operations) {
         deg_debug_graphviz_node_relations(ctx, op_node);
       }
     }
-    GHASH_FOREACH_END();
   }
 
   TimeSourceNode *time_source = graph->find_time_source();
diff --git a/source/blender/depsgraph/intern/depsgraph.cc b/source/blender/depsgraph/intern/depsgraph.cc
index 6d88782d68c..4fa73e36170 100644
--- a/source/blender/depsgraph/intern/depsgraph.cc
+++ b/source/blender/depsgraph/intern/depsgraph.cc
@@ -81,7 +81,6 @@ Depsgraph::Depsgraph(Main *bmain, Scene *scene, ViewLayer *view_layer, eEvaluati
       is_render_pipeline_depsgraph(false)
 {
   BLI_spin_init(&lock);
-  id_hash = BLI_ghash_ptr_new("Depsgraph id hash");
   entry_tags = BLI_gset_ptr_new("Depsgraph entry_tags");
   memset(id_type_updated, 0, sizeof(id_type_updated));
   memset(id_type_exist, 0, sizeof(id_type_exist));
@@ -91,7 +90,6 @@ Depsgraph::Depsgraph(Main *bmain, Scene *scene, ViewLayer *view_layer, eEvaluati
 Depsgraph::~Depsgraph()
 {
   clear_id_nodes();
-  BLI_ghash_free(id_hash, nullptr, nullptr);
   BLI_gset_free(entry_tags, nullptr);
   if (time_source != nullptr) {
     OBJECT_GUARDED_DELETE(time_source, TimeSourceNode);
@@ -117,7 +115,7 @@ TimeSourceNode *Depsgraph::find_time_source() const
 
 IDNode *Depsgraph::find_id_node(const ID *id) const
 {
-  return reinterpret_cast<IDNode *>(BLI_ghash_lookup(id_hash, id));
+  return id_hash.lookup_default(id, nullptr);
 }
 
 IDNode *Depsgraph::add_id_node(ID *id, ID *id_cow_hint)
@@ -132,7 +130,7 @@ IDNode *Depsgraph::add_id_node(ID *id, ID *id_cow_hint)
      *
      * NOTE: We address ID nodes by the original ID pointer they are
      * referencing to. */
-    BLI_ghash_insert(id_hash, id, id_node);
+    id_hash.add_new(id, id_node);
     id_nodes.push_back(id_node);
 
     id_type_exist[BKE_idtype_idcode_to_index(GS(id->name))] = 1;
@@ -170,7 +168,7 @@ void Depsgraph::clear_id_nodes()
     OBJECT_GUARDED_DELETE(id_node, IDNode);
   }
   /* Clear containers. */
-  BLI_ghash_clear(id_hash, nullptr, nullptr);
+  id_hash.clear();
   id_nodes.clear();
   /* Clear physics relation caches. */
   clear_physics_relations(this);
diff --git a/source/blender/depsgraph/intern/depsgraph.h b/source/blender/depsgraph/intern/depsgraph.h
index 7801f95e008..67c93353411 100644
--- a/

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list