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

Ton Roosendaal ton at blender.org
Fri Mar 25 18:11:32 CET 2011


Revision: 35785
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=35785
Author:   ton
Date:     2011-03-25 17:11:32 +0000 (Fri, 25 Mar 2011)
Log Message:
-----------
Bugfix #26195

When rendering, during processing scene data, drawing in 3d window
is now locked. Can get extended to more areas in UI easily.

At least this solves all crashes with conflicting memory access in
render && 3d drawing. Deleting objects via operators or delete 
modifiers isn't locked yet.

Also fixed: crash on quitting a renderwindow when it was rendering.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_screen.h
    trunk/blender/source/blender/blenkernel/intern/screen.c
    trunk/blender/source/blender/editors/render/render_internal.c
    trunk/blender/source/blender/editors/screen/area.c
    trunk/blender/source/blender/editors/space_view3d/space_view3d.c
    trunk/blender/source/blender/render/extern/include/RE_pipeline.h
    trunk/blender/source/blender/render/intern/include/render_types.h
    trunk/blender/source/blender/render/intern/source/pipeline.c
    trunk/blender/source/blender/windowmanager/intern/wm_window.c

Modified: trunk/blender/source/blender/blenkernel/BKE_screen.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_screen.h	2011-03-25 17:10:35 UTC (rev 35784)
+++ trunk/blender/source/blender/blenkernel/BKE_screen.h	2011-03-25 17:11:32 UTC (rev 35785)
@@ -112,7 +112,7 @@
 typedef struct ARegionType {
 	struct ARegionType *next, *prev;
 	
-	int			regionid;	/* unique identifier within this space */
+	int			regionid;	/* unique identifier within this space, defines RGN_TYPE_xxxx */
 	
 	/* add handlers, stuff you only do once or on area/region type/size changes */
 	void		(*init)(struct wmWindowManager *, struct ARegion *);
@@ -152,6 +152,8 @@
 	int			prefsizex, prefsizey;
 	/* default keymaps to add */
 	int			keymapflag;
+	/* return without drawing. lock is set by region definition, and copied to do_lock by render. can become flag */
+	short		do_lock, lock;
 } ARegionType;
 
 /* panel types */
@@ -231,6 +233,7 @@
 /* spacedata */
 void BKE_spacedata_freelist(ListBase *lb);
 void BKE_spacedata_copylist(ListBase *lb1, ListBase *lb2);
+void BKE_spacedata_draw_locks(int set);
 
 /* area/regions */
 struct ARegion *BKE_area_region_copy(struct SpaceType *st, struct ARegion *ar);

Modified: trunk/blender/source/blender/blenkernel/intern/screen.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/screen.c	2011-03-25 17:10:35 UTC (rev 35784)
+++ trunk/blender/source/blender/blenkernel/intern/screen.c	2011-03-25 17:11:32 UTC (rev 35785)
@@ -236,6 +236,26 @@
 	}
 }
 
+/* facility to set locks for drawing to survive (render) threads accessing drawing data */
+/* lock can become bitflag too */
+/* should be replaced in future by better local data handling for threads */
+void BKE_spacedata_draw_locks(int set)
+{
+	SpaceType *st;
+	
+	for(st= spacetypes.first; st; st= st->next) {
+		ARegionType *art;
+	
+		for(art= st->regiontypes.first; art; art= art->next) {
+			if(set) 
+				art->do_lock= art->lock;
+			else 
+				art->do_lock= 0;
+		}
+	}
+}
+
+
 /* not region itself */
 void BKE_area_region_free(SpaceType *st, ARegion *ar)
 {
@@ -395,3 +415,4 @@
 					BKE_screen_view3d_sync((View3D*)sl, scene);
 	}
 }
+

Modified: trunk/blender/source/blender/editors/render/render_internal.c
===================================================================
--- trunk/blender/source/blender/editors/render/render_internal.c	2011-03-25 17:10:35 UTC (rev 35784)
+++ trunk/blender/source/blender/editors/render/render_internal.c	2011-03-25 17:11:32 UTC (rev 35785)
@@ -53,6 +53,7 @@
 #include "BKE_multires.h"
 #include "BKE_report.h"
 #include "BKE_sequencer.h"
