diff options
-rw-r--r-- | intern/cycles/kernel/kernel_path.h | 6 | ||||
-rw-r--r-- | intern/cycles/kernel/kernel_volume.h | 5 |
2 files changed, 8 insertions, 3 deletions
diff --git a/intern/cycles/kernel/kernel_path.h b/intern/cycles/kernel/kernel_path.h index 8eb6866068e..a1012cf2b72 100644 --- a/intern/cycles/kernel/kernel_path.h +++ b/intern/cycles/kernel/kernel_path.h @@ -373,8 +373,9 @@ ccl_device void kernel_path_subsurface_update_volume_stack(KernelGlobals *kg, Ray volume_ray = *ray; Intersection isect; - - while(scene_intersect_volume(kg, &volume_ray, &isect)) + int step = 0; + while(step < VOLUME_STACK_SIZE && + scene_intersect_volume(kg, &volume_ray, &isect)) { ShaderData sd; shader_setup_from_ray(kg, &sd, &isect, &volume_ray, 0, 0); @@ -383,6 +384,7 @@ ccl_device void kernel_path_subsurface_update_volume_stack(KernelGlobals *kg, /* Move ray forward. */ volume_ray.P = ray_offset(sd.P, -sd.Ng); volume_ray.t -= sd.ray_length; + ++step; } } #endif diff --git a/intern/cycles/kernel/kernel_volume.h b/intern/cycles/kernel/kernel_volume.h index b2181952aeb..9d6c233f5b2 100644 --- a/intern/cycles/kernel/kernel_volume.h +++ b/intern/cycles/kernel/kernel_volume.h @@ -980,9 +980,11 @@ ccl_device void kernel_volume_stack_init(KernelGlobals *kg, int stack_index = 0, enclosed_index = 0; int enclosed_volumes[VOLUME_STACK_SIZE]; + int step = 0; while(stack_index < VOLUME_STACK_SIZE - 1 && - enclosed_index < VOLUME_STACK_SIZE - 1) + enclosed_index < VOLUME_STACK_SIZE - 1 && + step < 2 * VOLUME_STACK_SIZE) { Intersection isect; if(!scene_intersect_volume(kg, &volume_ray, &isect)) { @@ -1017,6 +1019,7 @@ ccl_device void kernel_volume_stack_init(KernelGlobals *kg, /* Move ray forward. */ volume_ray.P = ray_offset(sd.P, -sd.Ng); + ++step; } /* stack_index of 0 means quick checks outside of the kernel gave false * positive, nothing to worry about, just we've wasted quite a few of |