Cycles: Workaround incorrect SSS with CUDA toolkit 8.0.61

This commit is contained in:
Sergey Sharybin 2017-03-24 10:08:18 +01:00
parent a14fb77fee
commit 85a5fbf2ce
2 changed files with 6 additions and 5 deletions

@ -202,8 +202,9 @@ ccl_device_intersect bool scene_intersect(KernelGlobals *kg,
} }
#ifdef __SUBSURFACE__ #ifdef __SUBSURFACE__
/* Note: ray is passed by value to work around a possible CUDA compiler bug. */
ccl_device_intersect void scene_intersect_subsurface(KernelGlobals *kg, ccl_device_intersect void scene_intersect_subsurface(KernelGlobals *kg,
const Ray *ray, const Ray ray,
SubsurfaceIntersection *ss_isect, SubsurfaceIntersection *ss_isect,
int subsurface_object, int subsurface_object,
uint *lcg_state, uint *lcg_state,
@ -212,7 +213,7 @@ ccl_device_intersect void scene_intersect_subsurface(KernelGlobals *kg,
#ifdef __OBJECT_MOTION__ #ifdef __OBJECT_MOTION__
if(kernel_data.bvh.have_motion) { if(kernel_data.bvh.have_motion) {
return bvh_intersect_subsurface_motion(kg, return bvh_intersect_subsurface_motion(kg,
ray, &ray,
ss_isect, ss_isect,
subsurface_object, subsurface_object,
lcg_state, lcg_state,
@ -220,7 +221,7 @@ ccl_device_intersect void scene_intersect_subsurface(KernelGlobals *kg,
} }
#endif /* __OBJECT_MOTION__ */ #endif /* __OBJECT_MOTION__ */
return bvh_intersect_subsurface(kg, return bvh_intersect_subsurface(kg,
ray, &ray,
ss_isect, ss_isect,
subsurface_object, subsurface_object,
lcg_state, lcg_state,

@ -293,7 +293,7 @@ ccl_device_inline int subsurface_scatter_multi_intersect(
/* intersect with the same object. if multiple intersections are found it /* intersect with the same object. if multiple intersections are found it
* will use at most BSSRDF_MAX_HITS hits, a random subset of all hits */ * will use at most BSSRDF_MAX_HITS hits, a random subset of all hits */
scene_intersect_subsurface(kg, scene_intersect_subsurface(kg,
ray, *ray,
ss_isect, ss_isect,
sd->object, sd->object,
lcg_state, lcg_state,
@ -448,7 +448,7 @@ ccl_device void subsurface_scatter_step(KernelGlobals *kg, ShaderData *sd, PathS
/* intersect with the same object. if multiple intersections are /* intersect with the same object. if multiple intersections are
* found it will randomly pick one of them */ * found it will randomly pick one of them */
SubsurfaceIntersection ss_isect; SubsurfaceIntersection ss_isect;
scene_intersect_subsurface(kg, &ray, &ss_isect, sd->object, lcg_state, 1); scene_intersect_subsurface(kg, ray, &ss_isect, sd->object, lcg_state, 1);
/* evaluate bssrdf */ /* evaluate bssrdf */
if(ss_isect.num_hits > 0) { if(ss_isect.num_hits > 0) {