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. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs