[Bf-blender-cvs] [6365ddcab55] blender2.8: Depsgraph: Separate loop for ID node flags clear
Sergey Sharybin
noreply at git.blender.org
Fri Dec 1 17:32:24 CET 2017
Commit: 6365ddcab559bd0abdfb86e04834d3d1ecbe6e95
Author: Sergey Sharybin
Date: Fri Dec 1 17:30:36 2017 +0100
Branches: blender2.8
https://developer.blender.org/rB6365ddcab559bd0abdfb86e04834d3d1ecbe6e95
Depsgraph: Separate loop for ID node flags clear
This ends up in less number of memory writes, which should have positive effect
on performance.
===================================================================
M source/blender/depsgraph/intern/eval/deg_eval_flush.cc
===================================================================
diff --git a/source/blender/depsgraph/intern/eval/deg_eval_flush.cc b/source/blender/depsgraph/intern/eval/deg_eval_flush.cc
index 6c491c389ca..7558ef930c2 100644
--- a/source/blender/depsgraph/intern/eval/deg_eval_flush.cc
+++ b/source/blender/depsgraph/intern/eval/deg_eval_flush.cc
@@ -65,32 +65,35 @@ typedef std::deque<OperationDepsNode *> FlushQueue;
namespace {
-void flush_init_func(void *data_v, int i)
+void flush_init_operation_node_func(void *data_v, int i)
{
- /* ID node's done flag is used to avoid multiple editors update
- * for the same ID.
- */
Depsgraph *graph = (Depsgraph *)data_v;
OperationDepsNode *node = graph->operations[i];
- ComponentDepsNode *comp_node = node->owner;
- IDDepsNode *id_node = comp_node->owner;
- id_node->done = 0;
- comp_node->done = COMPONENT_STATE_NONE;
node->scheduled = false;
}
+void flush_init_id_node_func(void *data_v, int i)
+{
+ Depsgraph *graph = (Depsgraph *)data_v;
+ IDDepsNode *id_node = graph->id_nodes[i];
+ id_node->done = 0;
+ GHASH_FOREACH_BEGIN(ComponentDepsNode *, comp_node, id_node->components)
+ comp_node->done = COMPONENT_STATE_NONE;
+ GHASH_FOREACH_END();
+}
+
BLI_INLINE void flush_prepare(Depsgraph *graph)
{
- /* TODO(sergey): With a bit of flag magic we can get rid of this
- * extra loop.
- */
const int num_operations = graph->operations.size();
- const bool do_threads = num_operations > 256;
- BLI_task_parallel_range(0,
- num_operations,
+ BLI_task_parallel_range(0, num_operations,
+ graph,
+ flush_init_operation_node_func,
+ (num_operations > 256));
+ const int num_id_nodes = graph->id_nodes.size();
+ BLI_task_parallel_range(0, num_id_nodes,
graph,
- flush_init_func,
- do_threads);
+ flush_init_id_node_func,
+ (num_id_nodes > 256));
}
BLI_INLINE void flush_schedule_entrypoints(Depsgraph *graph, FlushQueue *queue)
More information about the Bf-blender-cvs
mailing list