[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