From 0b42f14079f4a746592f184ec61783e7ca13c9be Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Wed, 21 Aug 2013 12:20:38 +0000 Subject: [PATCH] Fix #36526: SSS + hair crash after recent changes. --- intern/cycles/kernel/kernel_bvh.h | 4 ++-- intern/cycles/kernel/kernel_bvh_subsurface.h | 10 +++++++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/intern/cycles/kernel/kernel_bvh.h b/intern/cycles/kernel/kernel_bvh.h index 4d37b6ddcf4..21320dadb44 100644 --- a/intern/cycles/kernel/kernel_bvh.h +++ b/intern/cycles/kernel/kernel_bvh.h @@ -794,7 +794,7 @@ __device_inline void bvh_triangle_intersect_subsurface(KernelGlobals *kg, Inters #if defined(__SUBSURFACE__) && defined(__HAIR__) #define BVH_FUNCTION_NAME bvh_intersect_subsurface_hair -#define BVH_FUNCTION_FEATURES BVH_INSTANCING|BVH_HAIR|BVH_HAIR_MINIMUM_WIDTH +#define BVH_FUNCTION_FEATURES BVH_INSTANCING|BVH_HAIR #include "kernel_bvh_subsurface.h" #endif @@ -806,7 +806,7 @@ __device_inline void bvh_triangle_intersect_subsurface(KernelGlobals *kg, Inters #if defined(__SUBSURFACE__) && defined(__HAIR__) && defined(__OBJECT_MOTION__) #define BVH_FUNCTION_NAME bvh_intersect_subsurface_hair_motion -#define BVH_FUNCTION_FEATURES BVH_INSTANCING|BVH_HAIR|BVH_HAIR_MINIMUM_WIDTH|BVH_MOTION +#define BVH_FUNCTION_FEATURES BVH_INSTANCING|BVH_HAIR|BVH_MOTION #include "kernel_bvh_subsurface.h" #endif diff --git a/intern/cycles/kernel/kernel_bvh_subsurface.h b/intern/cycles/kernel/kernel_bvh_subsurface.h index ac30bea6a9d..4446c1821d5 100644 --- a/intern/cycles/kernel/kernel_bvh_subsurface.h +++ b/intern/cycles/kernel/kernel_bvh_subsurface.h @@ -207,7 +207,13 @@ __device uint BVH_FUNCTION_NAME(KernelGlobals *kg, const Ray *ray, Intersection --stackPtr; /* primitive intersection */ - while(primAddr < primAddr2) { + for(; primAddr < primAddr2; primAddr++) { +#if FEATURE(BVH_HAIR) + uint segment = kernel_tex_fetch(__prim_segment, primAddr); + if(segment != ~0) + continue; +#endif + /* only primitives from the same object */ uint tri_object = (object == ~0)? kernel_tex_fetch(__prim_object, primAddr): object; @@ -216,8 +222,6 @@ __device uint BVH_FUNCTION_NAME(KernelGlobals *kg, const Ray *ray, Intersection /* intersect ray against primitive */ bvh_triangle_intersect_subsurface(kg, isect_array, P, idir, object, primAddr, tmax, &num_hits, lcg_state, max_hits); } - - primAddr++; } } #if FEATURE(BVH_INSTANCING)