+#include "BKE_screen.h"
 
 #include "WM_api.h"
 #include "WM_types.h"
@@ -636,6 +637,13 @@
 	return 0;
 }
 
+/* runs in thread, no cursor setting here works. careful with notifiers too (malloc conflicts) */
+/* maybe need a way to get job send notifer? */
+static void render_drawlock(void *UNUSED(rjv), int lock)
+{
+	BKE_spacedata_draw_locks(lock);
+}
+
 /* catch esc */
 static int screen_render_modal(bContext *C, wmOperator *UNUSED(op), wmEvent *event)
 {
@@ -769,6 +777,7 @@
 	/* setup new render */
 	re= RE_NewRender(scene->id.name);
 	RE_test_break_cb(re, rj, render_breakjob);
+	RE_draw_lock_cb(re, rj, render_drawlock);
 	RE_display_draw_cb(re, rj, image_rect_update);
 	RE_stats_draw_cb(re, rj, image_renderinfo_cb);
 	RE_progress_cb(re, rj, render_progress_update);

Modified: trunk/blender/source/blender/editors/screen/area.c
===================================================================
--- trunk/blender/source/blender/editors/screen/area.c	2011-03-25 17:10:35 UTC (rev 35784)
+++ trunk/blender/source/blender/editors/screen/area.c	2011-03-25 17:11:32 UTC (rev 35785)
@@ -314,6 +314,10 @@
 	ARegionType *at= ar->type;
 	rcti winrct;
 	
+	/* see BKE_spacedata_draw_locks() */
+	if(at->do_lock)
+		return;
+	
 	/* checks other overlapping regions */
 	region_scissor_winrct(ar, &winrct);
 	

Modified: trunk/blender/source/blender/editors/space_view3d/space_view3d.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/space_view3d.c	2011-03-25 17:10:35 UTC (rev 35784)
+++ trunk/blender/source/blender/editors/space_view3d/space_view3d.c	2011-03-25 17:11:32 UTC (rev 35785)
@@ -1087,6 +1087,7 @@
 	art->duplicate= view3d_main_area_duplicate;
 	art->listener= view3d_main_area_listener;
 	art->cursor= view3d_main_area_cursor;
+	art->lock= 1;	/* can become flag, see BKE_spacedata_draw_locks */
 	BLI_addhead(&st->regiontypes, art);
 	
 	/* regions: listview/buttons */

Modified: trunk/blender/source/blender/render/extern/include/RE_pipeline.h
===================================================================
--- trunk/blender/source/blender/render/extern/include/RE_pipeline.h	2011-03-25 17:10:35 UTC (rev 35784)
+++ trunk/blender/source/blender/render/extern/include/RE_pipeline.h	2011-03-25 17:11:32 UTC (rev 35785)
@@ -239,6 +239,7 @@
 void RE_display_draw_cb	(struct Render *re, void *handle, void (*f)(void *handle, RenderResult *rr, volatile struct rcti *rect));
 void RE_stats_draw_cb	(struct Render *re, void *handle, void (*f)(void *handle, RenderStats *rs));
 void RE_progress_cb	(struct Render *re, void *handle, void (*f)(void *handle, float));
+void RE_draw_lock_cb		(struct Render *re, void *handle, void (*f)(void *handle, int));
 void RE_test_break_cb	(struct Render *re, void *handle, int (*f)(void *handle));
 void RE_error_cb		(struct Render *re, void *handle, void (*f)(void *handle, const char *str));
 

Modified: trunk/blender/source/blender/render/intern/include/render_types.h
===================================================================
--- trunk/blender/source/blender/render/intern/include/render_types.h	2011-03-25 17:10:35 UTC (rev 35784)
+++ trunk/blender/source/blender/render/intern/include/render_types.h	2011-03-25 17:11:32 UTC (rev 35785)
@@ -246,6 +246,8 @@
 	void (*progress)(void *handle, float i);
 	void *prh;
 	
+	void (*draw_lock)(void *handle, int i);
+	void *dlh;
 	int (*test_break)(void *handle);
 	void *tbh;
 	

Modified: trunk/blender/source/blender/render/intern/source/pipeline.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/pipeline.c	2011-03-25 17:10:35 UTC (rev 35784)
+++ trunk/blender/source/blender/render/intern/source/pipeline.c	2011-03-25 17:11:32 UTC (rev 35785)
@@ -46,18 +46,18 @@
 
 #include "MEM_guardedalloc.h"
 
-#include "BKE_utildefines.h"
+#include "BKE_animsys.h"	/* <------ should this be here?, needed for sequencer update */
 #include "BKE_global.h"
 #include "BKE_image.h"
 #include "BKE_main.h"
 #include "BKE_node.h"
 #include "BKE_object.h"
+#include "BKE_pointcache.h"
 #include "BKE_report.h"
 #include "BKE_scene.h"
+#include "BKE_sequencer.h"
+#include "BKE_utildefines.h"
 #include "BKE_writeavi.h"	/* <------ should be replaced once with generic movie module */
-#include "BKE_sequencer.h"
-#include "BKE_pointcache.h"
-#include "BKE_animsys.h"	/* <------ should this be here?, needed for sequencer update */
 
 #include "BLI_math.h"
 #include "BLI_blenlib.h"
@@ -1404,6 +1404,12 @@
 	re->prh= handle;
 }
 
