[Bf-blender-cvs] [cf38371155e] blender2.8: Depsgraph: Create ID nodes on build-time expansion using node builder
Sergey Sharybin
noreply at git.blender.org
Thu Jul 27 15:23:07 CEST 2017
Commit: cf38371155e188043bac68831977fbc958824d38
Author: Sergey Sharybin
Date: Thu Jul 27 14:57:47 2017 +0200
Branches: blender2.8
https://developer.blender.org/rBcf38371155e188043bac68831977fbc958824d38
Depsgraph: Create ID nodes on build-time expansion using node builder
This will allow us to do some builder-specific trickery when ID nodes are
requested to be created from build-time expansion.
===================================================================
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_nodes_layer.cc
M source/blender/depsgraph/intern/builder/deg_builder_nodes_rig.cc
M source/blender/depsgraph/intern/depsgraph.cc
M source/blender/depsgraph/intern/depsgraph.h
M source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc
M source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.h
===================================================================
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
index bd03cb9ef48..30fbe809236 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
@@ -295,6 +295,16 @@ ID *DepsgraphNodeBuilder::get_cow_id(const ID *id_orig) const
return m_graph->get_cow_id(id_orig);
}
+ID *DepsgraphNodeBuilder::ensure_cow_id(ID *id_orig)
+{
+ if (id_orig->tag & LIB_TAG_COPY_ON_WRITE) {
+ /* ID is already remapped to copy-on-write. */
+ return id_orig;
+ }
+ IDDepsNode *id_node = m_graph->add_id_node(id_orig, false);
+ return id_node->id_cow;
+}
+
/* **** Build functions for entity nodes **** */
void DepsgraphNodeBuilder::begin_build(Main *bmain) {
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h
index 8be5f85ab13..b1d9ff52359 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h
@@ -72,11 +72,20 @@ struct DepsgraphNodeBuilder {
DepsgraphNodeBuilder(Main *bmain, Depsgraph *graph);
~DepsgraphNodeBuilder();
+ /* For given original ID get ID which is created by CoW system. */
ID *get_cow_id(const ID *id_orig) const;
+ /* Similar to above, but for the cases when there is no ID node we create
+ * one.
+ */
+ ID *ensure_cow_id(ID *id_orig);
+
+ /* Helper wrapper function which wraps get_cow_id with a needed type cast. */
template<typename T>
T *get_cow_datablock(const T *orig) const {
return (T *)get_cow_id(&orig->id);
}
+
+ /* For a given COW datablock get corresponding original one. */
template<typename T>
T *get_orig_datablock(const T *cow) const {
#ifdef WITH_COPY_ON_WRITE
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes_layer.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes_layer.cc
index 861c2377567..80111840b6c 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes_layer.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes_layer.cc
@@ -99,9 +99,8 @@ void DepsgraphNodeBuilder::build_scene_layer_collections(Scene *scene)
#ifdef WITH_COPY_ON_WRITE
/* Make sure we've got ID node, so we can get pointer to CoW datablock. */
IDDepsNode *id_node = add_id_node(&scene->id);
- Scene *scene_cow = (Scene *)deg_expand_copy_on_write_datablock(m_graph,
- id_node,
- true);
+ Scene *scene_cow = (Scene *)deg_expand_copy_on_write_datablock(
+ m_graph, id_node, this, true);
#else
Scene *scene_cow = scene;
#endif
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes_rig.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes_rig.cc
index 20374d6ec70..9fb94a8cd91 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes_rig.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes_rig.cc
@@ -142,10 +142,10 @@ void DepsgraphNodeBuilder::build_rig(Scene *scene, Object *object)
Scene *scene_cow = get_cow_datablock(scene);
IDDepsNode *object_id_node = add_id_node(&object->id);
Object *object_cow = (Object *)deg_expand_copy_on_write_datablock(
- m_graph, object_id_node, true);
+ m_graph, object_id_node, this, true);
IDDepsNode *armature_id_node = add_id_node(&armature->id);
bArmature *armature_cow = (bArmature *)deg_expand_copy_on_write_datablock(
- m_graph, armature_id_node, true);
+ m_graph, armature_id_node, this, true);
#else
Scene *scene_cow = scene;
Object *object_cow = object;
diff --git a/source/blender/depsgraph/intern/depsgraph.cc b/source/blender/depsgraph/intern/depsgraph.cc
index 322a561b4d8..868e7c0e3e5 100644
--- a/source/blender/depsgraph/intern/depsgraph.cc
+++ b/source/blender/depsgraph/intern/depsgraph.cc
@@ -466,16 +466,6 @@ ID *Depsgraph::get_cow_id(const ID *id_orig) const
return id_node->id_cow;
}
-ID *Depsgraph::ensure_cow_id(ID *id_orig)
-{
- if (id_orig->tag & LIB_TAG_COPY_ON_WRITE) {
- /* ID is already remapped to copy-on-write. */
- return id_orig;
- }
- IDDepsNode *id_node = add_id_node(id_orig, false);
- return id_node->id_cow;
-}
-
void deg_editors_id_update(Main *bmain, ID *id)
{
if (deg_editor_update_id_cb != NULL) {
diff --git a/source/blender/depsgraph/intern/depsgraph.h b/source/blender/depsgraph/intern/depsgraph.h
index 94b729812cb..6290dbe4ba7 100644
--- a/source/blender/depsgraph/intern/depsgraph.h
+++ b/source/blender/depsgraph/intern/depsgraph.h
@@ -137,11 +137,6 @@ struct Depsgraph {
/* For given original ID get ID which is created by CoW system. */
ID *get_cow_id(const ID *id_orig) const;
- /* Similar to above, but for the cases when there is no ID node we create
- * one.
- */
- ID *ensure_cow_id(ID *id_orig);
-
/* Core Graph Functionality ........... */
/* <ID : IDDepsNode> mapping from ID blocks to nodes representing these blocks
diff --git a/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc b/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc
index f74e3deb9fb..198f6003c14 100644
--- a/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc
+++ b/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc
@@ -79,6 +79,7 @@ extern "C" {
}
#include "intern/depsgraph.h"
+#include "intern/builder/deg_builder_nodes.h"
#include "intern/nodes/deg_node.h"
namespace DEG {
@@ -378,7 +379,7 @@ static bool check_datablocks_copy_on_writable(const ID *id_orig)
struct RemapCallbackUserData {
/* Dependency graph for which remapping is happening. */
- Depsgraph *depsgraph;
+ const Depsgraph *depsgraph;
/* Temporarily allocated memory for copying purposes. This ID will
* be discarded after expanding is done, so need to make sure temp_id
* is replaced with proper real_id.
@@ -395,6 +396,7 @@ struct RemapCallbackUserData {
*
* This happens when expansion happens a ta construction time.
*/
+ DepsgraphNodeBuilder *node_builder;
bool create_placeholders;
};
@@ -404,7 +406,7 @@ int foreach_libblock_remap_callback(void *user_data_v,
int /*cb_flag*/)
{
RemapCallbackUserData *user_data = (RemapCallbackUserData *)user_data_v;
- Depsgraph *depsgraph = user_data->depsgraph;
+ const Depsgraph *depsgraph = user_data->depsgraph;
if (*id_p != NULL) {
ID *id_orig = *id_p;
if (id_orig == user_data->temp_id) {
@@ -435,7 +437,7 @@ int foreach_libblock_remap_callback(void *user_data_v,
}
}
else {
- id_cow = depsgraph->ensure_cow_id(id_orig);
+ id_cow = user_data->node_builder->ensure_cow_id(id_orig);
}
}
else {
@@ -641,8 +643,9 @@ int foreach_libblock_validate_callback(void *user_data,
*
* NOTE: Expects that CoW datablock is empty.
*/
-ID *deg_expand_copy_on_write_datablock(Depsgraph *depsgraph,
+ID *deg_expand_copy_on_write_datablock(const Depsgraph *depsgraph,
const IDDepsNode *id_node,
+ DepsgraphNodeBuilder *node_builder,
bool create_placeholders)
{
BLI_assert(!create_placeholders ||
@@ -731,6 +734,7 @@ ID *deg_expand_copy_on_write_datablock(Depsgraph *depsgraph,
user_data.depsgraph = depsgraph;
user_data.temp_id = newid;
user_data.real_id = id_cow;
+ user_data.node_builder = node_builder;
user_data.create_placeholders = create_placeholders;
BKE_library_foreach_ID_link(NULL,
id_cow,
@@ -749,18 +753,20 @@ ID *deg_expand_copy_on_write_datablock(Depsgraph *depsgraph,
}
/* NOTE: Depsgraph is supposed to have ID node already. */
-ID *deg_expand_copy_on_write_datablock(Depsgraph *depsgraph,
+ID *deg_expand_copy_on_write_datablock(const Depsgraph *depsgraph,
ID *id_orig,
+ DepsgraphNodeBuilder *node_builder,
bool create_placeholders)
{
DEG::IDDepsNode *id_node = depsgraph->find_id_node(id_orig);
BLI_assert(id_node != NULL);
return deg_expand_copy_on_write_datablock(depsgraph,
id_node,
+ node_builder,
create_placeholders);
}
-ID *deg_update_copy_on_write_datablock(/*const*/ Depsgraph *depsgraph,
+ID *deg_update_copy_on_write_datablock(const Depsgraph *depsgraph,
const IDDepsNode *id_node)
{
const ID *id_orig = id_node->id_orig;
@@ -808,7 +814,7 @@ ID *deg_update_copy_on_write_datablock(/*const*/ Depsgraph *depsgraph,
}
}
deg_free_copy_on_write_datablock(id_cow);
- deg_expand_copy_on_write_datablock(depsgraph, id_node, false);
+ deg_expand_copy_on_write_datablock(depsgraph, id_node);
/* Restore GPU materials. */
if (gpumaterial_ptr != NULL) {
*gpumaterial_ptr = gpumaterial_backup;
@@ -817,7 +823,7 @@ ID *deg_update_copy_on_write_datablock(/*const*/ Depsgraph *depsgraph,
}
/* NOTE: Depsgraph is supposed to have ID node already. */
-ID *deg_update_copy_on_write_datablock(/*const*/ Depsgraph *depsgraph,
+ID *deg_update_copy_on_write_datablock(const Depsgraph *depsgraph,
ID *id_orig)
{
DEG::IDDepsNode *id_node = depsgraph->find_id_node(id_orig);
@@ -882,7 +888,7 @@ void deg_free_copy_on_write_datablock(ID *id_cow)
}
void deg_evaluate_copy_on_write(const EvaluationContext * /*eval_ctx*/,
- /*const*/ Depsgraph *depsgraph,
+ const Depsgraph *depsgraph,
const IDDepsNode *id_node)
{
DEBUG_PRINT("%s on %s\n", __func__, id_node->id_orig->name);
diff --git a/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.h b/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.h
index 52fe58e3391..a2b57cb7198 100644
--- a/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.h
+++ b/source/blender/depsgraph/intern/eval/deg_eval_copy_
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list