[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