[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [60547] trunk/blender/source: Fix #36948: blender internal viewport render crashes holding shift+Z pressed

Brecht Van Lommel brechtvanlommel at pandora.be
Fri Oct 4 14:30:00 CEST 2013


Revision: 60547
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=60547
Author:   blendix
Date:     2013-10-04 12:30:00 +0000 (Fri, 04 Oct 2013)
Log Message:
-----------
Fix #36948: blender internal viewport render crashes holding shift+Z pressed
to quickly toggle it on/off.

Problem is accessing freed data, now the job is ended immediately. Fix based
on patch from Sergey and investigation from Bastien.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/include/ED_render.h
    trunk/blender/source/blender/editors/include/ED_view3d.h
    trunk/blender/source/blender/editors/space_view3d/space_view3d.c
    trunk/blender/source/blender/editors/space_view3d/view3d_view.c
    trunk/blender/source/blender/makesrna/intern/rna_space.c
    trunk/blender/source/blenderplayer/bad_level_call_stubs/stubs.c

Modified: trunk/blender/source/blender/editors/include/ED_render.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_render.h	2013-10-04 12:22:54 UTC (rev 60546)
+++ trunk/blender/source/blender/editors/include/ED_render.h	2013-10-04 12:30:00 UTC (rev 60547)
@@ -40,6 +40,7 @@
 struct ScrArea;
 struct RegionView3D;
 struct RenderEngine;
+struct View3D;
 
 /* render_ops.c */
 
@@ -51,6 +52,7 @@
 void ED_render_engine_changed(struct Main *bmain);
 void ED_render_engine_area_exit(struct ScrArea *sa);
 void ED_render_scene_update(struct Main *bmain, struct Scene *scene, int updated);
+void ED_render_view3d_shade_update(struct Main *bmain, struct View3D *v3d, struct ScrArea *sa);
 
 void ED_viewport_render_kill_jobs(const struct bContext *C, bool free_database);
 

Modified: trunk/blender/source/blender/editors/include/ED_view3d.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_view3d.h	2013-10-04 12:22:54 UTC (rev 60546)
+++ trunk/blender/source/blender/editors/include/ED_view3d.h	2013-10-04 12:30:00 UTC (rev 60547)
@@ -336,4 +336,7 @@
 void ED_view3d_operator_properties_viewmat_get(struct wmOperator *op, int *winx, int *winy, float persmat[4][4]);
 #endif
 
+/* render */
+void ED_view3d_shade_update(struct Main *bmain, struct View3D *v3d, struct ScrArea *sa);
+
 #endif /* __ED_VIEW3D_H__ */

Modified: trunk/blender/source/blender/editors/space_view3d/space_view3d.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/space_view3d.c	2013-10-04 12:22:54 UTC (rev 60546)
+++ trunk/blender/source/blender/editors/space_view3d/space_view3d.c	2013-10-04 12:30:00 UTC (rev 60547)
@@ -44,6 +44,7 @@
 
 #include "BKE_context.h"
 #include "BKE_icons.h"
+#include "BKE_main.h"
 #include "BKE_object.h"
 #include "BKE_screen.h"
 
@@ -258,6 +259,25 @@
 }
 #endif
 
+void ED_view3d_shade_update(Main *bmain, View3D *v3d, ScrArea *sa)
+{
+	wmWindowManager *wm = bmain->wm.first;
+
+	if (v3d->drawtype != OB_RENDER) {
+		ARegion *ar;
+
+		for (ar = sa->regionbase.first; ar; ar = ar->next) {
+			RegionView3D *rv3d = ar->regiondata;
+
+			if (rv3d && rv3d->render_engine) {
+				WM_jobs_kill_type(wm, ar, WM_JOB_TYPE_RENDER_PREVIEW);
+				RE_engine_free(rv3d->render_engine);
+				rv3d->render_engine = NULL;
+			}
+		}
+	}
+}
+
 /* ******************** default callbacks for view3d space ***************** */
 
 static SpaceLink *view3d_new(const bContext *C)

