Cycles: Don't allocate Extra if BSDF allocation failed
authorSergey Sharybin <sergey.vfx@gmail.com>
Wed, 12 Sep 2018 10:21:04 +0000 (12:21 +0200)
committerSergey Sharybin <sergey.vfx@gmail.com>
Wed, 12 Sep 2018 10:28:55 +0000 (12:28 +0200)
Failed as in did not allocate due to possibly weight cutoff.
Tryign to allocated Extra storage for closure in such situation
will consfuse Cycles and cause crashes later one due to obscure
values in ShaderData.

intern/cycles/kernel/svm/svm_closure.h

index df879de19500767a243734dd37edad0d429c8b21..64bf8244999d6eba7c75e1b85d9cdb500f7ed398 100644 (file)
@@ -258,7 +258,9 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float *
                                        float3 spec_weight = weight * specular_weight;
 
                                        MicrofacetBsdf *bsdf = (MicrofacetBsdf*)bsdf_alloc(sd, sizeof(MicrofacetBsdf), spec_weight);
-                                       MicrofacetExtra *extra = (MicrofacetExtra*)closure_alloc_extra(sd, sizeof(MicrofacetExtra));
+                                       MicrofacetExtra *extra = (bsdf != NULL)
+                                               ? (MicrofacetExtra*)closure_alloc_extra(sd, sizeof(MicrofacetExtra))
+                                               : NULL;
 
                                        if (bsdf && extra) {
                                                bsdf->N = N;
@@ -308,7 +310,9 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float *
 #endif
                                                {
                                                        MicrofacetBsdf *bsdf = (MicrofacetBsdf*)bsdf_alloc(sd, sizeof(MicrofacetBsdf), glass_weight*fresnel);
-                                                       MicrofacetExtra *extra = (MicrofacetExtra*)closure_alloc_extra(sd, sizeof(MicrofacetExtra));
+                                                       MicrofacetExtra *extra = (bsdf != NULL)
+                                                               ? (MicrofacetExtra*)closure_alloc_extra(sd, sizeof(MicrofacetExtra))
+                                                               : NULL;
 
                                                        if (bsdf && extra) {
                                                                bsdf->N = N;
@@ -355,7 +359,9 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float *
                                        }
                                        else { /* use multi-scatter GGX */
                                                MicrofacetBsdf *bsdf = (MicrofacetBsdf*)bsdf_alloc(sd, sizeof(MicrofacetBsdf), glass_weight);
-                                               MicrofacetExtra *extra = (MicrofacetExtra*)closure_alloc_extra(sd, sizeof(MicrofacetExtra));
+                                               MicrofacetExtra *extra = (bsdf != NULL)
+                                                       ? (MicrofacetExtra*)closure_alloc_extra(sd, sizeof(MicrofacetExtra))
+                                                       : NULL;
 
                                                if(bsdf && extra) {
                                                        bsdf->N = N;
@@ -385,7 +391,9 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float *
 #endif
                                if(clearcoat > CLOSURE_WEIGHT_CUTOFF) {
                                        MicrofacetBsdf *bsdf = (MicrofacetBsdf*)bsdf_alloc(sd, sizeof(MicrofacetBsdf), weight);
-                                       MicrofacetExtra *extra = (MicrofacetExtra*)closure_alloc_extra(sd, sizeof(MicrofacetExtra));
+                                       MicrofacetExtra *extra = (bsdf != NULL)
+                                               ? (MicrofacetExtra*)closure_alloc_extra(sd, sizeof(MicrofacetExtra))
+                                               : NULL;
 
                                        if(bsdf && extra) {
                                                bsdf->N = clearcoat_normal;