[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [31317] trunk/blender/source/blender/ editors/render/render_internal.c: 2.5: rendering thread-safety experiment, when setting G.rt to 101, it will

Brecht Van Lommel brecht at blender.org
Fri Aug 13 16:29:57 CEST 2010


Revision: 31317
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=31317
Author:   blendix
Date:     2010-08-13 16:29:56 +0200 (Fri, 13 Aug 2010)

Log Message:
-----------
2.5: rendering thread-safety experiment, when setting G.rt to 101, it will
render from a Main database created from the undo buffer. That means extra
memory usage and processing needed, but gives no interference with other
data.

Still won't work entirely since there are a few things that don't get
flushed always (editmode, sculpt, ..) and some places that use globals.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/render/render_internal.c

Modified: trunk/blender/source/blender/editors/render/render_internal.c
===================================================================
--- trunk/blender/source/blender/editors/render/render_internal.c	2010-08-13 14:23:44 UTC (rev 31316)
+++ trunk/blender/source/blender/editors/render/render_internal.c	2010-08-13 14:29:56 UTC (rev 31317)
@@ -41,6 +41,7 @@
 #include "BKE_context.h"
 #include "BKE_global.h"
 #include "BKE_image.h"
+#include "BKE_library.h"
 #include "BKE_main.h"
 #include "BKE_multires.h"
 #include "BKE_report.h"
@@ -399,7 +400,7 @@
 	Render *re= RE_NewRender(scene->id.name);
 	Image *ima;
 	View3D *v3d= CTX_wm_view3d(C);
-	Main *mainp= G.main; //BKE_undo_get_main(&scene);
+	Main *mainp= CTX_data_main(C);
 	int lay= (v3d)? v3d->lay: scene->lay;
 
 	if(re==NULL) {
@@ -425,8 +426,6 @@
 	else
 		RE_BlenderFrame(re, mainp, scene, NULL, lay, scene->r.cfra);
 
-	//free_main(mainp);
-
 	// no redraw needed, we leave state as we entered it
 	ED_update_for_newframe(C, 1);
 
@@ -436,6 +435,7 @@
 }
 
 typedef struct RenderJob {
+	Main *main;
 	Scene *scene;
 	Render *re;
 	wmWindow *win;
@@ -560,22 +560,24 @@
 static void render_startjob(void *rjv, short *stop, short *do_update, float *progress)
 {
 	RenderJob *rj= rjv;
-	Main *mainp= G.main; //BKE_undo_get_main(&rj->scene);
 
 	rj->stop= stop;
 	rj->do_update= do_update;
 	rj->progress= progress;
 
 	if(rj->anim)
-		RE_BlenderAnim(rj->re, mainp, rj->scene, rj->lay, rj->scene->r.sfra, rj->scene->r.efra, rj->scene->r.frame_step, rj->reports);
+		RE_BlenderAnim(rj->re, rj->main, rj->scene, rj->lay, rj->scene->r.sfra, rj->scene->r.efra, rj->scene->r.frame_step, rj->reports);
 	else
-		RE_BlenderFrame(rj->re, mainp, rj->scene, rj->srl, rj->lay, rj->scene->r.cfra);
-
-	//free_main(mainp);
+		RE_BlenderFrame(rj->re, rj->main, rj->scene, rj->srl, rj->lay, rj->scene->r.cfra);
 }
 
 static void render_endjob(void *rjv)
 {
+	RenderJob *rj= rjv;
+
+	if(rj->main != G.main)
+		free_main(rj->main);
+
 	/* XXX render stability hack */
 	G.rendering = 0;
 	WM_main_add_notifier(NC_WINDOW, NULL);
@@ -614,6 +616,7 @@
 static int screen_render_invoke(bContext *C, wmOperator *op, wmEvent *event)
 {
 	/* new render clears all callbacks */
+	Main *mainp;
 	Scene *scene= CTX_data_scene(C);
 	SceneRenderLayer *srl=NULL;
 	bScreen *screen= CTX_wm_screen(C);
@@ -630,6 +633,14 @@
 	/* stop all running jobs, currently previews frustrate Render */
 	WM_jobs_stop_all(CTX_wm_manager(C));
 
+	/* get main */
+	if(G.rt == 101) {
+		/* thread-safety experiment, copy main from the undo buffer */
+		mainp= BKE_undo_get_main(&scene);
+	}
+	else
+		mainp= CTX_data_main(C);
+
 	/* cancel animation playback */
 	if (screen->animtimer)
 		ED_screen_animation_play(C, 0, 0);
@@ -665,7 +676,7 @@
 		RNA_string_get(op->ptr, "layer", rl_name);
 		RNA_string_get(op->ptr, "scene", scene_name);
 
-		scn = (Scene *)BLI_findstring(&CTX_data_main(C)->scene, scene_name, offsetof(ID, name) + 2);
+		scn = (Scene *)BLI_findstring(&mainp->scene, scene_name, offsetof(ID, name) + 2);
 		rl = (SceneRenderLayer *)BLI_findstring(&scene->r.layers, rl_name, offsetof(SceneRenderLayer, name));
 
 		if (scn && rl) {
@@ -676,6 +687,7 @@
 
 	/* job custom data */
 	rj= MEM_callocN(sizeof(RenderJob), "render job");
+	rj->main= mainp;
 	rj->scene= scene;
 	rj->win= CTX_wm_window(C);
 	rj->srl = srl;





More information about the Bf-blender-cvs mailing list