[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [34067] trunk/blender/source/blender: Todo item:

Ton Roosendaal ton at blender.org
Tue Jan 4 15:59:55 CET 2011


Revision: 34067
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=34067
Author:   ton
Date:     2011-01-04 15:59:55 +0100 (Tue, 04 Jan 2011)

Log Message:
-----------
Todo item:

New option to start threaded wmJobs, with flag WM_JOB_SUSPEND.
This makes the job wait 1 timer step before running. 

Used now for Material Icon render renders, which makes the
big preview to be always rendered first while using UI.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/render/render_preview.c
    trunk/blender/source/blender/windowmanager/WM_api.h
    trunk/blender/source/blender/windowmanager/intern/wm_jobs.c

Modified: trunk/blender/source/blender/editors/render/render_preview.c
===================================================================
--- trunk/blender/source/blender/editors/render/render_preview.c	2011-01-04 14:55:29 UTC (rev 34066)
+++ trunk/blender/source/blender/editors/render/render_preview.c	2011-01-04 14:59:55 UTC (rev 34067)
@@ -1231,7 +1231,8 @@
 	wmJob *steve;
 	ShaderPreview *sp;
 
-	steve= WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), owner, "Icon Preview", WM_JOB_EXCL_RENDER);
+	/* suspended start means it starts after 1 timer step, see WM_jobs_timer below */
+	steve= WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), owner, "Icon Preview", WM_JOB_EXCL_RENDER|WM_JOB_SUSPEND);
 	sp= MEM_callocN(sizeof(ShaderPreview), "shader preview");
 
 	/* customdata for preview thread */
@@ -1245,7 +1246,7 @@
 
 	/* setup job */
 	WM_jobs_customdata(steve, sp, shader_preview_free);
-	WM_jobs_timer(steve, 0.1, NC_MATERIAL, NC_MATERIAL);
+	WM_jobs_timer(steve, 0.25, NC_MATERIAL, NC_MATERIAL);
 	WM_jobs_callbacks(steve, common_preview_startjob, NULL, NULL, common_preview_endjob);
 
 	WM_jobs_start(CTX_wm_manager(C), steve);

Modified: trunk/blender/source/blender/windowmanager/WM_api.h
===================================================================
--- trunk/blender/source/blender/windowmanager/WM_api.h	2011-01-04 14:55:29 UTC (rev 34066)
+++ trunk/blender/source/blender/windowmanager/WM_api.h	2011-01-04 14:59:55 UTC (rev 34067)
@@ -316,6 +316,7 @@
 #define WM_JOB_PRIORITY		1
 #define WM_JOB_EXCL_RENDER	2
 #define WM_JOB_PROGRESS		4
+#define WM_JOB_SUSPEND		8
 
 struct wmJob *WM_jobs_get(struct wmWindowManager *wm, struct wmWindow *win, void *owner, const char *name, int flag);
 

Modified: trunk/blender/source/blender/windowmanager/intern/wm_jobs.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_jobs.c	2011-01-04 14:55:29 UTC (rev 34066)
+++ trunk/blender/source/blender/windowmanager/intern/wm_jobs.c	2011-01-04 14:59:55 UTC (rev 34067)
@@ -247,33 +247,40 @@
 	wmJob *steve;
 	int suspend= 0;
 	
-	for(steve= wm->jobs.first; steve; steve= steve->next) {
-		/* obvious case, no test needed */
-		if(steve==test || !steve->running) continue;
-		
-		/* if new job is not render, then check for same startjob */
-		if(0==(test->flag & WM_JOB_EXCL_RENDER)) 
-			if(steve->startjob!=test->startjob)
-				continue;
-		
-		/* if new job is render, any render job should be stopped */
-		if(test->flag & WM_JOB_EXCL_RENDER)
-		   if(0==(steve->flag & WM_JOB_EXCL_RENDER)) 
-			   continue;
-
+	/* job added with suspend flag, we wait 1 timer step before activating it */
+	if(test->flag & WM_JOB_SUSPEND) {
 		suspend= 1;
+		test->flag &= ~WM_JOB_SUSPEND;
+	}
+	else {
+		/* check other jobs */
+		for(steve= wm->jobs.first; steve; steve= steve->next) {
+			/* obvious case, no test needed */
+			if(steve==test || !steve->running) continue;
+			
+			/* if new job is not render, then check for same startjob */
+			if(0==(test->flag & WM_JOB_EXCL_RENDER)) 
+				if(steve->startjob!=test->startjob)
+					continue;
+			
+			/* if new job is render, any render job should be stopped */
+			if(test->flag & WM_JOB_EXCL_RENDER)
+			   if(0==(steve->flag & WM_JOB_EXCL_RENDER)) 
+				   continue;
 
-		/* if this job has higher priority, stop others */
-		if(test->flag & WM_JOB_PRIORITY) {
-			steve->stop= 1;
-			// printf("job stopped: %s\n", steve->name);
+			suspend= 1;
+
+			/* if this job has higher priority, stop others */
+			if(test->flag & WM_JOB_PRIORITY) {
+				steve->stop= 1;
+				// printf("job stopped: %s\n", steve->name);
+			}
 		}
 	}
-
+	
 	/* possible suspend ourselfs, waiting for other jobs, or de-suspend */
 	test->suspended= suspend;
 	// if(suspend) printf("job suspended: %s\n", test->name);
-
 }
 
 /* if job running, the same owner gave it a new job */
@@ -286,6 +293,7 @@
 		// printf("job started a running job, ending... %s\n", steve->name);
 	}
 	else {
+		
 		if(steve->customdata && steve->startjob) {
 			
 			wm_jobs_test_suspend_stop(wm, steve);





More information about the Bf-blender-cvs mailing list