Commit: 28f8e253667d6f8cc598990b0338160c0c513939
Author: Thomas Dinges
Date:   Sat Aug 2 15:04:00 2014 +0200
Branches: soc-2014-cycles
https://developer.blender.org/rB28f8e253667d6f8cc598990b0338160c0c513939

Cycles: Avoid some NULL checks and conditions in volume sampling code.

* Avoid segment NULL check in kernel_branched_path_volume_connect_light(), we 
access it before the function call already.
* Avoid SD_SCATTER flag check in kernel_volume_decoupled_scatter(), we check 
for this before already.

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

M       intern/cycles/kernel/kernel_path_volume.h
M       intern/cycles/kernel/kernel_volume.h

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

diff --git a/intern/cycles/kernel/kernel_path_volume.h 
b/intern/cycles/kernel/kernel_path_volume.h
index fd22daf..61d9f74 100644
--- a/intern/cycles/kernel/kernel_path_volume.h
+++ b/intern/cycles/kernel/kernel_path_volume.h
@@ -136,23 +136,18 @@ ccl_device void 
kernel_branched_path_volume_connect_light(KernelGlobals *kg, RNG
                                float3 tp = throughput;
 
                                /* sample position on volume segment */
-                               if(segment) {
-                                       float rphase = 
path_branched_rng_1D_for_decision(kg, rng, state, j, num_samples, PRNG_PHASE);
-                                       float rscatter = 
path_branched_rng_1D_for_decision(kg, rng, state, j, num_samples, 
PRNG_SCATTER_DISTANCE);
+                               float rphase = 
path_branched_rng_1D_for_decision(kg, rng, state, j, num_samples, PRNG_PHASE);
+                               float rscatter = 
path_branched_rng_1D_for_decision(kg, rng, state, j, num_samples, 
PRNG_SCATTER_DISTANCE);
 
-                                       lamp_light_sample_position(kg, i, 
light_u, light_v, ray->P, &ls);
+                               lamp_light_sample_position(kg, i, light_u, 
light_v, ray->P, &ls);
 
-                                       VolumeIntegrateResult result = 
kernel_volume_decoupled_scatter(kg,
-                                               state, ray, sd, &tp, rphase, 
rscatter, segment, (ls.t != FLT_MAX)? &ls.P: NULL, false);
+                               VolumeIntegrateResult result = 
kernel_volume_decoupled_scatter(kg,
+                                       state, ray, sd, &tp, rphase, rscatter, 
segment, (ls.t != FLT_MAX)? &ls.P: NULL, false);
 
-                                       if(result != VOLUME_PATH_SCATTERED)
-                                               continue;
+                               if(result != VOLUME_PATH_SCATTERED)
+                                       continue;
 
-                                       lamp_light_sample(kg, i, light_u, 
light_v, sd->P, &ls);
-                               }
-                               else {
-                                       lamp_light_sample(kg, i, light_u, 
light_v, ray->P, &ls);
-                               }
+                               lamp_light_sample(kg, i, light_u, light_v, 
sd->P, &ls);
 
                                if(direct_emission(kg, sd, &ls, &light_ray, 
&L_light, &is_lamp, state->bounce, state->transparent_bounce)) {
                                        /* trace shadow ray */
@@ -189,23 +184,18 @@ ccl_device void 
kernel_branched_path_volume_connect_light(KernelGlobals *kg, RNG
                                float3 tp = throughput;
 
                                /* sample position on volume segment */
-                               if(segment) {
-                                       float rphase = 
path_branched_rng_1D_for_decision(kg, rng, state, j, num_samples, PRNG_PHASE);
-                                       float rscatter = 
path_branched_rng_1D_for_decision(kg, rng, state, j, num_samples, 
PRNG_SCATTER_DISTANCE);
+                               float rphase = 
path_branched_rng_1D_for_decision(kg, rng, state, j, num_samples, PRNG_PHASE);
+                               float rscatter = 
path_branched_rng_1D_for_decision(kg, rng, state, j, num_samples, 
PRNG_SCATTER_DISTANCE);
 
-                                       light_sample_position(kg, light_t, 
light_u, light_v, sd->time, ray->P, &ls);
+                               light_sample_position(kg, light_t, light_u, 
light_v, sd->time, ray->P, &ls);
 
-                                       VolumeIntegrateResult result = 
kernel_volume_decoupled_scatter(kg,
-                                               state, ray, sd, &tp, rphase, 
rscatter, segment, (ls.t != FLT_MAX)? &ls.P: NULL, false);
+                               VolumeIntegrateResult result = 
kernel_volume_decoupled_scatter(kg,
+                                       state, ray, sd, &tp, rphase, rscatter, 
segment, (ls.t != FLT_MAX)? &ls.P: NULL, false);
 
-                                       if(result != VOLUME_PATH_SCATTERED)
-                                               continue;
+                               if(result != VOLUME_PATH_SCATTERED)
+                                       continue;
 
-                                       light_sample(kg, light_t, light_u, 
light_v, sd->time, sd->P, &ls);
-                               }
-                               else {
-                                       light_sample(kg, light_t, light_u, 
light_v, sd->time, ray->P, &ls);
-                               }
+                               light_sample(kg, light_t, light_u, light_v, 
sd->time, sd->P, &ls);
 
                                if(direct_emission(kg, sd, &ls, &light_ray, 
&L_light, &is_lamp, state->bounce, state->transparent_bounce)) {
                                        /* trace shadow ray */
@@ -231,23 +221,18 @@ ccl_device void 
kernel_branched_path_volume_connect_light(KernelGlobals *kg, RNG
                float3 tp = throughput;
 
                /* sample position on volume segment */
-               if(segment) {
-                       float rphase = path_state_rng_1D_for_decision(kg, rng, 
state, PRNG_PHASE);
-                       float rscatter = path_state_rng_1D_for_decision(kg, 
rng, state, PRNG_SCATTER_DISTANCE);
+               float rphase = path_state_rng_1D_for_decision(kg, rng, state, 
PRNG_PHASE);
+               float rscatter = path_state_rng_1D_for_decision(kg, rng, state, 
PRNG_SCATTER_DISTANCE);
 
-                       light_sample_position(kg, light_t, light_u, light_v, 
sd->time, ray->P, &ls);
+               light_sample_position(kg, light_t, light_u, light_v, sd->time, 
ray->P, &ls);
 
-                       VolumeIntegrateResult result = 
kernel_volume_decoupled_scatter(kg,
-                               state, ray, sd, &tp, rphase, rscatter, segment, 
(ls.t != FLT_MAX)? &ls.P: NULL, false);
+               VolumeIntegrateResult result = 
kernel_volume_decoupled_scatter(kg,
+                       state, ray, sd, &tp, rphase, rscatter, segment, (ls.t 
!= FLT_MAX)? &ls.P: NULL, false);
 
-                       if(result != VOLUME_PATH_SCATTERED)
-                               return;
+               if(result != VOLUME_PATH_SCATTERED)
+                       return;
 
-                       light_sample(kg, light_t, light_u, light_v, sd->time, 
sd->P, &ls);
-               }
-               else {
-                       light_sample(kg, light_t, light_u, light_v, sd->time, 
ray->P, &ls);
-               }
+               light_sample(kg, light_t, light_u, light_v, sd->time, sd->P, 
&ls);
 
                /* sample random light */
                if(direct_emission(kg, sd, &ls, &light_ray, &L_light, &is_lamp, 
state->bounce, state->transparent_bounce)) {
diff --git a/intern/cycles/kernel/kernel_volume.h 
b/intern/cycles/kernel/kernel_volume.h
index 6d5b1c2..b13168c 100644
--- a/intern/cycles/kernel/kernel_volume.h
+++ b/intern/cycles/kernel/kernel_volume.h
@@ -738,11 +738,6 @@ ccl_device VolumeIntegrateResult 
kernel_volume_decoupled_scatter(
        float3 *throughput, float rphase, float rscatter,
        const VolumeSegment *segment, const float3 *light_P, bool 
probalistic_scatter)
 {
-       int closure_flag = segment->closure_flag;
-
-       if(!(closure_flag & SD_SCATTER))
-               return VOLUME_PATH_MISSED;
-
        /* pick random color channel, we use the Veach one-sample
         * model with balance heuristic for the channels */
        int channel = (int)(rphase*3.0f);

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

Reply via email to