[Bf-blender-cvs] [8a027ce] strand_nodes: Fix for frequent unnecessary shader recompilation during hair editing.

Lukas Tönne noreply at git.blender.org
Fri Jul 29 16:35:37 CEST 2016


Commit: 8a027ce573f4c372dfa26dfdf4b3ae673906ce4f
Author: Lukas Tönne
Date:   Fri Jul 29 16:11:41 2016 +0200
Branches: strand_nodes
https://developer.blender.org/rB8a027ce573f4c372dfa26dfdf4b3ae673906ce4f

Fix for frequent unnecessary shader recompilation during hair editing.

The depsgraph component node for invalidating the strand shader was located in
the GEOMETRY component of the object. This component by default gets tagged along
with every other object part during editing. Only standardized way of avoiding this
would be putting it in a different datablock, but the shader is very much tied to
the particular object due to the displacement function from its node tree.

For now the solution is a new component GEOMETRY_SHADER, which does not get tagged
when the ID node is tagged. It still gets regular updates from node tree changes.
This seems to be the least invasive way of avoiding unnecessary performance drops,
and can be removed and replaced easily later on without disrupting other code work.

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

M	source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
M	source/blender/depsgraph/intern/builder/deg_builder_relations.cc
M	source/blender/depsgraph/intern/debug/deg_debug_graphviz.cc
M	source/blender/depsgraph/intern/depsgraph_types.h
M	source/blender/depsgraph/intern/nodes/deg_node.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/builder/deg_builder_nodes.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
index 80e7d20..b786aad 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
@@ -1040,7 +1040,7 @@ void DepsgraphNodeBuilder::build_obdata_geom(Main *bmain, Scene *scene, Object *
 			/* XXX placeholder operation until the future granularity design is sorted out */
 			if (md->type == eModifierType_Strands) {
 				StrandsModifierData *smd = (StrandsModifierData *)md;
-				add_operation_node(&ob->id, DEPSNODE_TYPE_GEOMETRY,
+				add_operation_node(&ob->id, DEPSNODE_TYPE_GEOMETRY_SHADER,
 				                   DEPSOP_TYPE_EXEC, function_bind(BKE_strands_shader_update, _1, ob, smd),
 				                   DEG_OPCODE_GEOMETRY_STRANDS_SHADER, md->name);
 			}
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
index 31124f5..e4847cd 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
@@ -1755,7 +1755,7 @@ void DepsgraphRelationBuilder::build_obdata_geom(Main *bmain, Scene *scene, Obje
 
 			/* XXX placeholder operation until the future granularity design is sorted out */
 			if (md->type == eModifierType_Strands) {
-				OperationKey shader_update_key(&ob->id, DEPSNODE_TYPE_GEOMETRY,
+				OperationKey shader_update_key(&ob->id, DEPSNODE_TYPE_GEOMETRY_SHADER,
 				                               DEG_OPCODE_GEOMETRY_STRANDS_SHADER, md->name);
 				RelationBuilderHandle strands_handle(this, find_node(shader_update_key));
 				
diff --git a/source/blender/depsgraph/intern/debug/deg_debug_graphviz.cc b/source/blender/depsgraph/intern/debug/deg_debug_graphviz.cc
index 5ce84ee..a24648f 100644
--- a/source/blender/depsgraph/intern/debug/deg_debug_graphviz.cc
+++ b/source/blender/depsgraph/intern/debug/deg_debug_graphviz.cc
@@ -397,6 +397,7 @@ static void deg_debug_graphviz_node(const DebugContext &ctx,
 		case DEPSNODE_TYPE_TRANSFORM:
 		case DEPSNODE_TYPE_PROXY:
 		case DEPSNODE_TYPE_GEOMETRY:
+		case DEPSNODE_TYPE_GEOMETRY_SHADER:
 		case DEPSNODE_TYPE_SEQUENCER:
 		case DEPSNODE_TYPE_EVAL_POSE:
 		case DEPSNODE_TYPE_BONE:
@@ -440,6 +441,7 @@ static bool deg_debug_graphviz_is_cluster(const DepsNode *node)
 		case DEPSNODE_TYPE_TRANSFORM:
 		case DEPSNODE_TYPE_PROXY:
 		case DEPSNODE_TYPE_GEOMETRY:
+		case DEPSNODE_TYPE_GEOMETRY_SHADER:
 		case DEPSNODE_TYPE_SEQUENCER:
 		case DEPSNODE_TYPE_EVAL_POSE:
 		case DEPSNODE_TYPE_BONE:
diff --git a/source/blender/depsgraph/intern/depsgraph_types.h b/source/blender/depsgraph/intern/depsgraph_types.h
index 44333b7..401a6aa 100644
--- a/source/blender/depsgraph/intern/depsgraph_types.h
+++ b/source/blender/depsgraph/intern/depsgraph_types.h
@@ -122,6 +122,8 @@ typedef enum eDepsNode_Type {
 	DEPSNODE_TYPE_GEOMETRY         = 15,
 	/* Sequencer Component (Scene Only) */
 	DEPSNODE_TYPE_SEQUENCER        = 16,
+	/* Geometry Shader Component (object-specific shader cache) */
+	DEPSNODE_TYPE_GEOMETRY_SHADER  = 17,
 
 	/* **** Evaluation-Related Outer Types (with Subdata) **** */
 
diff --git a/source/blender/depsgraph/intern/nodes/deg_node.cc b/source/blender/depsgraph/intern/nodes/deg_node.cc
index db807d2..0f8f4b8 100644
--- a/source/blender/depsgraph/intern/nodes/deg_node.cc
+++ b/source/blender/depsgraph/intern/nodes/deg_node.cc
@@ -251,14 +251,19 @@ void IDDepsNode::tag_update(Depsgraph *graph)
 	GHASH_FOREACH_BEGIN(ComponentDepsNode *, comp_node, components)
 	{
 		/* TODO(sergey): What about drievrs? */
-		bool do_component_tag = comp_node->type != DEPSNODE_TYPE_ANIMATION;
-		if (comp_node->type == DEPSNODE_TYPE_ANIMATION) {
+		bool do_component_tag;
+		if (comp_node->type == DEPSNODE_TYPE_GEOMETRY_SHADER) {
+			do_component_tag = false;
+		}
+		else if (comp_node->type == DEPSNODE_TYPE_ANIMATION) {
 			AnimData *adt = BKE_animdata_from_id(id);
 			/* Animation data might be null if relations are tagged for update. */
-			if (adt != NULL && (adt->recalc & ADT_RECALC_ANIM)) {
-				do_component_tag = true;
-			}
+			do_component_tag = (adt != NULL) && (adt->recalc & ADT_RECALC_ANIM);
+		}
+		else {
+			do_component_tag = true;
 		}
+		
 		if (do_component_tag) {
 			comp_node->tag_update(graph);
 		}
diff --git a/source/blender/depsgraph/intern/nodes/deg_node_component.cc b/source/blender/depsgraph/intern/nodes/deg_node_component.cc
index 6ac45c9..9e98c71 100644
--- a/source/blender/depsgraph/intern/nodes/deg_node_component.cc
+++ b/source/blender/depsgraph/intern/nodes/deg_node_component.cc
@@ -324,6 +324,11 @@ static DepsNodeFactoryImpl<ProxyComponentDepsNode> DNTI_PROXY;
 DEG_DEPSNODE_DEFINE(GeometryComponentDepsNode, DEPSNODE_TYPE_GEOMETRY, "Geometry Component");
 static DepsNodeFactoryImpl<GeometryComponentDepsNode> DNTI_GEOMETRY;
 
+/* Geometry Shader Component Defines ====================== */
+
+DEG_DEPSNODE_DEFINE(GeometryShaderComponentDepsNode, DEPSNODE_TYPE_GEOMETRY_SHADER, "Geometry Shader Component");
+static DepsNodeFactoryImpl<GeometryShaderComponentDepsNode> DNTI_GEOMETRY_SHADER;
+
 /* Sequencer Component Defines ============================ */
 
 DEG_DEPSNODE_DEFINE(SequencerComponentDepsNode, DEPSNODE_TYPE_SEQUENCER, "Sequencer Component");
@@ -376,6 +381,7 @@ void deg_register_component_depsnodes()
 	deg_register_node_typeinfo(&DNTI_ANIMATION);
 	deg_register_node_typeinfo(&DNTI_TRANSFORM);
 	deg_register_node_typeinfo(&DNTI_GEOMETRY);
+	deg_register_node_typeinfo(&DNTI_GEOMETRY_SHADER);
 	deg_register_node_typeinfo(&DNTI_SEQUENCER);
 
 	deg_register_node_typeinfo(&DNTI_EVAL_POSE);
diff --git a/source/blender/depsgraph/intern/nodes/deg_node_component.h b/source/blender/depsgraph/intern/nodes/deg_node_component.h
index 6f62d91..7b0af36 100644
--- a/source/blender/depsgraph/intern/nodes/deg_node_component.h
+++ b/source/blender/depsgraph/intern/nodes/deg_node_component.h
@@ -188,6 +188,10 @@ struct SequencerComponentDepsNode : public ComponentDepsNode {
 	DEG_DEPSNODE_DECLARE;
 };
 
+struct GeometryShaderComponentDepsNode : public ComponentDepsNode {
+	DEG_DEPSNODE_DECLARE;
+};
+
 struct PoseComponentDepsNode : public ComponentDepsNode {
 	DEG_DEPSNODE_DECLARE;
 };




More information about the Bf-blender-cvs mailing list