[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [18696] branches/blender2.5/blender/source /blender: 2.5
Ton Roosendaal
ton at blender.org
Tue Jan 27 18:12:40 CET 2009
Revision: 18696
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18696
Author: ton
Date: 2009-01-27 18:12:40 +0100 (Tue, 27 Jan 2009)
Log Message:
-----------
2.5
Compositor now uses threaded jobs.
- updates happen per preview node! Check this file for
fun: http://www.blender.org/bf/composite_image.blend
(any compo node could get preview!)
- had to ensure the composite data gets fully copied before
it executes thread, so editing is not frustrated.
- put back node buttons (missing init)
- added WM_jobs api call to check for running job,
illustrated with red light icon in 'use nodes' button.
- added another callback to WM_jobs, to initialize.
use this init to ensure you only do it when job really
starts.
- added an extra notifier option for WM_jobs, to signal
finished job (like redraw image view)
- fixed file read error, it copied the screen it read,
instead of using it.
- commented out annoying prints for missing ops in imagewin
Modified Paths:
--------------
branches/blender2.5/blender/source/blender/blenkernel/BKE_node.h
branches/blender2.5/blender/source/blender/blenkernel/intern/node.c
branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c
branches/blender2.5/blender/source/blender/editors/preview/previewrender.c
branches/blender2.5/blender/source/blender/editors/space_image/image_header.c
branches/blender2.5/blender/source/blender/editors/space_image/space_image.c
branches/blender2.5/blender/source/blender/editors/space_node/drawnode.c
branches/blender2.5/blender/source/blender/editors/space_node/node_draw.c
branches/blender2.5/blender/source/blender/editors/space_node/node_edit.c
branches/blender2.5/blender/source/blender/editors/space_node/node_header.c
branches/blender2.5/blender/source/blender/editors/space_node/node_intern.h
branches/blender2.5/blender/source/blender/editors/space_node/node_ops.c
branches/blender2.5/blender/source/blender/editors/space_node/space_node.c
branches/blender2.5/blender/source/blender/makesdna/DNA_node_types.h
branches/blender2.5/blender/source/blender/makesdna/DNA_space_types.h
branches/blender2.5/blender/source/blender/windowmanager/WM_api.h
branches/blender2.5/blender/source/blender/windowmanager/WM_types.h
branches/blender2.5/blender/source/blender/windowmanager/intern/wm.c
branches/blender2.5/blender/source/blender/windowmanager/intern/wm_files.c
branches/blender2.5/blender/source/blender/windowmanager/intern/wm_init_exit.c
branches/blender2.5/blender/source/blender/windowmanager/intern/wm_jobs.c
branches/blender2.5/blender/source/blender/windowmanager/intern/wm_window.c
Added Paths:
-----------
branches/blender2.5/blender/source/blender/editors/include/ED_node.h
Modified: branches/blender2.5/blender/source/blender/blenkernel/BKE_node.h
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/BKE_node.h 2009-01-27 12:49:44 UTC (rev 18695)
+++ branches/blender2.5/blender/source/blender/blenkernel/BKE_node.h 2009-01-27 17:12:40 UTC (rev 18696)
@@ -106,6 +106,7 @@
#define NODE_BREAK 2
#define NODE_FINISHED 4
#define NODE_FREEBUFS 8
+#define NODE_SKIPPED 16
/* nodetype->nclass, for add-menu and themes */
#define NODE_CLASS_INPUT 0
@@ -148,6 +149,11 @@
void ntreeClearPreview(struct bNodeTree *ntree);
void ntreeFreeCache(struct bNodeTree *ntree);
+
+ /* calls allowing threaded composite */
+struct bNodeTree *ntreeLocalize(struct bNodeTree *ntree);
+void ntreeLocalSync(struct bNodeTree *localtree, struct bNodeTree *ntree);
+void ntreeLocalMerge(struct bNodeTree *localtree, struct bNodeTree *ntree);
/* ************** GENERIC API, NODES *************** */
Modified: branches/blender2.5/blender/source/blender/blenkernel/intern/node.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/intern/node.c 2009-01-27 12:49:44 UTC (rev 18695)
+++ branches/blender2.5/blender/source/blender/blenkernel/intern/node.c 2009-01-27 17:12:40 UTC (rev 18696)
@@ -1158,6 +1158,104 @@
return newtree;
}
+/* *************** preview *********** */
+/* if node->preview, then we assume the rect to exist */
+
+static void node_free_preview(bNode *node)
+{
+ if(node->preview) {
+ if(node->preview->rect)
+ MEM_freeN(node->preview->rect);
+ MEM_freeN(node->preview);
+ node->preview= NULL;
+ }
+}
+
+static void node_init_preview(bNode *node, int xsize, int ysize)
+{
+
+ if(node->preview==NULL) {
+ node->preview= MEM_callocN(sizeof(bNodePreview), "node preview");
+ // printf("added preview %s\n", node->name);
+ }
+
+ /* node previews can get added with variable size this way */
+ if(xsize==0 || ysize==0)
+ return;
+
+ /* sanity checks & initialize */
+ if(node->preview->rect) {
+ if(node->preview->xsize!=xsize && node->preview->ysize!=ysize) {
+ MEM_freeN(node->preview->rect);
+ node->preview->rect= NULL;
+ }
+ }
+
+ if(node->preview->rect==NULL) {
+ node->preview->rect= MEM_callocN(4*xsize + xsize*ysize*sizeof(float)*4, "node preview rect");
+ node->preview->xsize= xsize;
+ node->preview->ysize= ysize;
+ }
+}
+
+void ntreeInitPreview(bNodeTree *ntree, int xsize, int ysize)
+{
+ bNode *node;
+
+ if(ntree==NULL)
+ return;
+
+ for(node= ntree->nodes.first; node; node= node->next) {
+ if(node->typeinfo->flag & NODE_PREVIEW) /* hrms, check for closed nodes? */
+ node_init_preview(node, xsize, ysize);
+ if(node->type==NODE_GROUP && (node->flag & NODE_GROUP_EDIT))
+ ntreeInitPreview((bNodeTree *)node->id, xsize, ysize);
+ }
+}
+
+static void nodeClearPreview(bNode *node)
+{
+ if(node->preview && node->preview->rect)
+ memset(node->preview->rect, 0, MEM_allocN_len(node->preview->rect));
+}
+
+/* use it to enforce clear */
+void ntreeClearPreview(bNodeTree *ntree)
+{
+ bNode *node;
+
+ if(ntree==NULL)
+ return;
+
+ for(node= ntree->nodes.first; node; node= node->next) {
+ if(node->typeinfo->flag & NODE_PREVIEW)
+ nodeClearPreview(node);
+ if(node->type==NODE_GROUP && (node->flag & NODE_GROUP_EDIT))
+ ntreeClearPreview((bNodeTree *)node->id);
+ }
+}
+
+/* hack warning! this function is only used for shader previews, and
+since it gets called multiple times per pixel for Ztransp we only
+add the color once. Preview gets cleared before it starts render though */
+void nodeAddToPreview(bNode *node, float *col, int x, int y)
+{
+ bNodePreview *preview= node->preview;
+ if(preview) {
+ if(x>=0 && y>=0) {
+ if(x<preview->xsize && y<preview->ysize) {
+ float *tar= preview->rect+ 4*((preview->xsize*y) + x);
+ //if(tar[0]==0.0f) {
+ QUATCOPY(tar, col);
+ //}
+ }
+ //else printf("prv out bound x y %d %d\n", x, y);
+ }
+ //else printf("prv out bound x y %d %d\n", x, y);
+ }
+}
+
+
/* ************** Free stuff ********** */
/* goes over entire tree */
@@ -1215,11 +1313,8 @@
BLI_freelistN(&node->inputs);
BLI_freelistN(&node->outputs);
- if(node->preview) {
- if(node->preview->rect)
- MEM_freeN(node->preview->rect);
- MEM_freeN(node->preview);
- }
+ node_free_preview(node);
+
if(node->typeinfo && node->typeinfo->freestoragefunc) {
node->typeinfo->freestoragefunc(node);
}
@@ -1652,14 +1747,8 @@
for(sock= node->outputs.first; sock; sock= sock->next) {
if(sock->ns.data) {
- free_compbuf(sock->ns.data);
- sock->ns.data= NULL;
-
- //if(node->preview && node->preview->rect) {
- // MEM_freeN(node->preview->rect);
- // node->preview->rect= NULL;
- //}
-
+ //free_compbuf(sock->ns.data);
+ //sock->ns.data= NULL;
}
}
node->need_exec= 1;
@@ -1683,96 +1772,7 @@
}
-/* *************** preview *********** */
-/* if node->preview, then we assume the rect to exist */
-
-static void nodeInitPreview(bNode *node, int xsize, int ysize)
-{
-
- if(node->preview==NULL) {
- node->preview= MEM_callocN(sizeof(bNodePreview), "node preview");
-// printf("added preview %s\n", node->name);
- }
-
- /* node previews can get added with variable size this way */
- if(xsize==0 || ysize==0)
- return;
-
- /* sanity checks & initialize */
- if(node->preview->rect) {
- if(node->preview->xsize!=xsize && node->preview->ysize!=ysize) {
- MEM_freeN(node->preview->rect);
- node->preview->rect= NULL;
- }
- }
-
- if(node->preview->rect==NULL) {
- node->preview->rect= MEM_callocN(4*xsize + xsize*ysize*sizeof(float)*4, "node preview rect");
- node->preview->xsize= xsize;
- node->preview->ysize= ysize;
- }
-}
-
-void ntreeInitPreview(bNodeTree *ntree, int xsize, int ysize)
-{
- bNode *node;
-
- if(ntree==NULL)
- return;
-
- for(node= ntree->nodes.first; node; node= node->next) {
- if(node->typeinfo->flag & NODE_PREVIEW) /* hrms, check for closed nodes? */
- nodeInitPreview(node, xsize, ysize);
- if(node->type==NODE_GROUP && (node->flag & NODE_GROUP_EDIT))
- ntreeInitPreview((bNodeTree *)node->id, xsize, ysize);
- }
-}
-
-static void nodeClearPreview(bNode *node)
-{
- if(node->preview && node->preview->rect)
- memset(node->preview->rect, 0, MEM_allocN_len(node->preview->rect));
-}
-
-/* use it to enforce clear */
-void ntreeClearPreview(bNodeTree *ntree)
-{
- bNode *node;
-
- if(ntree==NULL)
- return;
-
- for(node= ntree->nodes.first; node; node= node->next) {
- if(node->typeinfo->flag & NODE_PREVIEW)
- nodeClearPreview(node);
- if(node->type==NODE_GROUP && (node->flag & NODE_GROUP_EDIT))
- ntreeClearPreview((bNodeTree *)node->id);
- }
-}
-
-/* hack warning! this function is only used for shader previews, and
- since it gets called multiple times per pixel for Ztransp we only
- add the color once. Preview gets cleared before it starts render though */
-void nodeAddToPreview(bNode *node, float *col, int x, int y)
-{
- bNodePreview *preview= node->preview;
- if(preview) {
- if(x>=0 && y>=0) {
- if(x<preview->xsize && y<preview->ysize) {
- float *tar= preview->rect+ 4*((preview->xsize*y) + x);
- //if(tar[0]==0.0f) {
- QUATCOPY(tar, col);
- //}
- }
- //else printf("prv out bound x y %d %d\n", x, y);
- }
- //else printf("prv out bound x y %d %d\n", x, y);
- }
-}
-
-
-
/* ******************* executing ************* */
/* see notes at ntreeBeginExecTree */
@@ -2205,7 +2205,7 @@
bNodeStack *nsin[MAX_SOCKET]; /* arbitrary... watch this */
bNodeStack *nsout[MAX_SOCKET]; /* arbitrary... watch this */
bNode *node= node_v;
- ThreadData *thd= (ThreadData *)node->new_node; /* abuse */
+ ThreadData *thd= (ThreadData *)node->threaddata;
node_get_stack(node, thd->stack, nsin, nsout);
@@ -2300,7 +2300,7 @@
}
else {
/* tag for getExecutableNode() */
- node->exec= NODE_READY|NODE_FINISHED;
+ node->exec= NODE_READY|NODE_FINISHED|NODE_SKIPPED;
}
}
@@ -2410,7 +2410,7 @@
/* sets need_exec tags in nodes */
totnode= setExecutableNodes(ntree, &thdata);
-
+
BLI_init_threads(&threads, exec_composite_node, rd->threads);
while(rendering) {
@@ -2418,7 +2418,7 @@
if(BLI_available_threads(&threads)) {
node= getExecutableNode(ntree);
if(node) {
-
+
if(ntree->timecursor)
ntree->timecursor(ntree->tch, totnode);
if(ntree->stats_draw) {
@@ -2428,7 +2428,7 @@
}
totnode--;
- node->new_node = (bNode *)&thdata;
+ node->threaddata = &thdata;
node->exec= NODE_PROCESSING;
BLI_insert_thread(&threads, node);
}
@@ -2461,12 +2461,115 @@
}
}
-
BLI_end_threads(&threads);
ntreeEndExecTree(ntree);
}
+
+/* ********** copy composite tree entirely, to allow threaded exec ******************* */
+/* ***************** do NOT execute this in a thread! ****************** */
+
+/* returns localized composite tree for execution in threads */
+/* local tree then owns all compbufs */
+bNodeTree *ntreeLocalize(bNodeTree *ntree)
+{
+ bNodeTree *ltree= ntreeCopyTree(ntree, 0);
+ bNode *node;
+ bNodeSocket *sock;
+
+ /* move over the compbufs */
+ /* right after ntreeCopyTree() oldsock pointers are valid */
+ for(node= ntree->nodes.first; node; node= node->next) {
+
+ /* store new_node pointer to original */
+ node->new_node->new_node= node;
+ /* ensure new user input gets handled ok */
+ node->need_exec= 0;
+
+ for(sock= node->outputs.first; sock; sock= sock->next) {
+
+ sock->new_sock->ns.data= sock->ns.data;
+ sock->ns.data= NULL;
+ sock->new_sock->new_sock= sock;
+ }
+ }
+
+ return ltree;
+}
+
+static int node_exists(bNodeTree *ntree, bNode *testnode)
+{
+ bNode *node= ntree->nodes.first;
+ for(; node; node= node->next)
+ if(node==testnode)
+ return 1;
+ return 0;
+}
+
+static int outsocket_exists(bNode *node, bNodeSocket *testsock)
+{
+ bNodeSocket *sock= node->outputs.first;
+ for(; sock; sock= sock->next)
+ if(sock==testsock)
+ return 1;
+ return 0;
+}
+
+
+/* sync local composite with real tree */
+/* local composite is supposed to be running, be careful moving previews! */
+void ntreeLocalSync(bNodeTree *localtree, bNodeTree *ntree)
+{
+ bNode *lnode;
+
+ /* move over the compbufs and previews */
+ for(lnode= localtree->nodes.first; lnode; lnode= lnode->next) {
+ if( (lnode->exec & NODE_READY) && !(lnode->exec & NODE_SKIPPED) ) {
+ if(node_exists(ntree, lnode->new_node)) {
+
+ if(lnode->preview && lnode->preview->rect) {
+ node_free_preview(lnode->new_node);
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list