[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [12933] trunk/blender/source/blender/ render/intern:

Brecht Van Lommel brechtvanlommel at pandora.be
Mon Dec 17 22:04:25 CET 2007


Revision: 12933
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=12933
Author:   blendix
Date:     2007-12-17 22:04:22 +0100 (Mon, 17 Dec 2007)

Log Message:
-----------

Threaded Shadowbuffers Creation
===============================

- One shadowbuffer per thread.
- Added more break tests in shadow buffer code.
- Removed R.clipcrop global, solution is not nice yet, but at
  least threadsafe.
- Fixed bug in strand render shadow buffer code.

Modified Paths:
--------------
    trunk/blender/source/blender/render/intern/include/render_types.h
    trunk/blender/source/blender/render/intern/include/shadbuf.h
    trunk/blender/source/blender/render/intern/include/zbuf.h
    trunk/blender/source/blender/render/intern/source/convertblender.c
    trunk/blender/source/blender/render/intern/source/pipeline.c
    trunk/blender/source/blender/render/intern/source/rendercore.c
    trunk/blender/source/blender/render/intern/source/shadbuf.c
    trunk/blender/source/blender/render/intern/source/strand.c
    trunk/blender/source/blender/render/intern/source/zbuf.c

Modified: trunk/blender/source/blender/render/intern/include/render_types.h
===================================================================
--- trunk/blender/source/blender/render/intern/include/render_types.h	2007-12-17 20:21:06 UTC (rev 12932)
+++ trunk/blender/source/blender/render/intern/include/render_types.h	2007-12-17 21:04:22 UTC (rev 12933)
@@ -446,6 +446,10 @@
 	ObjectInstanceRen *obi_last[BLENDER_MAX_THREADS];
 	
 	struct MTex *mtex[MAX_MTEX];
+
+	/* threading */
+	int thread_assigned;
+	int thread_ready;
 } LampRen;
 
 /* **************** defines ********************* */

Modified: trunk/blender/source/blender/render/intern/include/shadbuf.h
===================================================================
--- trunk/blender/source/blender/render/intern/include/shadbuf.h	2007-12-17 20:21:06 UTC (rev 12932)
+++ trunk/blender/source/blender/render/intern/include/shadbuf.h	2007-12-17 21:04:22 UTC (rev 12933)
@@ -46,6 +46,8 @@
 void makeshadowbuf(struct Render *re, LampRen *lar);
 void freeshadowbuf(struct LampRen *lar);
 
+void threaded_makeshadowbufs(struct Render *re);
+
 /**
  * Determines the shadow factor for a face and lamp. There is some
  * communication with global variables here.

Modified: trunk/blender/source/blender/render/intern/include/zbuf.h
===================================================================
--- trunk/blender/source/blender/render/intern/include/zbuf.h	2007-12-17 20:21:06 UTC (rev 12932)
+++ trunk/blender/source/blender/render/intern/include/zbuf.h	2007-12-17 21:04:22 UTC (rev 12933)
@@ -91,6 +91,8 @@
 	float shad_alpha;						/* copy from material, used by irregular shadbuf */
 	int mask, apsmcounter;					/* in use by apixbuf */
 
+	float clipcrop;							/* for shadow, was in R global before */
+
 	void *sss_handle;						/* used by sss */
 	void (*sss_func)(void *, int, int, int, int, int);
 	
@@ -108,7 +110,7 @@
 
 /* exported to edge render... */
 void zbufclip(struct ZSpan *zspan, int obi, int zvlnr, float *f1, float *f2, float *f3, int c1, int c2, int c3);
-void zbuf_alloc_span(struct ZSpan *zspan, int rectx, int recty);
+void zbuf_alloc_span(struct ZSpan *zspan, int rectx, int recty, float clipcrop);
 void zbufclipwire(struct ZSpan *zspan, int obi, int zvlnr, int ec, float *ho1, float *ho2, float *ho3, float *ho4, int c1, int c2, int c3, int c4);
 
 /* exported to shadeinput.c */

