[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