Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTon Roosendaal <ton@blender.org>2009-06-07 15:12:35 +0400
committerTon Roosendaal <ton@blender.org>2009-06-07 15:12:35 +0400
commita2f9ca3b3fcd020e5124b6c3fb6523545377b5e2 (patch)
tree83830cf58852e6b2a6572d36b244bd6bdeddfebc /source/blender/windowmanager/intern/wm_jobs.c
parent1bb8d745b914aade700d69220e665096d5db43d0 (diff)
2.5
Nice goodie: Preview renders! - Added new preview.blend, allowing super wide cinemascope previews - Draws nicely blended inside widget type, rounded corners - Preview now renders using all available cpus/cores. - Uses - hopefully rock stable - method, which doesn't copy or allocate anything for previews, but just uses render API calls. - Multiple previews are possible! But, added provision in Jobs manager to only render one preview job at a time. If you start more preview jobs, they're suspended until it's their turn. Bugfix: new buttons context code crashed when going full-window. Tweaks are still needed for notifiers. I have to figure out still how to retrieve SpaceButs button view types...
Diffstat (limited to 'source/blender/windowmanager/intern/wm_jobs.c')
-rw-r--r--source/blender/windowmanager/intern/wm_jobs.c60
1 files changed, 45 insertions, 15 deletions
diff --git a/source/blender/windowmanager/intern/wm_jobs.c b/source/blender/windowmanager/intern/wm_jobs.c
index 31c3a803246..6dd150a3416 100644
--- a/source/blender/windowmanager/intern/wm_jobs.c
+++ b/source/blender/windowmanager/intern/wm_jobs.c
@@ -107,7 +107,7 @@ struct wmJob {
/* internal */
void *owner;
- short running, ready, do_update, stop;
+ short suspended, running, ready, do_update, stop;
/* once running, we store this separately */
void *run_customdata;
@@ -121,6 +121,8 @@ struct wmJob {
/* ******************* public API ***************** */
/* returns current or adds new job, but doesnt run it */
+/* every owner only gets a single job, adding a new one will stop running stop and
+ when stopped it starts the new one */
wmJob *WM_jobs_get(wmWindowManager *wm, wmWindow *win, void *owner)
{
wmJob *steve;
@@ -195,7 +197,26 @@ static void *do_job_thread(void *job_v)
return NULL;
}
-void WM_jobs_start(wmJob *steve)
+/* dont allow same startjob to be executed twice */
+static void wm_jobs_test_suspend(wmWindowManager *wm, wmJob *test)
+{
+ wmJob *steve;
+
+ for(steve= wm->jobs.first; steve; steve= steve->next)
+ if(steve!=test)
+ if(steve->running)
+ if(steve->startjob==test->startjob)
+ break;
+
+ if(steve)
+ test->suspended= 1;
+ else
+ test->suspended= 0;
+}
+
+/* if job running, the same owner gave it a new job */
+/* if different owner starts existing startjob, it suspends itself */
+void WM_jobs_start(wmWindowManager *wm, wmJob *steve)
{
if(steve->running) {
/* signal job to end and restart */
@@ -204,20 +225,24 @@ void WM_jobs_start(wmJob *steve)
else {
if(steve->customdata && steve->startjob) {
- /* copy to ensure proper free in end */
- steve->run_customdata= steve->customdata;
- steve->run_free= steve->free;
- steve->free= NULL;
- steve->customdata= NULL;
- steve->running= 1;
+ wm_jobs_test_suspend(wm, steve);
- if(steve->initjob)
- steve->initjob(steve->run_customdata);
-
- BLI_init_threads(&steve->threads, do_job_thread, 1);
- BLI_insert_thread(&steve->threads, steve);
+ if(steve->suspended==0) {
+ /* copy to ensure proper free in end */
+ steve->run_customdata= steve->customdata;
+ steve->run_free= steve->free;
+ steve->free= NULL;
+ steve->customdata= NULL;
+ steve->running= 1;
+
+ if(steve->initjob)
+ steve->initjob(steve->run_customdata);
+
+ BLI_init_threads(&steve->threads, do_job_thread, 1);
+ BLI_insert_thread(&steve->threads, steve);
- // printf("job started\n");
+ // printf("job started\n");
+ }
/* restarted job has timer already */
if(steve->wt==NULL)
@@ -269,6 +294,7 @@ static int wm_jobs_timer(bContext *C, wmOperator *op, wmEvent *evt)
for(; steve; steve= steve->next) {
if(evt->customdata==steve->wt) {
+
/* running threads */
if(steve->threads.first) {
@@ -298,7 +324,7 @@ static int wm_jobs_timer(bContext *C, wmOperator *op, wmEvent *evt)
/* new job added for steve? */
if(steve->customdata) {
- WM_jobs_start(steve);
+ WM_jobs_start(wm, steve);
}
else {
WM_event_remove_window_timer(steve->win, steve->wt);
@@ -310,6 +336,10 @@ static int wm_jobs_timer(bContext *C, wmOperator *op, wmEvent *evt)
}
}
}
+ else if(steve->suspended) {
+ WM_jobs_start(wm, steve);
+ }
+
return OPERATOR_FINISHED;
}
}