[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [51944] trunk/blender/source/blender: Bugfix #33092

Ton Roosendaal ton at blender.org
Tue Nov 6 16:54:04 CET 2012


Revision: 51944
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=51944
Author:   ton
Date:     2012-11-06 15:54:04 +0000 (Tue, 06 Nov 2012)
Log Message:
-----------
Bugfix #33092

Fluid sim would stop or crash with node editor.

Bug was a real bad one - the code for giving out WM jobs was messed up for long.
It was giving a running fluid job to the compositer even... tsk!

I will go over jobs code carefully next days to see if it all behaves. Now it
allows per owner multiple jobs, provided it has different job_type set.

Also fixed: preview renders (material) were deadslow once a while - caused
by icon render setting miniature tile render sizes. Now it's fast again,
but there are still 3 icon jobs running per UI change... need to check what.

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	2012-11-06 15:32:05 UTC (rev 51943)
+++ trunk/blender/source/blender/editors/render/render_preview.c	2012-11-06 15:54:04 UTC (rev 51944)
@@ -237,6 +237,14 @@
 	return 0;
 }
 
+static Scene *preview_get_scene(void)
+{
+	if (pr_main == NULL) return NULL;
+	
+	return pr_main->scene.first;
+}
+
+
 /* call this with a pointer to initialize preview scene */
 /* call this with NULL to restore assigned ID pointers in preview scene */
 static Scene *preview_prepare_scene(Scene *scene, ID *id, int id_type, ShaderPreview *sp)
@@ -244,9 +252,7 @@
 	Scene *sce;
 	Base *base;
 	
-	if (pr_main == NULL) return NULL;
-	
-	sce = pr_main->scene.first;
+	sce = preview_get_scene();
 	if (sce) {
 		
 		/* this flag tells render to not execute depsgraph or ipos etc */
@@ -665,8 +671,23 @@
 	char name[32];
 	int sizex;
 	
+	/* in case of split preview, use border render */
+	if (split) {
+		if (first) sizex = sp->sizex / 2;
+		else sizex = sp->sizex - sp->sizex / 2;
+	}
+	else sizex = sp->sizex;
+	
+	/* we have to set preview variables first */
+	sce = preview_get_scene();
+	if (sce) {
+		sce->r.xsch = sizex;
+		sce->r.ysch = sp->sizey;
+		sce->r.size = 100;
+	}
+	
 	/* get the stuff from the builtin preview dbase */
-	sce = preview_prepare_scene(sp->scene, id, idtype, sp); // XXX sizex
+	sce = preview_prepare_scene(sp->scene, id, idtype, sp);
 	if (sce == NULL) return;
 	
 	if (!split || first) sprintf(name, "Preview %p", sp->owner);
@@ -694,18 +715,7 @@
 		sce->r.mode |= R_OSA;
 	}
 
-	/* in case of split preview, use border render */
-	if (split) {
-		if (first) sizex = sp->sizex / 2;
-		else sizex = sp->sizex - sp->sizex / 2;
-	}
-	else sizex = sp->sizex;
 
-	/* allocates or re-uses render result */
-	sce->r.xsch = sizex;
-	sce->r.ysch = sp->sizey;
-	sce->r.size = 100;
-
 	/* callbacs are cleared on GetRender() */
 	if (ELEM(sp->pr_method, PR_BUTS_RENDER, PR_NODE_RENDER)) {
 		RE_display_draw_cb(re, sp, shader_preview_draw);

Modified: trunk/blender/source/blender/windowmanager/WM_api.h
===================================================================
--- trunk/blender/source/blender/windowmanager/WM_api.h	2012-11-06 15:32:05 UTC (rev 51943)
+++ trunk/blender/source/blender/windowmanager/WM_api.h	2012-11-06 15:54:04 UTC (rev 51944)
@@ -320,9 +320,9 @@
 	WM_JOB_SUSPEND      = (1 << 3)
 };
 
-/* identifying jobs by owner alone is unreliable, this isnt saved, order can change */
+/* identifying jobs by owner alone is unreliable, this isnt saved, order can change (keep 0 for 'any') */
 enum {
-	WM_JOB_TYPE_ANY = -1,
+	WM_JOB_TYPE_ANY = 0,
 	WM_JOB_TYPE_COMPOSITE,
 	WM_JOB_TYPE_RENDER,
 	WM_JOB_TYPE_RENDER_PREVIEW,  /* UI preview */

Modified: trunk/blender/source/blender/windowmanager/intern/wm_jobs.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_jobs.c	2012-11-06 15:32:05 UTC (rev 51943)
+++ trunk/blender/source/blender/windowmanager/intern/wm_jobs.c	2012-11-06 15:54:04 UTC (rev 51944)
@@ -131,31 +131,34 @@
 };
 
 /* finds:
- * 1st priority: job with same owner and name
- * 2nd priority: job with same owner
+ * if type, compare for it, otherwise any matching job 
  */
-static wmJob *wm_job_find(wmWindowManager *wm, void *owner, const char *name)
+static wmJob *wm_job_find(wmWindowManager *wm, void *owner, const int job_type)
 {
-	wmJob *wm_job, *found = NULL;
+	wmJob *wm_job;
 	
 	for (wm_job = wm->jobs.first; wm_job; wm_job = wm_job->next)
 		if (wm_job->owner == owner) {
-			found = wm_job;
-			if (name && strcmp(wm_job->name, name) == 0)
+			
+			if (job_type) {
+				if ( wm_job->job_type == job_type)
+					return wm_job;
+			}
+			else
 				return wm_job;
 		}
 	
-	return found;
+	return NULL;
 }
 
 /* ******************* 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 
+/* every owner only gets a single job, adding a new one will stop running job and 
  * when stopped it starts the new one */
 wmJob *WM_jobs_get(wmWindowManager *wm, wmWindow *win, void *owner, const char *name, int flag, int job_type)
 {
-	wmJob *wm_job = wm_job_find(wm, owner, name);
+	wmJob *wm_job = wm_job_find(wm, owner, job_type);
 	
 	if (wm_job == NULL) {
 		wm_job = MEM_callocN(sizeof(wmJob), "new job");
@@ -167,6 +170,7 @@
 		wm_job->job_type = job_type;
 		BLI_strncpy(wm_job->name, name, sizeof(wm_job->name));
 	}
+	/* else: a running job, be careful */
 	
 	return wm_job;
 }
@@ -192,7 +196,7 @@
 
 float WM_jobs_progress(wmWindowManager *wm, void *owner)
 {
-	wmJob *wm_job = wm_job_find(wm, owner, NULL);
+	wmJob *wm_job = wm_job_find(wm, owner, WM_JOB_TYPE_ANY);
 	
 	if (wm_job && wm_job->flag & WM_JOB_PROGRESS)
 		return wm_job->progress;
@@ -202,7 +206,7 @@
 
 char *WM_jobs_name(wmWindowManager *wm, void *owner)
 {
-	wmJob *wm_job = wm_job_find(wm, owner, NULL);
+	wmJob *wm_job = wm_job_find(wm, owner, WM_JOB_TYPE_ANY);
 	
 	if (wm_job)
 		return wm_job->name;




More information about the Bf-blender-cvs mailing list