[Bf-blender-cvs] [829bd9b] cycles_hair_bvh: Cycles: Optimize shadow rays intersection
Sergey Sharybin
noreply at git.blender.org
Mon May 2 15:55:27 CEST 2016
Commit: 829bd9bf445a02873bf69c492a82d9aaebf093d2
Author: Sergey Sharybin
Date: Mon May 2 15:55:19 2016 +0200
Branches: cycles_hair_bvh
https://developer.blender.org/rB829bd9bf445a02873bf69c492a82d9aaebf093d2
Cycles: Optimize shadow rays intersection
===================================================================
M intern/cycles/kernel/geom/geom_bvh.h
M intern/cycles/kernel/geom/geom_bvh_shadow_curve.h
M intern/cycles/kernel/geom/geom_qbvh_shadow_curve.h
===================================================================
diff --git a/intern/cycles/kernel/geom/geom_bvh.h b/intern/cycles/kernel/geom/geom_bvh.h
index e9254b3..950ae5c 100644
--- a/intern/cycles/kernel/geom/geom_bvh.h
+++ b/intern/cycles/kernel/geom/geom_bvh.h
@@ -195,6 +195,9 @@ ccl_device_intersect bool scene_intersect(KernelGlobals *kg,
hit = bvh_intersect_motion(kg, ray, isect, visibility);
# ifdef __HAIR__
if(kernel_data.bvh.have_curves) {
+ if(hit && visibility == PATH_RAY_SHADOW_OPAQUE) {
+ return true;
+ }
hit |= bvh_intersect_curve_motion(kg, ray, isect, visibility, lcg_state, difl, extmax);
}
# endif /* __HAIR__ */
@@ -223,6 +226,9 @@ ccl_device_intersect bool scene_intersect(KernelGlobals *kg,
#ifdef __HAIR__
if(kernel_data.bvh.have_curves) {
+ if(hit && visibility == PATH_RAY_SHADOW_OPAQUE) {
+ return true;
+ }
hit |= bvh_intersect_curve(kg, ray, isect, visibility, lcg_state, difl, extmax);
}
#endif /* __HAIR__ */
@@ -273,7 +279,7 @@ ccl_device_intersect bool scene_intersect_shadow_all(KernelGlobals *kg,
occluded = bvh_intersect_shadow_all_curve_motion(kg,
ray,
isect + *num_hits,
- max_hits,
+ max_hits - *num_hits,
num_hits);
}
# endif /* __HAIR__ */
@@ -293,7 +299,7 @@ ccl_device_intersect bool scene_intersect_shadow_all(KernelGlobals *kg,
occluded = bvh_intersect_shadow_all_curve(kg,
ray,
isect + *num_hits,
- max_hits,
+ max_hits - *num_hits,
num_hits);
}
# endif /* __HAIR__ */
diff --git a/intern/cycles/kernel/geom/geom_bvh_shadow_curve.h b/intern/cycles/kernel/geom/geom_bvh_shadow_curve.h
index 0c37826..c32aac4 100644
--- a/intern/cycles/kernel/geom/geom_bvh_shadow_curve.h
+++ b/intern/cycles/kernel/geom/geom_bvh_shadow_curve.h
@@ -85,9 +85,6 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals *kg,
gen_idirsplat_swap(pn, shuf_identity, shuf_swap, idir, idirsplat, shufflexyz);
#endif /* __KERNEL_SSE2__ */
- IsectPrecalc isect_precalc;
- triangle_intersect_precalc(dir, &isect_precalc);
-
/* traversal loop */
do {
do {
@@ -282,7 +279,6 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals *kg,
bvh_instance_push(kg, object, ray, &P, &dir, &idir, &isect_t);
# endif
- triangle_intersect_precalc(dir, &isect_precalc);
num_hits_in_instance = 0;
isect_array->t = isect_t;
@@ -318,8 +314,6 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals *kg,
bvh_instance_pop_factor(kg, object, ray, &P, &dir, &idir, &t_fac);
# endif
- triangle_intersect_precalc(dir, &isect_precalc);
-
/* scale isect->t to adjust for instancing */
for(int i = 0; i < num_hits_in_instance; i++)
(isect_array-i-1)->t *= t_fac;
@@ -332,7 +326,6 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals *kg,
# else
bvh_instance_pop(kg, object, ray, &P, &dir, &idir, &ignore_t);
# endif
- triangle_intersect_precalc(dir, &isect_precalc);
}
isect_t = tmax;
diff --git a/intern/cycles/kernel/geom/geom_qbvh_shadow_curve.h b/intern/cycles/kernel/geom/geom_qbvh_shadow_curve.h
index 005bd85..165a427 100644
--- a/intern/cycles/kernel/geom/geom_qbvh_shadow_curve.h
+++ b/intern/cycles/kernel/geom/geom_qbvh_shadow_curve.h
@@ -88,9 +88,6 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(QBVH)(KernelGlobals *kg,
if(idir.y >= 0.0f) { near_y = 2; far_y = 3; } else { near_y = 3; far_y = 2; }
if(idir.z >= 0.0f) { near_z = 4; far_z = 5; } else { near_z = 5; far_z = 4; }
- IsectPrecalc isect_precalc;
- triangle_intersect_precalc(dir, &isect_precalc);
-
/* Traversal loop. */
do {
do {
@@ -311,8 +308,6 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(QBVH)(KernelGlobals *kg,
P_idir = P*idir;
P_idir4 = sse3f(P_idir.x, P_idir.y, P_idir.z);
# endif
- triangle_intersect_precalc(dir, &isect_precalc);
-
++stackPtr;
kernel_assert(stackPtr < BVH_QSTACK_SIZE);
traversalStack[stackPtr].addr = ENTRYPOINT_SENTINEL;
@@ -365,7 +360,6 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(QBVH)(KernelGlobals *kg,
P_idir = P*idir;
P_idir4 = sse3f(P_idir.x, P_idir.y, P_idir.z);
# endif
- triangle_intersect_precalc(dir, &isect_precalc);
object = OBJECT_NONE;
nodeAddr = traversalStack[stackPtr].addr;
More information about the Bf-blender-cvs
mailing list