Commit: bb0a0315e28216e64190b3c6e5657438a28ad56d
Author: Brecht Van Lommel
Date:   Fri Jan 3 02:48:48 2014 +0100
https://developer.blender.org/rBbb0a0315e28216e64190b3c6e5657438a28ad56d

Code refactor: move random number and MIS variables into PathState.

This makes it easier to pass this state around, and wraps some common RNG
dimension computations in utility functions.

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

M       intern/cycles/kernel/kernel_path.h
M       intern/cycles/kernel/kernel_path_state.h
M       intern/cycles/kernel/kernel_random.h
M       intern/cycles/kernel/kernel_types.h

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

diff --git a/intern/cycles/kernel/kernel_path.h 
b/intern/cycles/kernel/kernel_path.h
index ee56dbd..fda6b45 100644
--- a/intern/cycles/kernel/kernel_path.h
+++ b/intern/cycles/kernel/kernel_path.h
@@ -50,16 +50,11 @@ CCL_NAMESPACE_BEGIN
 
 #if defined(__BRANCHED_PATH__) || defined(__SUBSURFACE__)
 
-ccl_device void kernel_path_indirect(KernelGlobals *kg, RNG *rng, int sample, 
Ray ray, ccl_global float *buffer,
-       float3 throughput, int num_samples, int num_total_samples,
-       float min_ray_pdf, float ray_pdf, PathState state, int rng_offset, 
PathRadiance *L)
+ccl_device void kernel_path_indirect(KernelGlobals *kg, RNG *rng, Ray ray, 
ccl_global float *buffer,
+       float3 throughput, int num_samples, PathState state, PathRadiance *L)
 {
-#ifdef __LAMP_MIS__
-       float ray_t = 0.0f;
-#endif
-
        /* path iteration */
-       for(;; rng_offset += PRNG_BOUNCE_NUM) {
+       for(;;) {
                /* intersect scene */
                Intersection isect;
                uint visibility = path_state_ray_visibility(kg, &state);
@@ -74,19 +69,19 @@ ccl_device void kernel_path_indirect(KernelGlobals *kg, RNG 
*rng, int sample, Ra
                        /* ray starting from previous non-transparent bounce */
                        Ray light_ray;
 
-                       light_ray.P = ray.P - ray_t*ray.D;
-                       ray_t += isect.t;
+                       light_ray.P = ray.P - state.ray_t*ray.D;
+                       state.ray_t += isect.t;
                        light_ray.D = ray.D;
-                       light_ray.t = ray_t;
+                       light_ray.t = state.ray_t;
                        light_ray.time = ray.time;
                        light_ray.dD = ray.dD;
                        light_ray.dP = ray.dP;
 
                        /* intersect with lamp */
-                       float light_t = path_rng_1D(kg, rng, sample, 
num_total_samples, rng_offset + PRNG_LIGHT);
+                       float light_t = path_state_rng_1D(kg, rng, &state, 
PRNG_LIGHT);
                        float3 emission;
 
-                       if(indirect_lamp_emission(kg, &light_ray, state.flag, 
ray_pdf, light_t, &emission, state.bounce))
+                       if(indirect_lamp_emission(kg, &light_ray, state.flag, 
state.ray_pdf, light_t, &emission, state.bounce))
                                path_radiance_accum_emission(L, throughput, 
emission, state.bounce);
                }
 #endif
@@ -103,7 +98,7 @@ ccl_device void kernel_path_indirect(KernelGlobals *kg, RNG 
*rng, int sample, Ra
                if(!hit) {
 #ifdef __BACKGROUND__
                        /* sample background shader */
-                       float3 L_background = indirect_background(kg, &ray, 
state.flag, ray_pdf, state.bounce);
+                       float3 L_background = indirect_background(kg, &ray, 
state.flag, state.ray_pdf, state.bounce);
                        path_radiance_accum_background(L, throughput, 
L_background, state.bounce);
 #endif
 
@@ -113,7 +108,7 @@ ccl_device void kernel_path_indirect(KernelGlobals *kg, RNG 
*rng, int sample, Ra
                /* setup shading */
                ShaderData sd;
                shader_setup_from_ray(kg, &sd, &isect, &ray, state.bounce);
-               float rbsdf = path_rng_1D(kg, rng, sample, num_total_samples, 
rng_offset + PRNG_BSDF);
+               float rbsdf = path_state_rng_1D(kg, rng, &state, PRNG_BSDF);
                shader_eval_surface(kg, &sd, rbsdf, state.flag, 
SHADER_CONTEXT_INDIRECT);
 #ifdef __BRANCHED_PATH__
                shader_merge_closures(&sd);
@@ -122,7 +117,7 @@ ccl_device void kernel_path_indirect(KernelGlobals *kg, RNG 
*rng, int sample, Ra
                /* blurring of bsdf after bounces, for rays that have a small 
likelihood
                 * of following this particular path (diffuse, rough glossy) */
                if(kernel_data.integrator.filter_glossy != FLT_MAX) {
-                       float blur_pdf = 
kernel_data.integrator.filter_glossy*min_ray_pdf;
+                       float blur_pdf = 
kernel_data.integrator.filter_glossy*state.min_ray_pdf;
 
                        if(blur_pdf < 1.0f) {
                                float blur_roughness = sqrtf(1.0f - 
blur_pdf)*0.5f;
@@ -133,7 +128,7 @@ ccl_device void kernel_path_indirect(KernelGlobals *kg, RNG 
*rng, int sample, Ra
 #ifdef __EMISSION__
                /* emission */
                if(sd.flag & SD_EMISSION) {
-                       float3 emission = indirect_primitive_emission(kg, &sd, 
isect.t, state.flag, ray_pdf);
+                       float3 emission = indirect_primitive_emission(kg, &sd, 
isect.t, state.flag, state.ray_pdf);
                        path_radiance_accum_emission(L, throughput, emission, 
state.bounce);
                }
 #endif
@@ -147,7 +142,7 @@ ccl_device void kernel_path_indirect(KernelGlobals *kg, RNG 
*rng, int sample, Ra
                        break;
                }
                else if(probability != 1.0f) {
-                       float terminate = path_rng_1D(kg, rng, sample, 
num_total_samples, rng_offset + PRNG_TERMINATE);
+                       float terminate = path_state_rng_1D(kg, rng, &state, 
PRNG_TERMINATE);
 
                        if(terminate >= probability)
                                break;
@@ -159,7 +154,7 @@ ccl_device void kernel_path_indirect(KernelGlobals *kg, RNG 
*rng, int sample, Ra
                /* ambient occlusion */
                if(kernel_data.integrator.use_ambient_occlusion || (sd.flag & 
SD_AO)) {
                        float bsdf_u, bsdf_v;
-                       path_rng_2D(kg, rng, sample, num_total_samples, 
rng_offset + PRNG_BSDF_U, &bsdf_u, &bsdf_v);
+                       path_state_rng_2D(kg, rng, &state, PRNG_BSDF_U, 
&bsdf_u, &bsdf_v);
 
                        float ao_factor = kernel_data.background.ao_factor;
                        float3 ao_N;
@@ -201,10 +196,10 @@ ccl_device void kernel_path_indirect(KernelGlobals *kg, 
RNG *rng, int sample, Ra
 
                        /* do bssrdf scatter step if we picked a bssrdf closure 
*/
                        if(sc) {
-                               uint lcg_state = lcg_init(*rng + rng_offset + 
sample*0x68bc21eb);
+                               uint lcg_state = lcg_state_init(rng, &state, 
0x68bc21eb);
 
                                float bssrdf_u, bssrdf_v;
-                               path_rng_2D(kg, rng, sample, num_total_samples, 
rng_offset + PRNG_BSDF_U, &bssrdf_u, &bssrdf_v);
+                               path_state_rng_2D(kg, rng, &state, PRNG_BSDF_U, 
&bssrdf_u, &bssrdf_v);
                                subsurface_scatter_step(kg, &sd, state.flag, 
sc, &lcg_state, bssrdf_u, bssrdf_v, false);
 
                                state.flag |= PATH_RAY_BSSRDF_ANCESTOR;
@@ -216,14 +211,14 @@ ccl_device void kernel_path_indirect(KernelGlobals *kg, 
RNG *rng, int sample, Ra
                if(kernel_data.integrator.use_direct_light) {
                        /* sample illumination from lights to find path 
contribution */
                        if(sd.flag & SD_BSDF_HAS_EVAL) {
-                               float light_t = path_rng_1D(kg, rng, sample, 
num_total_samples, rng_offset + PRNG_LIGHT);
+                               float light_t = path_state_rng_1D(kg, rng, 
&state, PRNG_LIGHT);
 #ifdef __MULTI_CLOSURE__
                                float light_o = 0.0f;
 #else
-                               float light_o = path_rng_1D(kg, rng, sample, 
num_total_samples, rng_offset + PRNG_LIGHT_F);
+                               float light_o = path_state_rng_1D(kg, rng, 
&state, PRNG_LIGHT_F);
 #endif
                                float light_u, light_v;
-                               path_rng_2D(kg, rng, sample, num_total_samples, 
rng_offset + PRNG_LIGHT_U, &light_u, &light_v);
+                               path_state_rng_2D(kg, rng, &state, 
PRNG_LIGHT_U, &light_u, &light_v);
 
                                Ray light_ray;
                                BsdfEval L_light;
@@ -255,7 +250,7 @@ ccl_device void kernel_path_indirect(KernelGlobals *kg, RNG 
*rng, int sample, Ra
                        float3 bsdf_omega_in;
                        differential3 bsdf_domega_in;
                        float bsdf_u, bsdf_v;
-                       path_rng_2D(kg, rng, sample, num_total_samples, 
rng_offset + PRNG_BSDF_U, &bsdf_u, &bsdf_v);
+                       path_state_rng_2D(kg, rng, &state, PRNG_BSDF_U, 
&bsdf_u, &bsdf_v);
                        int label;
 
                        label = shader_bsdf_sample(kg, &sd, bsdf_u, bsdf_v, 
&bsdf_eval,
@@ -269,11 +264,11 @@ ccl_device void kernel_path_indirect(KernelGlobals *kg, 
RNG *rng, int sample, Ra
 
                        /* set labels */
                        if(!(label & LABEL_TRANSPARENT)) {
-                               ray_pdf = bsdf_pdf;
+                               state.ray_pdf = bsdf_pdf;
 #ifdef __LAMP_MIS__
-                               ray_t = 0.0f;
+                               state.ray_t = 0.0f;
 #endif
-                               min_ray_pdf = fminf(bsdf_pdf, min_ray_pdf);
+                               state.min_ray_pdf = fminf(bsdf_pdf, 
state.min_ray_pdf);
                        }
 
                        /* update path state */
@@ -323,23 +318,20 @@ ccl_device void kernel_path_indirect(KernelGlobals *kg, 
RNG *rng, int sample, Ra
 #ifdef __SUBSURFACE__
 
 ccl_device_inline bool kernel_path_integrate_lighting(KernelGlobals *kg, RNG 
*rng,
-       int sample, int num_samples,
-       ShaderData *sd, float3 *throughput,
-       float *min_ray_pdf, float *ray_pdf, PathState *state,
-       int rng_offset, PathRadiance *L, Ray *ray, float *ray_t)
+       ShaderData *sd, float3 *throughput, PathState *state, PathRadiance *L, 
Ray *ray)
 {
 #ifdef __EMISSION__
        if(kernel_data.integrator.use_direct_light) {
                /* sample illumination from lights to find path contribution */
                if(sd->flag & SD_BSDF_HAS_EVAL) {
-                       float light_t = path_rng_1D(kg, rng, sample, 
num_samples, rng_offset + PRNG_LIGHT);
+                       float light_t = path_state_rng_1D(kg, rng, state, 
PRNG_LIGHT);
 #ifdef __MULTI_CLOSURE__
                        float light_o = 0.0f;
 #else
-                       float light_o = path_rng_1D(kg, rng, sample, 
num_samples, rng_offset + PRNG_LIGHT_F);
+                       float light_o = path_state_rng_1D(kg, rng, state, 
PRNG_LIGHT_F);
 #endif
                        float light_u, light_v;
-                       path_rng_2D(kg, rng, sample, num_samples, rng_offset + 
PRNG_LIGHT_U, &light_u, &light_v);
+                       path_state_rng_2D(kg, rng, state, PRNG_LIGHT_U, 
&light_u, &light_v);
 
                        Ray light_ray;
                        BsdfEval L_light;
@@ -370,7 +362,7 @@ ccl_device_inline bool 
kernel_path_integrate_lighting(KernelGlobals *kg, RNG *rn
                float3 bsdf_omega_in;
                differential3 bsdf_domega_in;
                float bsdf_u, bsdf_v;
-               path_rng_2D(kg, rng, sample, num_samples, rng_offset + 
PRNG_BSDF_U, &bsdf_u, &bsdf_v);
+               path_state_rng_2D(kg, rng, state, PRNG_BSDF_U, &bsdf_u, 
&bsdf_v);
                int label;
 
                label = shader_bsdf_sample(kg, sd, bsdf_u, bsdf_v, &bsdf_eval,
@@ -384,11 +376,11 @@ ccl_device_inline bool 
kernel_path_integrate_lighting(KernelGlobals *kg, RNG *rn
 
                /* set labels */
                if(!(label & LABEL_TRANSPARENT)) {
-                       *ray_pdf = bsdf_pdf;
+                       state->ray_pdf = bsdf_pdf;
 #ifdef __LAMP_MIS__
-                       *ray_t = 0.0f;
+                       state->ray_t = 0.0f;
 #endif
-                       *min_ray_pdf = fminf(bsdf_pdf, *min_ray_pdf);
+                       state->min_ray_pdf = fminf(bsdf_pdf, 
state->min_ray_pdf);
                }
 
                /* update path state */
@@ -450,23 +442,11 @@ ccl_device float4 kernel_path_integrate(KernelGlobals 
*kg, RNG *rng, int sample,
 
        path_radiance_init(&L, kernel_data.film.use_light_pass);
 
-       float min_ray_pdf = FLT_MAX;
-       float ray_pdf = 0.0f;
-#ifdef __LAMP_MIS__
-       float ray_t = 0.0f;
-#endif
        PathState state;
-       int rng_offset = PRNG_BASE_NUM;
-#ifdef __CMJ__
-       int num_samples = kernel_data.integrator.aa_samples;
-#else
-       int num_samples = 0;
-#endif
-
        path_state_init(kg, &state, rng, sample);
 
        /* path iteration */
-       for(;; rng_offset += PRNG_BOUNCE_NUM) {
+       for(;;) {
                /* intersect scene */
                Intersection isect;
                uint visibility = path_state_ray_visibility(kg, &state);
@@ -483,7 +463,7 @@ ccl_device float4 kernel_path_integrate(KernelGlobals *kg, 
RNG *rng, int sample,
                        }
 
                        extmax = kernel_data.curve.maximum_width;
-                       lcg_state = lcg_init(*rng + rng_offset + 
sample*0x51633e2d);
+                       lcg_state = lcg_state

@@ Diff output truncated at 10240 characters. @@

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

Reply via email to