Modified: trunk/blender/source/blender/render/intern/source/convertblender.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/convertblender.c	2007-12-17 20:21:06 UTC (rev 12932)
+++ trunk/blender/source/blender/render/intern/source/convertblender.c	2007-12-17 21:04:22 UTC (rev 12933)
@@ -4209,7 +4209,6 @@
 	database_init_objects(re, lay, 0, 0, 0, 0);
 
 	if(!re->test_break()) {
-		LampRen *lar;
 		int tothalo;
 
 		set_material_lightgroups(re);
@@ -4237,13 +4236,7 @@
 		re->stats_draw(&re->i);
 
 		/* SHADOW BUFFER */
-		for(lar=re->lampren.first; lar; lar= lar->next) {
-			if(re->test_break()) break;
-			if(lar->shb) {
-				/* if type is irregular, this only sets the perspective matrix and autoclips */
-				makeshadowbuf(re, lar);
-			}
-		}
+		threaded_makeshadowbufs(re);
 		
 		/* yafray: 'direct' radiosity, environment maps and raytree init not needed for yafray render */
 		/* although radio mode could be useful at some point, later */
@@ -4767,22 +4760,10 @@
 
 	set_material_lightgroups(re);
 	
-	if(type!=RE_BAKE_LIGHT) {
-		if(re->r.mode & R_SHADOW) {
-			LampRen *lar;
-			
-			/* SHADOW BUFFER */
-			for(lar=re->lampren.first; lar; lar= lar->next) {
-				
-				if(re->test_break()) break;
-				if(lar->shb) {
-					/* if type is irregular, this only sets the perspective matrix and autoclips */
-					/* but, that's not supported for bake... */
-					makeshadowbuf(re, lar);
-				}
-			}
-		}
-	}
+	/* SHADOW BUFFER */
+	if(type!=RE_BAKE_LIGHT)
+		if(re->r.mode & R_SHADOW)
+			threaded_makeshadowbufs(re);
 
 	/* raytree */
 	if(!re->test_break())

Modified: trunk/blender/source/blender/render/intern/source/pipeline.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/pipeline.c	2007-12-17 20:21:06 UTC (rev 12932)
+++ trunk/blender/source/blender/render/intern/source/pipeline.c	2007-12-17 21:04:22 UTC (rev 12933)
@@ -1251,7 +1251,6 @@
 	}
 	
 	freeparts(re);
-	R.strandbuckets= NULL;
 }
 
 /* calculus for how much 1 pixel rendered should rotate the 3d geometry */
@@ -1485,7 +1484,6 @@
 	BLI_end_threads(&threads);
 	freeparts(re);
 	re->viewplane= viewplane; /* restore viewplane, modified by pano render */
-	R.strandbuckets= NULL;
 }
 
 /* currently only called by preview renders and envmap */

Modified: trunk/blender/source/blender/render/intern/source/rendercore.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/rendercore.c	2007-12-17 20:21:06 UTC (rev 12932)
+++ trunk/blender/source/blender/render/intern/source/rendercore.c	2007-12-17 21:04:22 UTC (rev 12933)
@@ -2090,7 +2090,7 @@
 		bs->ibuf= BKE_image_get_ibuf(ima, NULL);
 		/* note, these calls only free/fill contents of zspan struct, not zspan itself */
 		zbuf_free_span(bs->zspan);
-		zbuf_alloc_span(bs->zspan, bs->ibuf->x, bs->ibuf->y);
+		zbuf_alloc_span(bs->zspan, bs->ibuf->x, bs->ibuf->y, R.clipcrop);
 	}				
 	
 	bs->rectx= bs->ibuf->x;

Modified: trunk/blender/source/blender/render/intern/source/shadbuf.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/shadbuf.c	2007-12-17 20:21:06 UTC (rev 12932)
+++ trunk/blender/source/blender/render/intern/source/shadbuf.c	2007-12-17 21:04:22 UTC (rev 12933)
@@ -42,6 +42,8 @@
 #include "BLI_memarena.h"
 #include "BLI_rand.h"
 
+#include "PIL_time.h"
+
 #include "renderpipeline.h"
 #include "render_types.h"
 #include "renderdatabase.h"
@@ -379,9 +381,6 @@
 	float wsize, *jitbuf, twozero[2]= {0.0f, 0.0f}, angle, temp;
 	int *rectz, samples;
 	
-	/* XXXX EVIL! this global is used in clippyra(), zbuf.c */
-	R.clipcrop= 1.0f;
-	
 	if(lar->bufflag & (LA_SHADBUF_AUTO_START|LA_SHADBUF_AUTO_END))
 		shadowbuf_autoclip(re, lar);
 	
@@ -402,8 +401,10 @@
 
 	if(ELEM(lar->buftype, LA_SHADBUF_REGULAR, LA_SHADBUF_HALFWAY)) {
 		/* jitter, weights - not threadsafe! */
+		BLI_lock_thread(LOCK_CUSTOM1);
 		shb->jit= give_jitter_tab(shb->samp);
 		make_jitter_weight_tab(shb, lar->filtertype);
+		BLI_unlock_thread(LOCK_CUSTOM1);
 		
 		shb->totbuf= lar->buffers;
 		if(shb->totbuf==4) jitbuf= give_jitter_tab(2);
@@ -417,6 +418,9 @@
 			zbuffer_shadow(re, shb->persmat, lar, rectz, shb->size, jitbuf[2*samples], jitbuf[2*samples+1]);
 			/* create Z tiles (for compression): this system is 24 bits!!! */
 			compress_shadowbuf(shb, rectz, lar->mode & LA_SQUARE);
+
+			if(re->test_break())
+				break;
 		}
 		
 		MEM_freeN(rectz);
