Commit: 9b6ed3a42b9a0fea56808fd5ce0d18cb5231f47b
Author: Brecht Van Lommel
Date:   Mon Jul 25 03:03:23 2016 +0200
Branches: master
https://developer.blender.org/rB9b6ed3a42b9a0fea56808fd5ce0d18cb5231f47b

Cycles: refactor kernel closure storage to use structs per closure type.

Reviewed By: dingto, sergey

Differential Revision: https://developer.blender.org/D2127

===================================================================

M       intern/cycles/kernel/CMakeLists.txt
A       intern/cycles/kernel/closure/alloc.h
M       intern/cycles/kernel/closure/bsdf.h
M       intern/cycles/kernel/closure/bsdf_ashikhmin_shirley.h
M       intern/cycles/kernel/closure/bsdf_ashikhmin_velvet.h
M       intern/cycles/kernel/closure/bsdf_diffuse.h
M       intern/cycles/kernel/closure/bsdf_diffuse_ramp.h
M       intern/cycles/kernel/closure/bsdf_hair.h
M       intern/cycles/kernel/closure/bsdf_microfacet.h
M       intern/cycles/kernel/closure/bsdf_microfacet_multi.h
M       intern/cycles/kernel/closure/bsdf_oren_nayar.h
M       intern/cycles/kernel/closure/bsdf_phong_ramp.h
M       intern/cycles/kernel/closure/bsdf_reflection.h
M       intern/cycles/kernel/closure/bsdf_refraction.h
M       intern/cycles/kernel/closure/bsdf_toon.h
M       intern/cycles/kernel/closure/bssrdf.h
M       intern/cycles/kernel/closure/volume.h
M       intern/cycles/kernel/kernel_shader.h
M       intern/cycles/kernel/kernel_subsurface.h
M       intern/cycles/kernel/kernel_types.h
M       intern/cycles/kernel/osl/CMakeLists.txt
M       intern/cycles/kernel/osl/background.cpp
M       intern/cycles/kernel/osl/bsdf_diffuse_ramp.cpp
M       intern/cycles/kernel/osl/bsdf_phong_ramp.cpp
M       intern/cycles/kernel/osl/emissive.cpp
M       intern/cycles/kernel/osl/osl_bssrdf.cpp
D       intern/cycles/kernel/osl/osl_bssrdf.h
M       intern/cycles/kernel/osl/osl_closures.cpp
M       intern/cycles/kernel/osl/osl_closures.h
M       intern/cycles/kernel/osl/osl_shader.cpp
M       intern/cycles/kernel/osl/osl_shader.h
M       intern/cycles/kernel/svm/svm_closure.h
M       intern/cycles/kernel/svm/svm_types.h
M       intern/cycles/render/graph.cpp
M       intern/cycles/util/util_math.h
M       release/scripts/addons

===================================================================

