[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [39975] trunk/blender/source/blender: Fix for multiple parallel group node executions.

Lukas Toenne lukas.toenne at googlemail.com
Tue Sep 6 18:32:51 CEST 2011


Revision: 39975
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=39975
Author:   lukastoenne
Date:     2011-09-06 16:32:51 +0000 (Tue, 06 Sep 2011)
Log Message:
-----------
Fix for multiple parallel group node executions.

This would previously break because begin/end functions for each tree type still have some checks of the ntree->execdata pointer in them, despite the intended use of execdata instances instead of trees themselves for execution data storage. This is an artifact of the old execution system that required these checks to be made in the functions to avoid multiple execution of top-level trees. Now these functions take an additional argument, so group nodes can prevent them from setting and checking the nodetree->execdata pointers.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_node.h
    trunk/blender/source/blender/blenkernel/intern/material.c
    trunk/blender/source/blender/blenkernel/intern/node.c
    trunk/blender/source/blender/blenkernel/intern/texture.c
    trunk/blender/source/blender/editors/sculpt_paint/paint_image.c
    trunk/blender/source/blender/editors/sculpt_paint/sculpt.c
    trunk/blender/source/blender/nodes/composite/node_composite_tree.c
    trunk/blender/source/blender/nodes/composite/nodes/node_composite_common.c
    trunk/blender/source/blender/nodes/shader/node_shader_tree.c
    trunk/blender/source/blender/nodes/shader/nodes/node_shader_common.c
    trunk/blender/source/blender/nodes/texture/node_texture_tree.c
    trunk/blender/source/blender/nodes/texture/nodes/node_texture_common.c
    trunk/blender/source/blender/render/intern/source/render_texture.c

Modified: trunk/blender/source/blender/blenkernel/BKE_node.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_node.h	2011-09-06 16:20:01 UTC (rev 39974)
+++ trunk/blender/source/blender/blenkernel/BKE_node.h	2011-09-06 16:32:51 UTC (rev 39975)
@@ -466,8 +466,8 @@
 
 /* API */
 
-struct bNodeTreeExec *ntreeShaderBeginExecTree(struct bNodeTree *ntree);
-void			ntreeShaderEndExecTree(struct bNodeTreeExec *exec);
+struct bNodeTreeExec *ntreeShaderBeginExecTree(struct bNodeTree *ntree, int use_tree_data);
+void			ntreeShaderEndExecTree(struct bNodeTreeExec *exec, int use_tree_data);
 void			ntreeShaderExecTree(struct bNodeTree *ntree, struct ShadeInput *shi, struct ShadeResult *shr);
 void			ntreeShaderGetTexcoMode(struct bNodeTree *ntree, int osa, short *texco, int *mode);
 void			nodeShaderSynchronizeID(struct bNode *node, int copyto);
@@ -594,8 +594,8 @@
 
 /* API */
 struct CompBuf;
-struct bNodeTreeExec *ntreeCompositBeginExecTree(struct bNodeTree *ntree);
-void ntreeCompositEndExecTree(struct bNodeTreeExec *exec);
+struct bNodeTreeExec *ntreeCompositBeginExecTree(struct bNodeTree *ntree, int use_tree_data);
+void ntreeCompositEndExecTree(struct bNodeTreeExec *exec, int use_tree_data);
 void ntreeCompositExecTree(struct bNodeTree *ntree, struct RenderData *rd, int do_previews);
 void ntreeCompositTagRender(struct Scene *sce);
 int ntreeCompositTagAnimated(struct bNodeTree *ntree);
@@ -642,8 +642,8 @@
 void ntreeTexCheckCyclics(struct bNodeTree *ntree);
 char* ntreeTexOutputMenu(struct bNodeTree *ntree);
 
-struct bNodeTreeExec *ntreeTexBeginExecTree(struct bNodeTree *ntree);
-void ntreeTexEndExecTree(struct bNodeTreeExec *exec);
+struct bNodeTreeExec *ntreeTexBeginExecTree(struct bNodeTree *ntree, int use_tree_data);
+void ntreeTexEndExecTree(struct bNodeTreeExec *exec, int use_tree_data);
 int ntreeTexExecTree(struct bNodeTree *ntree, struct TexResult *target, float *coord, float *dxt, float *dyt, int osatex, short thread, struct Tex *tex, short which_output, int cfra, int preview, struct ShadeInput *shi, struct MTex *mtex);
 
 

Modified: trunk/blender/source/blender/blenkernel/intern/material.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/material.c	2011-09-06 16:20:01 UTC (rev 39974)
+++ trunk/blender/source/blender/blenkernel/intern/material.c	2011-09-06 16:32:51 UTC (rev 39975)
@@ -926,7 +926,7 @@
 		init_render_nodetree(mat->nodetree, mat, r_mode, amb);
 		
 		if (!mat->nodetree->execdata)
-			mat->nodetree->execdata = ntreeShaderBeginExecTree(mat->nodetree);
+			mat->nodetree->execdata = ntreeShaderBeginExecTree(mat->nodetree, 1);
 	}
 }
 
