From e0bc6357436da194a5d7a3bff75a907d377f6432 Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Thu, 2 Jun 2005 09:53:53 +0000 Subject: Bugfix #2648 Thread render with using Area lights was not fully thread safe yet. I thought I had a smart method to trick threads, but apparently it can best (and only) be done with Mutexes... --- source/blender/render/intern/source/initrender.c | 7 ++-- source/blender/render/intern/source/ray.c | 41 +++++++++++++++--------- 2 files changed, 31 insertions(+), 17 deletions(-) (limited to 'source') diff --git a/source/blender/render/intern/source/initrender.c b/source/blender/render/intern/source/initrender.c index fba9593fbbf..23fbffa8861 100644 --- a/source/blender/render/intern/source/initrender.c +++ b/source/blender/render/intern/source/initrender.c @@ -872,7 +872,7 @@ static void yafrayRender(void) /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ // exported to other files, belongs in include... later -SDL_mutex *render_abuf_lock=NULL, *load_ibuf_lock=NULL; +SDL_mutex *render_abuf_lock=NULL, *load_ibuf_lock=NULL, *make_table_lock= NULL; static void renderloop_setblending(void) @@ -916,7 +916,8 @@ static void mainRenderLoop(void) /* here the PART and FIELD loops */ /* create mutexes for threaded render */ render_abuf_lock = SDL_CreateMutex(); load_ibuf_lock = SDL_CreateMutex(); - + make_table_lock = SDL_CreateMutex(); + if(R.rectz) MEM_freeN(R.rectz); R.rectz = NULL; if(R.rectftot) MEM_freeN(R.rectftot); @@ -1170,8 +1171,10 @@ static void mainRenderLoop(void) /* here the PART and FIELD loops */ /* mutexes free */ SDL_DestroyMutex(load_ibuf_lock); SDL_DestroyMutex(render_abuf_lock); + SDL_DestroyMutex(make_table_lock); load_ibuf_lock= NULL; render_abuf_lock= NULL; + make_table_lock= NULL; } void render() { diff --git a/source/blender/render/intern/source/ray.c b/source/blender/render/intern/source/ray.c index 8a856883752..6aa157e8983 100644 --- a/source/blender/render/intern/source/ray.c +++ b/source/blender/render/intern/source/ray.c @@ -51,6 +51,8 @@ #include "jitter.h" #include "texture.h" +#include "SDL_thread.h" + #define DDA_SHADOW 0 #define DDA_MIRROR 1 #define DDA_SHADOW_TRA 2 @@ -1636,25 +1638,34 @@ static float *jitter_plane(LampRen *lar, int xs, int ys) tot= lar->ray_totsamp; if(lar->jitter==NULL) { - lar->jitter= (float *)4; // mislead thread quickly (tsk!) - fp=lar->jitter= MEM_mallocN(4*tot*2*sizeof(float), "lamp jitter tab"); - - /* fill table with random locations, area_size large */ - for(x=0; xarea_size; - fp[1]= (BLI_frand()-0.5)*lar->area_sizey; - } + extern SDL_mutex *make_table_lock; // initrender.c + if(make_table_lock) SDL_mutexP(make_table_lock); - while(iter--) { - fp= lar->jitter; - for(x=tot; x>0; x--, fp+=2) { - DP_energy(lar->jitter, fp, tot, lar->area_size, lar->area_sizey); + /* check again, since other thread could have entered */ + if(lar->jitter==NULL) { + + + fp=lar->jitter= MEM_mallocN(4*tot*2*sizeof(float), "lamp jitter tab"); + + /* fill table with random locations, area_size large */ + for(x=0; xarea_size; + fp[1]= (BLI_frand()-0.5)*lar->area_sizey; } + + while(iter--) { + fp= lar->jitter; + for(x=tot; x>0; x--, fp+=2) { + DP_energy(lar->jitter, fp, tot, lar->area_size, lar->area_sizey); + } + } + + jitter_plane_offset(lar->jitter, lar->jitter+2*tot, tot, lar->area_size, lar->area_sizey, 0.5, 0.0); + jitter_plane_offset(lar->jitter, lar->jitter+4*tot, tot, lar->area_size, lar->area_sizey, 0.5, 0.5); + jitter_plane_offset(lar->jitter, lar->jitter+6*tot, tot, lar->area_size, lar->area_sizey, 0.0, 0.5); } - jitter_plane_offset(lar->jitter, lar->jitter+2*tot, tot, lar->area_size, lar->area_sizey, 0.5, 0.0); - jitter_plane_offset(lar->jitter, lar->jitter+4*tot, tot, lar->area_size, lar->area_sizey, 0.5, 0.5); - jitter_plane_offset(lar->jitter, lar->jitter+6*tot, tot, lar->area_size, lar->area_sizey, 0.0, 0.5); + if(make_table_lock) SDL_mutexV(make_table_lock); } if(lar->ray_samp_type & LA_SAMP_JITTER) { -- cgit v1.2.3