+void RE_draw_lock_cb(Render *re, void *handle, void (*f)(void *handle, int i))
+{
+	re->draw_lock= f;
+	re->tbh= handle;
+}
+
 void RE_test_break_cb(Render *re, void *handle, int (*f)(void *handle))
 {
 	re->test_break= f;
@@ -1790,12 +1796,20 @@
 //	re->cfra= cfra;	/* <- unused! */
 	re->scene->r.subframe = re->mblur_offs + re->field_offs;
 	
+	/* lock drawing in UI during data phase */
+	if(re->draw_lock)
+		re->draw_lock(re->dlh, 1);
+	
 	/* make render verts/faces/halos/lamps */
 	if(render_scene_needs_vector(re))
 		RE_Database_FromScene_Vectors(re, re->main, re->scene, re->lay);
 	else
 	   RE_Database_FromScene(re, re->main, re->scene, re->lay, 1);
 	
+	/* clear UI drawing locks */
+	if(re->draw_lock)
+		re->draw_lock(re->dlh, 0);
+	
 	threaded_tile_processor(re);
 	
 	/* do left-over 3d post effects (flares) */

Modified: trunk/blender/source/blender/windowmanager/intern/wm_window.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_window.c	2011-03-25 17:10:35 UTC (rev 35784)
+++ trunk/blender/source/blender/windowmanager/intern/wm_window.c	2011-03-25 17:11:32 UTC (rev 35785)
@@ -238,6 +238,8 @@
 /* this is event from ghost, or exit-blender op */
 void wm_window_close(bContext *C, wmWindowManager *wm, wmWindow *win)
 {
+	bScreen *screen= win->screen;
+	
 	BLI_remlink(&wm->windows, win);
 	
 	wm_draw_window_clear(win);
@@ -246,14 +248,14 @@
 	WM_event_remove_handlers(C, &win->modalhandlers);
 	ED_screen_exit(C, win, win->screen); 
 	
-	/* if temp screen, delete it */
-	if(win->screen->temp) {
+	wm_window_free(C, wm, win);
+	
+	/* if temp screen, delete it after window free (it stops jobs that can access it) */
+	if(screen->temp) {
 		Main *bmain= CTX_data_main(C);
-		free_libblock(&bmain->screen, win->screen);
+		free_libblock(&bmain->screen, screen);
 	}
 	
-	wm_window_free(C, wm, win);
-	
 	/* check remaining windows */
 	if(wm->windows.first) {
 		for(win= wm->windows.first; win; win= win->next)




More information about the Bf-blender-cvs mailing list