diff --git a/intern/cycles/kernel/CMakeLists.txt 
b/intern/cycles/kernel/CMakeLists.txt
index 0d663bb..c0b5855 100644
--- a/intern/cycles/kernel/CMakeLists.txt
+++ b/intern/cycles/kernel/CMakeLists.txt
@@ -87,6 +87,7 @@ set(SRC_KERNELS_CPU_HEADERS
 )
 
 set(SRC_CLOSURE_HEADERS
+       closure/alloc.h
        closure/bsdf.h
        closure/bsdf_ashikhmin_velvet.h
        closure/bsdf_diffuse.h
diff --git a/intern/cycles/kernel/closure/alloc.h 
b/intern/cycles/kernel/closure/alloc.h
new file mode 100644
index 0000000..b7abc1e
--- /dev/null
+++ b/intern/cycles/kernel/closure/alloc.h
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2011-2016 Blender Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+CCL_NAMESPACE_BEGIN
+
+ccl_device ShaderClosure *closure_alloc(ShaderData *sd, int size, ClosureType 
type, float3 weight)
+{
+       kernel_assert(size <= sizeof(ShaderClosure));
+
+       int num_closure = ccl_fetch(sd, num_closure);
+       int num_closure_extra = ccl_fetch(sd, num_closure_extra);
+       if(num_closure + num_closure_extra >= MAX_CLOSURE)
+               return NULL;
+
+       ShaderClosure *sc = &ccl_fetch(sd, closure)[num_closure];
+
+       sc->type = type;
+       sc->weight = weight;
+
+       ccl_fetch(sd, num_closure)++;
+
+       return sc;
+}
+
+ccl_device ccl_addr_space void *closure_alloc_extra(ShaderData *sd, int size)
+{
+       /* Allocate extra space for closure that need more parameters. We 
allocate
+        * in chunks of sizeof(ShaderClosure) starting from the end of the 
closure
+        * array.
+        *
+        * This lets us keep the same fast array iteration over closures, as we
+        * found linked list iteration and iteration with skipping to be 
slower. */
+       int num_extra = ((size + sizeof(ShaderClosure) - 1) / 
sizeof(ShaderClosure));
+       int num_closure = ccl_fetch(sd, num_closure);
+       int num_closure_extra = ccl_fetch(sd, num_closure_extra) + num_extra;
+
+       if(num_closure + num_closure_extra > MAX_CLOSURE) {
+               /* Remove previous closure. */
+               ccl_fetch(sd, num_closure)--;
+               ccl_fetch(sd, num_closure_extra)++;
+               return NULL;
+       }
+
+       ccl_fetch(sd, num_closure_extra) = num_closure_extra;
+       return (ccl_addr_space void*)(ccl_fetch(sd, closure) + MAX_CLOSURE - 
num_closure_extra);
+}
+
+ccl_device_inline ShaderClosure *bsdf_alloc(ShaderData *sd, int size, float3 
weight)
+{
+       ShaderClosure *sc = closure_alloc(sd, size, CLOSURE_NONE_ID, weight);
+
+       if(!sc)
+               return NULL;
+
+       float sample_weight = fabsf(average(weight));
+       sc->sample_weight = sample_weight;
+       return (sample_weight >= CLOSURE_WEIGHT_CUTOFF) ? sc : NULL;
+}
+
+#ifdef __OSL__
+ccl_device_inline ShaderClosure *bsdf_alloc_osl(ShaderData *sd, int size, 
float3 weight, void *data)
+{
+       ShaderClosure *sc = closure_alloc(sd, size, CLOSURE_NONE_ID, weight);
+
+       if(!sc)
+               return NULL;
+
+       memcpy(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;
+}
+#endif
+
+CCL_NAMESPACE_END
diff --git a/intern/cycles/kernel/closure/bsdf.h 
b/intern/cycles/kernel/closure/bsdf.h
index f318a61..a251e3b 100644
--- a/intern/cycles/kernel/closure/bsdf.h
+++ b/intern/cycles/kernel/closure/bsdf.h
@@ -40,11 +40,6 @@ ccl_device int bsdf_sample(KernelGlobals *kg, ShaderData 
*sd, const ShaderClosur
 {
        int label;
 
-#ifdef __OSL__
-       if(kg->osl && sc->prim)
-               return OSLShader::bsdf_sample(sd, sc, randu, randv, *eval, 
*omega_in, *domega_in, *pdf);
-#endif
-
        switch(sc->type) {
                case CLOSURE_BSDF_DIFFUSE_ID:
                case CLOSURE_BSDF_BSSRDF_ID:
@@ -56,14 +51,16 @@ ccl_device int bsdf_sample(KernelGlobals *kg, ShaderData 
*sd, const ShaderClosur
                        label = bsdf_oren_nayar_sample(sc, ccl_fetch(sd, Ng), 
ccl_fetch(sd, I), ccl_fetch(sd, dI).dx, ccl_fetch(sd, dI).dy, randu, randv,
                                eval, omega_in, &domega_in->dx, &domega_in->dy, 
pdf);
                        break;
-               /*case CLOSURE_BSDF_PHONG_RAMP_ID:
+#ifdef __OSL__
+               case CLOSURE_BSDF_PHONG_RAMP_ID:
                        label = bsdf_phong_ramp_sample(sc, ccl_fetch(sd, Ng), 
ccl_fetch(sd, I), ccl_fetch(sd, dI).dx, ccl_fetch(sd, dI).dy, randu, randv,
                                eval, omega_in, &domega_in->dx, &domega_in->dy, 
pdf);
                        break;
                case CLOSURE_BSDF_DIFFUSE_RAMP_ID:
                        label = bsdf_diffuse_ramp_sample(sc, ccl_fetch(sd, Ng), 
ccl_fetch(sd, I), ccl_fetch(sd, dI).dx, ccl_fetch(sd, dI).dy, randu, randv,
                                eval, omega_in, &domega_in->dx, &domega_in->dy, 
pdf);
-                       break;*/
+                       break;
+#endif
                case CLOSURE_BSDF_TRANSLUCENT_ID:
                        label = bsdf_translucent_sample(sc, ccl_fetch(sd, Ng), 
ccl_fetch(sd, I), ccl_fetch(sd, dI).dx, ccl_fetch(sd, dI).dy, randu, randv,
                                eval, omega_in, &domega_in->dx, &domega_in->dy, 
pdf);
@@ -143,11 +140,6 @@ ccl_device float3 bsdf_eval(KernelGlobals *kg, ShaderData 
*sd, const ShaderClosu
 {
        float3 eval;
 
-#ifdef __OSL__
-       if(kg->osl && sc->prim)
-               return OSLShader::bsdf_eval(sd, sc, omega_in, *pdf);
-#endif
-
        if(dot(ccl_fetch(sd, Ng), omega_in) >= 0.0f) {
                switch(sc->type) {
                        case CLOSURE_BSDF_DIFFUSE_ID:
@@ -158,12 +150,14 @@ ccl_device float3 bsdf_eval(KernelGlobals *kg, ShaderData 
*sd, const ShaderClosu
                        case CLOSURE_BSDF_OREN_NAYAR_ID:
                                eval = bsdf_oren_nayar_eval_reflect(sc, 
ccl_fetch(sd, I), omega_in, pdf);
                                break;
-                       /*case CLOSURE_BSDF_PHONG_RAMP_ID:
+#ifdef __OSL__
+                       case CLOSURE_BSDF_PHONG_RAMP_ID:
                                eval = bsdf_phong_ramp_eval_reflect(sc, 
ccl_fetch(sd, I), omega_in, pdf);
                                break;
                        case CLOSURE_BSDF_DIFFUSE_RAMP_ID:
                                eval = bsdf_diffuse_ramp_eval_reflect(sc, 
ccl_fetch(sd, I), omega_in, pdf);
-                               break;*/
+                               break;
+#endif
                        case CLOSURE_BSDF_TRANSLUCENT_ID:
                                eval = bsdf_translucent_eval_reflect(sc, 
ccl_fetch(sd, I), omega_in, pdf);
                                break;
@@ -296,15 +290,7 @@ ccl_device float3 bsdf_eval(KernelGlobals *kg, ShaderData 
*sd, const ShaderClosu
 
 ccl_device void bsdf_blur(KernelGlobals *kg, ShaderClosure *sc, float 
roughness)
 {
-/* ToDo: do we want to blur volume closures? */
-
-#ifdef __OSL__
-       if(kg->osl && sc->prim) {
-               OSLShader::bsdf_blur(sc, roughness);
-               return;
-       }
-#endif
-
+       /* ToDo: do we want to blur volume closures? */
 #ifdef __SVM__
        switch(sc->type) {
                case CLOSURE_BSDF_MICROFACET_MULTI_GGX_ID:
@@ -331,5 +317,48 @@ ccl_device void bsdf_blur(KernelGlobals *kg, ShaderClosure 
*sc, float roughness)
 #endif
 }
 
+ccl_device bool bsdf_merge(ShaderClosure *a, ShaderClosure *b)
+{
+#ifdef __SVM__
+       switch(a->type) {
+               case CLOSURE_BSDF_TRANSPARENT_ID:
+                       return true;
+               case CLOSURE_BSDF_DIFFUSE_ID:
+               case CLOSURE_BSDF_BSSRDF_ID:
+               case CLOSURE_BSDF_TRANSLUCENT_ID:
+                       return bsdf_diffuse_merge(a, b);
+               case CLOSURE_BSDF_OREN_NAYAR_ID:
+                       return bsdf_oren_nayar_merge(a, b);
+               case CLOSURE_BSDF_REFLECTION_ID:
+               case CLOSURE_BSDF_REFRACTION_ID:
+               case CLOSURE_BSDF_MICROFACET_GGX_ID:
+               case CLOSURE_BSDF_MICROFACET_GGX_ANISO_ID:
+               case CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID:
+               case CLOSURE_BSDF_MICROFACET_MULTI_GGX_ID:
+               case CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_ID:
+               case CLOSURE_BSDF_MICROFACET_BECKMANN_ID:
+               case CLOSURE_BSDF_MICROFACET_BECKMANN_ANISO_ID:
+               case CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID:
+               case CLOSURE_BSDF_ASHIKHMIN_SHIRLEY_ID:
+               case CLOSURE_BSDF_ASHIKHMIN_SHIRLEY_ANISO_ID:
+                       return bsdf_microfacet_merge(a, b);
+               case CLOSURE_BSDF_ASHIKHMIN_VELVET_ID:
+                       return bsdf_ashikhmin_velvet_merge(a, b);
+               case CLOSURE_BSDF_DIFFUSE_TOON_ID:
+               case CLOSURE_BSDF_GLOSSY_TOON_ID:
+                       return bsdf_toon_merge(a, b);
+               case CLOSURE_BSDF_HAIR_REFLECTION_ID:
+               case CLOSURE_BSDF_HAIR_TRANSMISSION_ID:
+                       return bsdf_hair_merge(a, b);
+#ifdef __VOLUME__
+               case CLOSURE_VOLUME_HENYEY_GREENSTEIN_ID:
+                       return volume_henyey_greenstein_merge(a, b);
+#endif
+               default:
+                       return false;
+       }
+#endif
+}
+
 CCL_NAMESPACE_END
 
diff --git a/intern/cycles/kernel/closure/bsdf_ashikhmin_shirley.h 
b/intern/cycles/kernel/closure/bsdf_ashikhmin_shirley.h
index 3ca6532..8ed76be 100644
--- a/intern/cycles/kernel/closure/bsdf_ashikhmin_shirley.h
+++ b/intern/cycles/kernel/closure/bsdf_ashikhmin_shirley.h
@@ -31,28 +31,30 @@ Other than that, the implementation directly follows the 
paper.
 
 CCL_NAMESPACE_BEGIN
 
-ccl_device int bsdf_ashikhmin_shirley_setup(ShaderClosure *sc)
+ccl_device int bsdf_ashikhmin_shirley_setup(MicrofacetBsdf *bsdf)
 {
-       sc->data0 = clamp(sc->data0, 1e-4f, 1.0f);
-       sc->data1 = sc->data0;
+       bsdf->alpha_x = clamp(bsdf->alpha_x, 1e-4f, 1.0f);
+       bsdf->alpha_y = bsdf->alpha_x;
 
-       sc->type = CLOSURE_BSDF_ASHIKHMIN_SHIRLEY_ID;
+       bsdf->type = CLOSURE_BSDF_ASHIKHMIN_SHIRLEY_ID;
        return SD_BSDF|SD_BSDF_HAS_EVAL;
 }
 
-ccl_device int bsdf_ashikhmin_shirley_aniso_setup(ShaderClosure *sc)
+ccl_device int bsdf_ashikhmin_shirley_aniso_setup(MicrofacetBsdf *bsdf)
 {
-       sc->data0 = clamp(sc->data0, 1e-4f, 1.0f);
-       sc->data1 = clamp(sc->data1, 1e-4f, 1.0f);
+       bsdf->alpha_x = clamp(bsdf->alpha_x, 1e-4f, 1.0f);
+       bsdf->alpha_y = clamp(bsdf->alpha_y, 1e-4f, 1.0f);
 
-       sc->type = CLOSURE_BSDF_ASHIKHMIN_SHIRLEY_ANISO_ID;
+       bsdf->type = CLOSURE_BSDF_ASHIKHMIN_SHIRLEY_ANISO_ID;
        return SD_BSDF|SD_BSDF_HAS_EVAL;
 }
 
 ccl_device void bsdf_ashikhmin_shirley_blur(ShaderClosure *sc, float roughness)
 {
-       sc->data0 = fmaxf(roughness, sc->data0); /* clamp roughness */
-       sc->data1 = fmaxf(roughness, sc->data1);
+       MicrofacetBsdf *bsdf = (MicrofacetBsdf*)sc;
+
+       bsdf->alpha_x = fmaxf(roughness, bsdf->alpha_x);
+       bsdf->alpha_y = fmaxf(roughness, bsdf->alpha_y);
 }
 
 ccl_device_inline float bsdf_ashikhmin_shirley_roughness_to_exponent(float 
roughness)
@@ -62,14 +64,15 @@ ccl_device_inline float 
bsdf_ashikhmin_shirley_roughness_to_exponent(float rough
 
 ccl_device float3 bsdf_ashikhmin_shirley_eval_reflect(const ShaderClosure *sc, 
const float3 I, const float3 omega_in, float *pdf)
 {
-       float3 N = sc->N;
+       const MicrofacetBsdf *bsdf = (const MicrofacetBsdf

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to