@@ -960,7 +960,7 @@
 {
 	if(mat && mat->nodetree && mat->use_nodes) {
 		if (mat->nodetree->execdata)
-			ntreeShaderEndExecTree(mat->nodetree->execdata);
+			ntreeShaderEndExecTree(mat->nodetree->execdata, 1);
 	}
 }
 

Modified: trunk/blender/source/blender/blenkernel/intern/node.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/node.c	2011-09-06 16:20:01 UTC (rev 39974)
+++ trunk/blender/source/blender/blenkernel/intern/node.c	2011-09-06 16:32:51 UTC (rev 39975)
@@ -897,13 +897,13 @@
 	if (ntree->execdata) {
 		switch (ntree->type) {
 		case NTREE_COMPOSIT:
-			ntreeCompositEndExecTree(ntree->execdata);
+			ntreeCompositEndExecTree(ntree->execdata, 1);
 			break;
 		case NTREE_SHADER:
-			ntreeShaderEndExecTree(ntree->execdata);
+			ntreeShaderEndExecTree(ntree->execdata, 1);
 			break;
 		case NTREE_TEXTURE:
-			ntreeTexEndExecTree(ntree->execdata);
+			ntreeTexEndExecTree(ntree->execdata, 1);
 			break;
 		}
 	}

Modified: trunk/blender/source/blender/blenkernel/intern/texture.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/texture.c	2011-09-06 16:20:01 UTC (rev 39974)
+++ trunk/blender/source/blender/blenkernel/intern/texture.c	2011-09-06 16:32:51 UTC (rev 39975)
@@ -767,7 +767,7 @@
 
 	if(tex->nodetree) {
 		if (tex->nodetree->execdata) {
-			ntreeTexEndExecTree(tex->nodetree->execdata);
+			ntreeTexEndExecTree(tex->nodetree->execdata, 1);
 		}
 		texn->nodetree= ntreeCopyTree(tex->nodetree); 
 	}

Modified: trunk/blender/source/blender/editors/sculpt_paint/paint_image.c
===================================================================
--- trunk/blender/source/blender/editors/sculpt_paint/paint_image.c	2011-09-06 16:20:01 UTC (rev 39974)
+++ trunk/blender/source/blender/editors/sculpt_paint/paint_image.c	2011-09-06 16:32:51 UTC (rev 39975)
@@ -4664,7 +4664,7 @@
 	if(brush) {
 		MTex *mtex= &brush->mtex;
 		if(mtex->tex && mtex->tex->nodetree)
-			ntreeTexBeginExecTree(mtex->tex->nodetree); /* has internal flag to detect it only does it once */
+			ntreeTexBeginExecTree(mtex->tex->nodetree, 1); /* has internal flag to detect it only does it once */
 	}
 	
 }
@@ -4806,7 +4806,7 @@
 	if(brush) {
 		MTex *mtex= &brush->mtex;
 		if(mtex->tex && mtex->tex->nodetree)
-			ntreeTexEndExecTree(mtex->tex->nodetree->execdata);
+			ntreeTexEndExecTree(mtex->tex->nodetree->execdata, 1);
 	}	
 }
 

Modified: trunk/blender/source/blender/editors/sculpt_paint/sculpt.c
===================================================================
--- trunk/blender/source/blender/editors/sculpt_paint/sculpt.c	2011-09-06 16:20:01 UTC (rev 39974)
+++ trunk/blender/source/blender/editors/sculpt_paint/sculpt.c	2011-09-06 16:32:51 UTC (rev 39975)
@@ -3274,7 +3274,7 @@
 
 	/* init mtex nodes */
 	if(mtex->tex && mtex->tex->nodetree)