@@ -425,6 +429,103 @@
 	}
 }
 
+static void *do_shadow_thread(void *re_v)
+{
+	Render *re= (Render*)re_v;
+	LampRen *lar;
+
+	do {
+		BLI_lock_thread(LOCK_CUSTOM1);
+		for(lar=re->lampren.first; lar; lar=lar->next) {
+			if(lar->shb && !lar->thread_assigned) {
+				lar->thread_assigned= 1;
+				break;
+			}
+		}
+		BLI_unlock_thread(LOCK_CUSTOM1);
+
+		/* if type is irregular, this only sets the perspective matrix and autoclips */
+		if(lar) {
+			makeshadowbuf(re, lar);
+			BLI_lock_thread(LOCK_CUSTOM1);
+			lar->thread_ready= 1;
+			BLI_unlock_thread(LOCK_CUSTOM1);
+		}
+	} while(lar && !re->test_break());
+
+	return NULL;
+}
+
+static volatile int g_break= 0;
+static int thread_break(void)
+{
+	return g_break;
+}
+
+void threaded_makeshadowbufs(Render *re)
+{
+	ListBase threads;
+	LampRen *lar;
+	int a, totthread= 0;
+	int (*test_break)(void);
+
+	/* count number of threads to use */
+	if(G.rendering) {
+		for(lar=re->lampren.first; lar; lar= lar->next)
+			if(lar->shb)
+				totthread++;
+		
+		totthread= MIN2(totthread, re->r.threads);
+	}
+	else
+		totthread= 1; /* preview render */
+
+	if(totthread <= 1) {
+		for(lar=re->lampren.first; lar; lar= lar->next) {
+			if(re->test_break()) break;
+			if(lar->shb) {
+				/* if type is irregular, this only sets the perspective matrix and autoclips */
+				makeshadowbuf(re, lar);
+			}
+		}
+	}
+	else {
+		/* swap test break function */
+		test_break= re->test_break;
+		re->test_break= thread_break;
+
+		for(lar=re->lampren.first; lar; lar= lar->next) {
+			lar->thread_assigned= 0;
+			lar->thread_ready= 0;
+		}
+
+		BLI_init_threads(&threads, do_shadow_thread, totthread);
+		
+		for(a=0; a<totthread; a++)
+			BLI_insert_thread(&threads, re);
+
+		/* keep rendering as long as there are shadow buffers not ready */
+		do {
+			if((g_break=test_break()))
+				break;
+
+			PIL_sleep_ms(50);
+
+			BLI_lock_thread(LOCK_CUSTOM1);
+			for(lar=re->lampren.first; lar; lar= lar->next)
+				if(lar->shb && !lar->thread_ready)
+					break;
+			BLI_unlock_thread(LOCK_CUSTOM1);
+		} while(lar);
+	
+		BLI_end_threads(&threads);
+
+		/* unset threadsafety */
+		re->test_break= test_break;
+		g_break= 0;
+	}
+}
+
 void freeshadowbuf(LampRen *lar)
 {
 	if(lar->shb) {
@@ -1413,7 +1514,7 @@
 	if(lar->mode & LA_LAYER) lay= lar->lay;
 	
 	/* (ab)use zspan, since we use zbuffer clipping code */
-	zbuf_alloc_span(&zspan, size, size);
+	zbuf_alloc_span(&zspan, size, size, re->clipcrop);
 	
 	zspan.zmulx=  ((float)size)/2.0f;
 	zspan.zmuly=  ((float)size)/2.0f;

Modified: trunk/blender/source/blender/render/intern/source/strand.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/strand.c	2007-12-17 20:21:06 UTC (rev 12932)
+++ trunk/blender/source/blender/render/intern/source/strand.c	2007-12-17 21:04:22 UTC (rev 12933)
@@ -965,7 +965,7 @@
 	spart.ssamp2.tot= 1;
 	spart.ssamp.tot= 1;
 
-	zbuf_alloc_span(&zspan, pa->rectx, pa->recty);
+	zbuf_alloc_span(&zspan, pa->rectx, pa->recty, re->clipcrop);
 
 	/* needed for transform from hoco to zbuffer co */
 	zspan.zmulx= ((float)re->winx)/2.0;

Modified: trunk/blender/source/blender/render/intern/source/zbuf.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/zbuf.c	2007-12-17 20:21:06 UTC (rev 12932)
+++ trunk/blender/source/blender/render/intern/source/zbuf.c	2007-12-17 21:04:22 UTC (rev 12933)
@@ -84,7 +84,7 @@
 /* ****************** Spans ******************************* */
 

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list