diff options
author | Sergey Sharybin <sergey@blender.org> | 2021-05-12 11:01:14 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey@blender.org> | 2021-05-12 11:01:14 +0300 |
commit | 93b7c9595b56d65bb8acb47fc418b423d8af8fe2 (patch) | |
tree | d7960486221c11b55fe5c50c81fd7d58b3287a01 /intern | |
parent | 0d21228dce0079c592c9dd445fb112d59dd4c9e6 (diff) | |
parent | 7f3436363388af9e9fe5c8578dee8997c078bb16 (diff) |
Merge branch 'blender-v2.93-release'
Diffstat (limited to 'intern')
-rw-r--r-- | intern/cycles/kernel/closure/alloc.h | 44 |
1 files changed, 30 insertions, 14 deletions
diff --git a/intern/cycles/kernel/closure/alloc.h b/intern/cycles/kernel/closure/alloc.h index 341d1e16eb1..5b74a868e72 100644 --- a/intern/cycles/kernel/closure/alloc.h +++ b/intern/cycles/kernel/closure/alloc.h @@ -57,14 +57,22 @@ ccl_device ccl_addr_space void *closure_alloc_extra(ShaderData *sd, int size) ccl_device_inline ShaderClosure *bsdf_alloc(ShaderData *sd, int size, float3 weight) { - ShaderClosure *sc = closure_alloc(sd, size, CLOSURE_NONE_ID, weight); + const float sample_weight = fabsf(average(weight)); - if (sc == NULL) - return NULL; + /* Use comparison this way to help dealing with non-finite weight: if the average is not finite + * we will not allocate new closure. */ + if (sample_weight >= CLOSURE_WEIGHT_CUTOFF) { + ShaderClosure *sc = closure_alloc(sd, size, CLOSURE_NONE_ID, weight); + if (sc == NULL) { + return NULL; + } + + sc->sample_weight = sample_weight; - float sample_weight = fabsf(average(weight)); - sc->sample_weight = sample_weight; - return (sample_weight >= CLOSURE_WEIGHT_CUTOFF) ? sc : NULL; + return sc; + } + + return NULL; } #ifdef __OSL__ @@ -73,17 +81,25 @@ ccl_device_inline ShaderClosure *bsdf_alloc_osl(ShaderData *sd, float3 weight, void *data) { - ShaderClosure *sc = closure_alloc(sd, size, CLOSURE_NONE_ID, weight); + const float sample_weight = fabsf(average(weight)); - if (!sc) - return NULL; + /* Use comparison this way to help dealing with non-finite weight: if the average is not finite + * we will not allocate new closure. */ + if (sample_weight >= CLOSURE_WEIGHT_CUTOFF) { + ShaderClosure *sc = closure_alloc(sd, size, CLOSURE_NONE_ID, weight); + if (!sc) { + return NULL; + } - memcpy((void *)sc, data, size); + memcpy((void *)sc, data, size); - float sample_weight = fabsf(average(weight)); - sc->weight = weight; - sc->sample_weight = sample_weight; - return (sample_weight >= CLOSURE_WEIGHT_CUTOFF) ? sc : NULL; + sc->weight = weight; + sc->sample_weight = sample_weight; + + return sc; + } + + return NULL; } #endif |