Modified: trunk/blender/source/blender/editors/space_view3d/view3d_view.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/view3d_view.c	2013-10-04 12:22:54 UTC (rev 60546)
+++ trunk/blender/source/blender/editors/space_view3d/view3d_view.c	2013-10-04 12:30:00 UTC (rev 60547)
@@ -1180,7 +1180,7 @@
 	return ok;
 }
 
-static void restore_localviewdata(ScrArea *sa, int free)
+static void restore_localviewdata(Main *bmain, ScrArea *sa, int free)
 {
 	ARegion *ar;
 	View3D *v3d = sa->spacedata.first;
@@ -1217,12 +1217,7 @@
 				}
 			}
 
-			if (v3d->drawtype != OB_RENDER) {
-				if (rv3d->render_engine) {
-					RE_engine_free(rv3d->render_engine);
-					rv3d->render_engine = NULL;
-				}
-			}
+			ED_view3d_shade_update(bmain, v3d, sa);
 		}
 	}
 }
@@ -1237,7 +1232,7 @@
 		
 		locallay = v3d->lay & 0xFF000000;
 		
-		restore_localviewdata(sa, 1); /* 1 = free */
+		restore_localviewdata(bmain, sa, 1); /* 1 = free */
 
 		/* for when in other window the layers have changed */
 		if (v3d->scenelock) v3d->lay = scene->lay;

Modified: trunk/blender/source/blender/makesrna/intern/rna_space.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_space.c	2013-10-04 12:22:54 UTC (rev 60546)
+++ trunk/blender/source/blender/makesrna/intern/rna_space.c	2013-10-04 12:30:00 UTC (rev 60547)
@@ -406,23 +406,12 @@
 	DAG_on_visible_update(bmain, FALSE);
 }
 
-static void rna_SpaceView3D_viewport_shade_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
+static void rna_SpaceView3D_viewport_shade_update(Main *bmain, Scene *UNUSED(scene), PointerRNA *ptr)
 {
 	View3D *v3d = (View3D *)(ptr->data);
 	ScrArea *sa = rna_area_from_space(ptr);
 
-	if (v3d->drawtype != OB_RENDER) {
-		ARegion *ar;
-
-		for (ar = sa->regionbase.first; ar; ar = ar->next) {
-			RegionView3D *rv3d = ar->regiondata;
-
-			if (rv3d && rv3d->render_engine) {
-				RE_engine_free(rv3d->render_engine);
-				rv3d->render_engine = NULL;
-			}
-		}
-	}
+	ED_view3d_shade_update(bmain, v3d, sa);
 }
 
 static void rna_SpaceView3D_matcap_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)

Modified: trunk/blender/source/blenderplayer/bad_level_call_stubs/stubs.c
===================================================================
--- trunk/blender/source/blenderplayer/bad_level_call_stubs/stubs.c	2013-10-04 12:22:54 UTC (rev 60546)
+++ trunk/blender/source/blenderplayer/bad_level_call_stubs/stubs.c	2013-10-04 12:30:00 UTC (rev 60547)
@@ -335,6 +335,7 @@
 void ED_view3D_background_image_clear(struct View3D *v3d) {STUB_ASSERT(0);}
 void ED_view3d_update_viewmat(struct Scene *scene, struct View3D *v3d, struct ARegion *ar, float viewmat[4][4], float winmat[4][4]) {STUB_ASSERT(0);}
 float ED_view3d_grid_scale(struct Scene *scene, struct View3D *v3d, const char **grid_unit) {STUB_ASSERT(0); return 0.0f;}
+void ED_view3d_shade_update(struct Main *bmain, struct View3D *v3d, struct ScrArea *sa) {STUB_ASSERT(0);}
 void view3d_apply_mat4(float mat[4][4], float *ofs, float *quat, float *dist) {STUB_ASSERT(0);}
 int text_file_modified(struct Text *text) {STUB_ASSERT(0); return 0;}
 void ED_node_shader_default(struct bContext *C, struct ID *id) {STUB_ASSERT(0);}




More information about the Bf-blender-cvs mailing list