[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