-		ntreeTexBeginExecTree(mtex->tex->nodetree); /* has internal flag to detect it only does it once */
+		ntreeTexBeginExecTree(mtex->tex->nodetree, 1); /* has internal flag to detect it only does it once */
 
 	/* TODO: Shouldn't really have to do this at the start of every
 	   stroke, but sculpt would need some sort of notification when
@@ -3455,7 +3455,7 @@
 	MTex *mtex= &brush->mtex;
 
 	if(mtex->tex && mtex->tex->nodetree)
-		ntreeTexEndExecTree(mtex->tex->nodetree->execdata);
+		ntreeTexEndExecTree(mtex->tex->nodetree->execdata, 1);
 }
 
 static void sculpt_stroke_done(bContext *C, struct PaintStroke *UNUSED(stroke))

Modified: trunk/blender/source/blender/nodes/composite/node_composite_tree.c
===================================================================
--- trunk/blender/source/blender/nodes/composite/node_composite_tree.c	2011-09-06 16:20:01 UTC (rev 39974)
+++ trunk/blender/source/blender/nodes/composite/node_composite_tree.c	2011-09-06 16:32:51 UTC (rev 39975)
@@ -200,17 +200,22 @@
 };
 
 
-struct bNodeTreeExec *ntreeCompositBeginExecTree(bNodeTree *ntree)
+/* XXX Group nodes must set use_tree_data to false, since their trees can be shared by multiple nodes.
+ * If use_tree_data is true, the ntree->execdata pointer is checked to avoid multiple execution of top-level trees.
+ */
+struct bNodeTreeExec *ntreeCompositBeginExecTree(bNodeTree *ntree, int use_tree_data)
 {
 	bNodeTreeExec *exec;
 	bNode *node;
 	bNodeSocket *sock;
 	
-	/* XXX hack: prevent exec data from being generated twice.
-	 * this should be handled by the renderer!
-	 */
-	if (ntree->execdata)
-		return ntree->execdata;
+	if (use_tree_data) {
+		/* XXX hack: prevent exec data from being generated twice.
+		 * this should be handled by the renderer!
+		 */
+		if (ntree->execdata)
+			return ntree->execdata;
+	}
 	
 	/* ensures only a single output node is enabled */
 	ntreeSetOutput(ntree);
@@ -236,15 +241,20 @@
 		}
 	}
 	
-	/* XXX this should not be necessary, but is still used for cmp/sha/tex nodes,
+	if (use_tree_data) {
+		/* XXX this should not be necessary, but is still used for cmp/sha/tex nodes,
 		 * which only store the ntree pointer. Should be fixed at some point!
 		 */
-	ntree->execdata = exec;
+		ntree->execdata = exec;
+	}
 	
 	return exec;
 }
 
-void ntreeCompositEndExecTree(bNodeTreeExec *exec)
+/* XXX Group nodes must set use_tree_data to false, since their trees can be shared by multiple nodes.
+ * If use_tree_data is true, the ntree->execdata pointer is checked to avoid multiple execution of top-level trees.
+ */
+void ntreeCompositEndExecTree(bNodeTreeExec *exec, int use_tree_data)
 {
 	if(exec) {
 		bNodeTree *ntree= exec->nodetree;
@@ -269,8 +279,10 @@
 	
 		ntree_exec_end(exec);
 		
-		/* XXX clear nodetree backpointer to exec data, same problem as noted in ntreeBeginExecTree */
-		ntree->execdata = NULL;
+		if (use_tree_data) {
+			/* XXX clear nodetree backpointer to exec data, same problem as noted in ntreeBeginExecTree */
+			ntree->execdata = NULL;
+		}
 	}
 }
 
@@ -495,10 +507,10 @@
 				/* has internal flag to detect it only does it once */
 				if(init) {
 					if (!tex->nodetree->execdata)
-						tex->nodetree->execdata = ntreeTexBeginExecTree(tex->nodetree); 
+						tex->nodetree->execdata = ntreeTexBeginExecTree(tex->nodetree, 1); 
 				}
 				else
-					ntreeTexEndExecTree(tex->nodetree->execdata);
+					ntreeTexEndExecTree(tex->nodetree->execdata, 1);
 					tex->nodetree->execdata = NULL;
 			}
 		}
@@ -521,8 +533,10 @@
 	if(do_preview)
 		ntreeInitPreview(ntree, 0, 0);
 	
-	if (!ntree->execdata)
-		exec = ntreeCompositBeginExecTree(ntree);
+	if (!ntree->execdata) {
+		/* XXX this is the top-level tree, so we use the ntree->execdata pointer. */
+		exec = ntreeCompositBeginExecTree(ntree, 1);
+	}
 	ntree_composite_texnode(ntree, 1);
 	
 	/* prevent unlucky accidents */
@@ -592,7 +606,8 @@
 	
 	BLI_end_threads(&threads);
 	
-	ntreeCompositEndExecTree(exec);
+	/* XXX top-level tree uses the ntree->execdata pointer */
+	ntreeCompositEndExecTree(exec, 1);
 }
 
 /* *********************************************** */

Modified: trunk/blender/source/blender/nodes/composite/nodes/node_composite_common.c
===================================================================
--- trunk/blender/source/blender/nodes/composite/nodes/node_composite_common.c	2011-09-06 16:20:01 UTC (rev 39974)
+++ trunk/blender/source/blender/nodes/composite/nodes/node_composite_common.c	2011-09-06 16:32:51 UTC (rev 39975)
@@ -122,7 +122,7 @@
 	bNodeStack *ns;
 	
 	/* initialize the internal node tree execution */
-	exec = ntreeCompositBeginExecTree(ngroup);
+	exec = ntreeCompositBeginExecTree(ngroup, 0);
 	
 	/* tag group outputs as external to prevent freeing */
 	for (sock=ngroup->outputs.first; sock; sock=sock->next) {
@@ -135,11 +135,11 @@
 	return exec;
 }
 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list