Commit: b5b87cf11e962644eec5cfdc7f2edddd2083c982
Author: Sergey Sharybin
Date:   Thu May 26 15:15:55 2016 +0200
Branches: depsgraph_cleanup
https://developer.blender.org/rBb5b87cf11e962644eec5cfdc7f2edddd2083c982

Depsgraph: Use GHash for operation nodes stored in component

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

M       source/blender/depsgraph/intern/debug/deg_debug_graphviz.cc
M       source/blender/depsgraph/intern/depsgraph_debug.cc
M       source/blender/depsgraph/intern/eval/deg_eval_flush.cc
M       source/blender/depsgraph/intern/nodes/deg_node_component.cc
M       source/blender/depsgraph/intern/nodes/deg_node_component.h

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

diff --git a/source/blender/depsgraph/intern/debug/deg_debug_graphviz.cc 
b/source/blender/depsgraph/intern/debug/deg_debug_graphviz.cc
index 2bef309..5b6c5c8 100644
--- a/source/blender/depsgraph/intern/debug/deg_debug_graphviz.cc
+++ b/source/blender/depsgraph/intern/debug/deg_debug_graphviz.cc
@@ -406,13 +406,10 @@ static void deg_debug_graphviz_node(const DebugContext 
&ctx,
                case DEPSNODE_TYPE_EVAL_PARTICLES:
                {
                        ComponentDepsNode *comp_node = (ComponentDepsNode 
*)node;
-                       if (!comp_node->operations.empty()) {
-                               deg_debug_graphviz_node_cluster_begin(ctx, 
node);
-                               for 
(ComponentDepsNode::OperationMap::const_iterator it = 
comp_node->operations.begin();
-                                    it != comp_node->operations.end();
-                                    ++it)
-                               {
-                                       const DepsNode *op_node = it->second;
+                       if (BLI_ghash_size(comp_node->operations) > 0) {
+                               GHashIterator gh_iter;
+                               GHASH_ITER (gh_iter, comp_node->operations) {
+                                       const DepsNode *op_node = 
reinterpret_cast<const DepsNode *>(BLI_ghashIterator_getValue(&gh_iter));
                                        deg_debug_graphviz_node(ctx, op_node);
                                }
                                deg_debug_graphviz_node_cluster_end(ctx);
@@ -451,7 +448,7 @@ static bool deg_debug_graphviz_is_cluster(const DepsNode 
*node)
                case DEPSNODE_TYPE_BONE:
                {
                        ComponentDepsNode *comp_node = (ComponentDepsNode 
*)node;
-                       return !comp_node->operations.empty();
+                       return BLI_ghash_size(comp_node->operations) > 0;
                }
                default:
                        return false;
@@ -546,11 +543,9 @@ static void deg_debug_graphviz_graph_relations(const 
DebugContext &ctx,
                     ++it)
                {
                        ComponentDepsNode *comp_node = it->second;
-                       for (ComponentDepsNode::OperationMap::const_iterator it 
= comp_node->operations.begin();
-                            it != comp_node->operations.end();
-                            ++it)
-                       {
-                               OperationDepsNode *op_node = it->second;
+                       GHashIterator gh_iter;
+                       GHASH_ITER (gh_iter, comp_node->operations) {
+                               OperationDepsNode *op_node = 
reinterpret_cast<OperationDepsNode *>(BLI_ghashIterator_getValue(&gh_iter));
                                deg_debug_graphviz_node_relations(ctx, op_node);
                        }
                }
diff --git a/source/blender/depsgraph/intern/depsgraph_debug.cc 
b/source/blender/depsgraph/intern/depsgraph_debug.cc
index 615bbf7..9d76749 100644
--- a/source/blender/depsgraph/intern/depsgraph_debug.cc
+++ b/source/blender/depsgraph/intern/depsgraph_debug.cc
@@ -228,11 +228,9 @@ void DEG_stats_simple(const Depsgraph *graph, size_t 
*r_outer,
                        {
                                DEG::ComponentDepsNode *comp_node = it->second;
                                tot_outer++;
-                               for 
(DEG::ComponentDepsNode::OperationMap::const_iterator it = 
comp_node->operations.begin();
-                                    it != comp_node->operations.end();
-                                    ++it)
-                               {
-                                       DEG::OperationDepsNode *op_node = 
it->second;
+                               GHashIterator gh_iter;
+                               GHASH_ITER (gh_iter, comp_node->operations) {
+                                       DEG::OperationDepsNode *op_node = 
reinterpret_cast<DEG::OperationDepsNode 
*>(BLI_ghashIterator_getValue(&gh_iter));
                                        tot_rels += op_node->inlinks.size();
                                }
                        }
diff --git a/source/blender/depsgraph/intern/eval/deg_eval_flush.cc 
b/source/blender/depsgraph/intern/eval/deg_eval_flush.cc
index 8261966..cb2cb34 100644
--- a/source/blender/depsgraph/intern/eval/deg_eval_flush.cc
+++ b/source/blender/depsgraph/intern/eval/deg_eval_flush.cc
@@ -177,11 +177,9 @@ void deg_graph_flush_updates(Main *bmain, Depsgraph *graph)
                 */
                ComponentDepsNode *component = node->owner;
                if ((component->flags & DEPSCOMP_FULLY_SCHEDULED) == 0) {
-                       for (ComponentDepsNode::OperationMap::iterator it = 
component->operations.begin();
-                            it != node->owner->operations.end();
-                            ++it)
-                       {
-                               OperationDepsNode *op = it->second;
+                       GHashIterator gh_iter;
+                       GHASH_ITER (gh_iter, component->operations) {
+                               OperationDepsNode *op = 
reinterpret_cast<OperationDepsNode *>(BLI_ghashIterator_getValue(&gh_iter));
                                op->flag |= DEPSOP_FLAG_NEEDS_UPDATE;
                        }
                        component->flags |= DEPSCOMP_FULLY_SCHEDULED;
diff --git a/source/blender/depsgraph/intern/nodes/deg_node_component.cc 
b/source/blender/depsgraph/intern/nodes/deg_node_component.cc
index a393874..4bc5c45 100644
--- a/source/blender/depsgraph/intern/nodes/deg_node_component.cc
+++ b/source/blender/depsgraph/intern/nodes/deg_node_component.cc
@@ -51,11 +51,38 @@ namespace DEG {
 
 /* Standard Component Methods ============================= */
 
+static unsigned int comp_node_hash_key(const void *key_v)
+{
+       const ComponentDepsNode::OperationIDKey *key =
+               reinterpret_cast<const ComponentDepsNode::OperationIDKey 
*>(key_v);
+       return hash_combine(BLI_ghashutil_uinthash(key->opcode),
+                           BLI_ghashutil_strhash_p(key->name.c_str()));
+}
+
+static bool comp_node_hash_key_cmp(const void *a, const void *b)
+{
+       const ComponentDepsNode::OperationIDKey *key_a =
+               reinterpret_cast<const ComponentDepsNode::OperationIDKey *>(a);
+       const ComponentDepsNode::OperationIDKey *key_b =
+               reinterpret_cast<const ComponentDepsNode::OperationIDKey *>(b);
+       return !(*key_a == *key_b);
+}
+
+static void comp_node_hash_key_free(void *key_v)
+{
+       typedef ComponentDepsNode::OperationIDKey OperationIDKey;
+       OperationIDKey *key = reinterpret_cast<OperationIDKey *>(key_v);
+       OBJECT_GUARDED_DELETE(key, OperationIDKey);
+}
+
 ComponentDepsNode::ComponentDepsNode() :
     entry_operation(NULL),
     exit_operation(NULL),
     flags(0)
 {
+       operations = BLI_ghash_new(comp_node_hash_key,
+                                  comp_node_hash_key_cmp,
+                                  "depsgraph id hash");
 }
 
 /* Initialize 'component' node - from pointer data given */
@@ -70,6 +97,7 @@ void ComponentDepsNode::init(const ID * /*id*/,
 ComponentDepsNode::~ComponentDepsNode()
 {
        clear_operations();
+       BLI_ghash_free(operations, comp_node_hash_key_free, NULL);
 }
 
 string ComponentDepsNode::identifier() const
@@ -84,10 +112,9 @@ string ComponentDepsNode::identifier() const
 
 OperationDepsNode *ComponentDepsNode::find_operation(OperationIDKey key) const
 {
-       OperationMap::const_iterator it = this->operations.find(key);
-
-       if (it != this->operations.end()) {
-               return it->second;
+       OperationDepsNode *node = reinterpret_cast<OperationDepsNode 
*>(BLI_ghash_lookup(operations, &key));
+       if (node != NULL) {
+               return node;
        }
        else {
                fprintf(stderr, "%s: find_operation(%s) failed\n",
@@ -105,11 +132,7 @@ OperationDepsNode 
*ComponentDepsNode::find_operation(eDepsOperation_Code opcode,
 
 OperationDepsNode *ComponentDepsNode::has_operation(OperationIDKey key) const
 {
-       OperationMap::const_iterator it = this->operations.find(key);
-       if (it != this->operations.end()) {
-               return it->second;
-       }
-       return NULL;
+       return reinterpret_cast<OperationDepsNode 
*>(BLI_ghash_lookup(operations, &key));
 }
 
 OperationDepsNode *ComponentDepsNode::has_operation(eDepsOperation_Code opcode,
@@ -127,8 +150,8 @@ OperationDepsNode 
*ComponentDepsNode::add_operation(eDepsOperation_Type optype,
                op_node = (OperationDepsNode 
*)factory->create_node(this->owner->id, "", name);
 
                /* register opnode in this component's operation set */
-               OperationIDKey key(opcode, name);
-               this->operations[key] = op_node;
+               OperationIDKey *key = OBJECT_GUARDED_NEW(OperationIDKey, 
opcode, name);
+               BLI_ghash_insert(operations, key, op_node);
 
                /* set as entry/exit node of component (if appropriate) */
                if (optype == DEPSOP_TYPE_INIT) {
@@ -164,18 +187,20 @@ void 
ComponentDepsNode::remove_operation(eDepsOperation_Code opcode, const strin
        OperationDepsNode *op_node = find_operation(opcode, name);
        if (op_node) {
                /* unregister */
-               this->operations.erase(OperationIDKey(opcode, name));
+               OperationIDKey key(opcode, name);
+               BLI_ghash_remove(operations, &key, comp_node_hash_key_free, 
NULL);
                OBJECT_GUARDED_DELETE(op_node, OperationDepsNode);
        }
 }
 
 void ComponentDepsNode::clear_operations()
 {
-       for (OperationMap::const_iterator it = operations.begin(); it != 
operations.end(); ++it) {
-               OperationDepsNode *op_node = it->second;
+       GHashIterator gh_iter;
+       GHASH_ITER (gh_iter, operations) {
+               OperationDepsNode *op_node = reinterpret_cast<OperationDepsNode 
*>(BLI_ghashIterator_getValue(&gh_iter));
                OBJECT_GUARDED_DELETE(op_node, OperationDepsNode);
        }
-       operations.clear();
+       BLI_ghash_clear(operations, comp_node_hash_key_free, NULL);
 }
 
 void ComponentDepsNode::tag_update(Depsgraph *graph)
@@ -184,27 +209,48 @@ void ComponentDepsNode::tag_update(Depsgraph *graph)
        if (entry_op != NULL && entry_op->flag & DEPSOP_FLAG_NEEDS_UPDATE) {
                return;
        }
-       for (OperationMap::const_iterator it = operations.begin(); it != 
operations.end(); ++it) {
-               OperationDepsNode *op_node = it->second;
+       GHashIterator gh_iter;
+       GHASH_ITER (gh_iter, operations) {
+               OperationDepsNode *op_node = reinterpret_cast<OperationDepsNode 
*>(BLI_ghashIterator_getValue(&gh_iter));
                op_node->tag_update(graph);
        }
 }
 
 OperationDepsNode *ComponentDepsNode::get_entry_operation()
 {
-       if (entry_operation)
+       if (entry_operation) {
                return entry_operation;
-       else if (operations.size() == 1)
-               return operations.begin()->second;
+       }
+       else if (BLI_ghash_size(operations) == 1) {
+               OperationDepsNode *op_node = NULL;
+               /* TODO(sergey): This is somewhat slow. */
+               GHashIterator gh_iter;
+               GHASH_ITER (gh_iter, operations) {
+                       op_node = reinterpret_cast<OperationDepsNode 
*>(BLI_ghashIterator_getValue(&gh_iter));
+               }
+               /* Cache for the subsequent usage. */
+               entry_operation = op_node;
+               return op_node;
+       }
        return NULL;
 }
 
 OperationDepsNode *ComponentDepsNode::get_exit_operation()
 {
-       if (exit_operation)
+       if (exit_operation) {
                return exit_operation;
-       else if (operations.size() == 1)
-               return operations.begin()->second;
+       }
+       else if (BLI_ghash_size(operations) == 1) {
+               OperationDepsNode *op_node = NULL;
+               /* TODO(sergey): This is somewhat slow. */
+               GHashIterator gh_iter;
+               GHASH_ITER (gh_iter, operations) {
+                       op_node = reinterpret_cast<OperationDepsNode 
*>(BLI_ghashIterator_getValue(&gh_iter));
+               }
+               /* Cache for the subsequent usage. */
+               exit_operation = op_node;
+               return op_node;
+       }
        return NULL;
 }
 
diff --git a/source/blender/depsgraph/intern/nodes/deg_node_component.h 
b/source/blender/depsgraph/intern/nodes/deg_node_component.h
index d6d3a9c..b41aed6 100644
--- a/source/blender/depsgraph/intern/nodes

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to