diff options
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenkernel/intern/blender.c | 2 | ||||
-rw-r--r-- | source/blender/blenlib/BLI_rand.h | 8 | ||||
-rw-r--r-- | source/blender/blenlib/intern/rand.c | 26 | ||||
-rw-r--r-- | source/blender/render/extern/include/RE_render_ext.h | 2 | ||||
-rw-r--r-- | source/blender/render/intern/source/render_texture.c | 31 | ||||
-rw-r--r-- | source/creator/creator.c | 3 |
6 files changed, 64 insertions, 8 deletions
diff --git a/source/blender/blenkernel/intern/blender.c b/source/blender/blenkernel/intern/blender.c index fff8265a158..adfe43cb2a3 100644 --- a/source/blender/blenkernel/intern/blender.c +++ b/source/blender/blenkernel/intern/blender.c @@ -80,6 +80,7 @@ #include "BKE_sound.h" #include "RE_pipeline.h" +#include "RE_render_ext.h" #include "BLF_api.h" @@ -119,6 +120,7 @@ void free_blender(void) DAG_exit(); BKE_brush_system_exit(); + RE_exit_texture_rng(); BLI_callback_global_finalize(); diff --git a/source/blender/blenlib/BLI_rand.h b/source/blender/blenlib/BLI_rand.h index c86b3aea503..879af446469 100644 --- a/source/blender/blenlib/BLI_rand.h +++ b/source/blender/blenlib/BLI_rand.h @@ -40,6 +40,9 @@ struct RNG; typedef struct RNG RNG; +struct RNG_THREAD_ARRAY; +typedef struct RNG_THREAD_ARRAY RNG_THREAD_ARRAY; + struct RNG *BLI_rng_new(unsigned int seed); struct RNG *BLI_rng_new_srandom(unsigned int seed); void BLI_rng_free(struct RNG *rng) ATTR_NONNULL(1); @@ -89,4 +92,9 @@ int BLI_thread_rand(int thread) ATTR_WARN_UNUSED_RESULT; /** Allows up to BLENDER_MAX_THREADS threads to address */ float BLI_thread_frand(int thread) ATTR_WARN_UNUSED_RESULT; +/** array versions for thread safe random generation */ +RNG_THREAD_ARRAY *BLI_rng_threaded_new(void); +void BLI_rng_threaded_free(struct RNG_THREAD_ARRAY *rngarr) ATTR_NONNULL(1); +int BLI_rng_thread_rand(RNG_THREAD_ARRAY *rngarr, int thread) ATTR_WARN_UNUSED_RESULT; + #endif /* __BLI_RAND_H__ */ diff --git a/source/blender/blenlib/intern/rand.c b/source/blender/blenlib/intern/rand.c index 3dff0b31091..70780f9d47d 100644 --- a/source/blender/blenlib/intern/rand.c +++ b/source/blender/blenlib/intern/rand.c @@ -245,3 +245,29 @@ float BLI_thread_frand(int thread) return BLI_rng_get_float(&rng_tab[thread]); } +struct RNG_THREAD_ARRAY { + RNG rng_tab[BLENDER_MAX_THREADS]; +}; + +RNG_THREAD_ARRAY *BLI_rng_threaded_new(void) +{ + unsigned int i; + RNG_THREAD_ARRAY *rngarr = MEM_mallocN(sizeof(RNG_THREAD_ARRAY), "random_array"); + + for (i = 0; i < BLENDER_MAX_THREADS; i++) { + BLI_rng_srandom(&rngarr->rng_tab[i], (unsigned int)(rngarr->rng_tab[i].X * 257)); + } + + return rngarr; +} + +void BLI_rng_threaded_free(struct RNG_THREAD_ARRAY *rngarr) +{ + MEM_freeN(rngarr); +} + +int BLI_rng_thread_rand(RNG_THREAD_ARRAY *rngarr, int thread) +{ + return BLI_rng_get_int(&rngarr->rng_tab[thread]); +} + diff --git a/source/blender/render/extern/include/RE_render_ext.h b/source/blender/render/extern/include/RE_render_ext.h index eb861d440d8..6d083ec785d 100644 --- a/source/blender/render/extern/include/RE_render_ext.h +++ b/source/blender/render/extern/include/RE_render_ext.h @@ -61,5 +61,7 @@ void RE_free_sample_material(struct Material *mat); void RE_sample_material_color(struct Material *mat, float color[3], float *alpha, const float volume_co[3], const float surface_co[3], int face_index, short hit_quad, struct DerivedMesh *orcoDm, struct Object *ob); +void RE_init_texture_rng(void); +void RE_exit_texture_rng(void); #endif /* __RE_RENDER_EXT_H__ */ diff --git a/source/blender/render/intern/source/render_texture.c b/source/blender/render/intern/source/render_texture.c index 0e61c3e796a..14e84c4fca9 100644 --- a/source/blender/render/intern/source/render_texture.c +++ b/source/blender/render/intern/source/render_texture.c @@ -85,8 +85,19 @@ extern struct Render R; /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ +static RNG_THREAD_ARRAY *random_tex_array; +void RE_init_texture_rng() +{ + random_tex_array = BLI_rng_threaded_new(); +} + +void RE_exit_texture_rng() +{ + BLI_rng_threaded_free(random_tex_array); +} + static void init_render_texture(Render *re, Tex *tex) { @@ -709,19 +720,23 @@ static float voronoiTex(Tex *tex, const float texvec[3], TexResult *texres) /* ------------------------------------------------------------------------- */ -static int texnoise(Tex *tex, TexResult *texres) +static int texnoise(Tex *tex, TexResult *texres, int thread) { float div=3.0; - int val, ran, loop; + int val, ran, loop, shift = 30; - ran= BLI_rand(); - val= (ran & 3); + ran= BLI_rng_thread_rand(random_tex_array, thread); loop= tex->noisedepth; + + /* start from top bits since they have more variance */ + val= ((ran >> shift) & 3); + shift -= 2; + while (loop--) { - ran= (ran>>2); - val*= (ran & 3); - div*= 3.0f; + val += ((ran >> shift) & 3); + div += 3.0f; + shift -= 2; } texres->tin= ((float)val)/div; @@ -1127,7 +1142,7 @@ static int multitex(Tex *tex, float texvec[3], float dxt[3], float dyt[3], int o retval = stucci(tex, texvec, texres); break; case TEX_NOISE: - retval = texnoise(tex, texres); + retval = texnoise(tex, texres, thread); break; case TEX_IMAGE: if (osatex) retval = imagewraposa(tex, tex->ima, NULL, texvec, dxt, dyt, texres, pool); diff --git a/source/creator/creator.c b/source/creator/creator.c index 12ae5c502e4..d779095c1ee 100644 --- a/source/creator/creator.c +++ b/source/creator/creator.c @@ -107,6 +107,7 @@ #include "RE_engine.h" #include "RE_pipeline.h" +#include "RE_render_ext.h" #include "ED_datafiles.h" #include "ED_util.h" @@ -1627,6 +1628,8 @@ int main( DAG_init(); BKE_brush_system_init(); + RE_init_texture_rng(); + BLI_callback_global_init(); |