[Bf-blender-cvs] [4d10a46e636] master: Cleanup: refactor BVH2 in preparation of self intersection skip
Brecht Van Lommel
noreply at git.blender.org
Mon Jan 17 17:49:55 CET 2022
Commit: 4d10a46e6368f0b48a901325b94ebd43b672db32
Author: Brecht Van Lommel
Date: Thu Jan 13 17:15:30 2022 +0100
Branches: master
https://developer.blender.org/rB4d10a46e6368f0b48a901325b94ebd43b672db32
Cleanup: refactor BVH2 in preparation of self intersection skip
Move some logic out of triangle intersection functions and into BVH
traversal, so we can share logic between primitives.
Ref D12954
===================================================================
M intern/cycles/kernel/bvh/local.h
M intern/cycles/kernel/bvh/shadow_all.h
M intern/cycles/kernel/bvh/traversal.h
M intern/cycles/kernel/bvh/volume.h
M intern/cycles/kernel/bvh/volume_all.h
M intern/cycles/kernel/geom/motion_triangle_intersect.h
M intern/cycles/kernel/geom/triangle_intersect.h
===================================================================
diff --git a/intern/cycles/kernel/bvh/local.h b/intern/cycles/kernel/bvh/local.h
index 79cde69699e..4d0e6aac901 100644
--- a/intern/cycles/kernel/bvh/local.h
+++ b/intern/cycles/kernel/bvh/local.h
@@ -148,12 +148,23 @@ ccl_device_inline
/* intersect ray against primitive */
for (; prim_addr < prim_addr2; prim_addr++) {
kernel_assert(kernel_tex_fetch(__prim_type, prim_addr) == type);
+
+ /* Only intersect with matching object, for instanced objects we
+ * already know we are only intersecting the right object. */
+ if (object == OBJECT_NONE) {
+ if (kernel_tex_fetch(__prim_object, prim_addr) != local_object) {
+ continue;
+ }
+ }
+
+ const int prim = kernel_tex_fetch(__prim_index, prim_addr);
+
if (triangle_intersect_local(kg,
local_isect,
P,
dir,
- object,
local_object,
+ prim,
prim_addr,
isect_t,
lcg_state,
@@ -168,13 +179,24 @@ ccl_device_inline
/* intersect ray against primitive */
for (; prim_addr < prim_addr2; prim_addr++) {
kernel_assert(kernel_tex_fetch(__prim_type, prim_addr) == type);
+
+ /* Only intersect with matching object, for instanced objects we
+ * already know we are only intersecting the right object. */
+ if (object == OBJECT_NONE) {
+ if (kernel_tex_fetch(__prim_object, prim_addr) != local_object) {
+ continue;
+ }
+ }
+
+ const int prim = kernel_tex_fetch(__prim_index, prim_addr);
+
if (motion_triangle_intersect_local(kg,
local_isect,
P,
dir,
ray->time,
- object,
local_object,
+ prim,
prim_addr,
isect_t,
lcg_state,
diff --git a/intern/cycles/kernel/bvh/shadow_all.h b/intern/cycles/kernel/bvh/shadow_all.h
index b0e799675e0..0fb86bfda77 100644
--- a/intern/cycles/kernel/bvh/shadow_all.h
+++ b/intern/cycles/kernel/bvh/shadow_all.h
@@ -146,7 +146,7 @@ ccl_device_inline
--stack_ptr;
/* primitive intersection */
- while (prim_addr < prim_addr2) {
+ for (; prim_addr < prim_addr2; prim_addr++) {
kernel_assert((kernel_tex_fetch(__prim_type, prim_addr) & PRIMITIVE_ALL) ==
(type & PRIMITIVE_ALL));
bool hit;
@@ -156,16 +156,29 @@ ccl_device_inline
* might give a few % performance improvement */
Intersection isect ccl_optional_struct_init;
+ const int prim_object = (object == OBJECT_NONE) ?
+ kernel_tex_fetch(__prim_object, prim_addr) :
+ object;
+ const int prim = kernel_tex_fetch(__prim_index, prim_addr);
+
switch (type & PRIMITIVE_ALL) {
case PRIMITIVE_TRIANGLE: {
hit = triangle_intersect(
- kg, &isect, P, dir, t_max_current, visibility, object, prim_addr);
+ kg, &isect, P, dir, t_max_current, visibility, prim_object, prim, prim_addr);
break;
}
#if BVH_FEATURE(BVH_MOTION)
case PRIMITIVE_MOTION_TRIANGLE: {
- hit = motion_triangle_intersect(
- kg, &isect, P, dir, t_max_current, ray->time, visibility, object, prim_addr);
+ hit = motion_triangle_intersect(kg,
+ &isect,
+ P,
+ dir,
+ t_max_current,
+ ray->time,
+ visibility,
+ prim_object,
+ prim,
+ prim_addr);
break;
}
#endif
@@ -182,20 +195,9 @@ ccl_device_inline
}
}
- const int curve_object = (object == OBJECT_NONE) ?
- kernel_tex_fetch(__prim_object, prim_addr) :
- object;
const int curve_type = kernel_tex_fetch(__prim_type, prim_addr);
- const int curve_prim = kernel_tex_fetch(__prim_index, prim_addr);
- hit = curve_intersect(kg,
- &isect,
- P,
- dir,
- t_max_current,
- curve_object,
- curve_prim,
- ray->time,
- curve_type);
+ hit = curve_intersect(
+ kg, &isect, P, dir, t_max_current, prim_object, prim, ray->time, curve_type);
break;
}
@@ -211,20 +213,9 @@ ccl_device_inline
}
}
- const int point_object = (object == OBJECT_NONE) ?
- kernel_tex_fetch(__prim_object, prim_addr) :
- object;
- const int point_prim = kernel_tex_fetch(__prim_index, prim_addr);
const int point_type = kernel_tex_fetch(__prim_type, prim_addr);
- hit = point_intersect(kg,
- &isect,
- P,
- dir,
- t_max_current,
- point_object,
- point_prim,
- ray->time,
- point_type);
+ hit = point_intersect(
+ kg, &isect, P, dir, t_max_current, prim_object, prim, ray->time, point_type);
break;
}
#endif /* BVH_FEATURE(BVH_POINTCLOUD) */
@@ -301,8 +292,6 @@ ccl_device_inline
integrator_state_write_shadow_isect(state, &isect, record_index);
}
}
-
- prim_addr++;
}
}
else {
diff --git a/intern/cycles/kernel/bvh/traversal.h b/intern/cycles/kernel/bvh/traversal.h
index e4bff1a8a80..dc2d1422df6 100644
--- a/intern/cycles/kernel/bvh/traversal.h
+++ b/intern/cycles/kernel/bvh/traversal.h
@@ -137,8 +137,14 @@ ccl_device_noinline bool BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals kg,
case PRIMITIVE_TRIANGLE: {
for (; prim_addr < prim_addr2; prim_addr++) {
kernel_assert(kernel_tex_fetch(__prim_type, prim_addr) == type);
+
+ const int prim_object = (object == OBJECT_NONE) ?
+ kernel_tex_fetch(__prim_object, prim_addr) :
+ object;
+ const int prim = kernel_tex_fetch(__prim_index, prim_addr);
+
if (triangle_intersect(
- kg, isect, P, dir, isect->t, visibility, object, prim_addr)) {
+ kg, isect, P, dir, isect->t, visibility, prim_object, prim, prim_addr)) {
/* shadow ray early termination */
if (visibility & PATH_RAY_SHADOW_OPAQUE)
return true;
@@ -150,8 +156,22 @@ ccl_device_noinline bool BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals kg,
case PRIMITIVE_MOTION_TRIANGLE: {
for (; prim_addr < prim_addr2; prim_addr++) {
kernel_assert(kernel_tex_fetch(__prim_type, prim_addr) == type);
- if (motion_triangle_intersect(
- kg, isect, P, dir, isect->t, ray->time, visibility, object, prim_addr)) {
+
+ const int prim_object = (object == OBJECT_NONE) ?
+ kernel_tex_fetch(__prim_object, prim_addr) :
+ object;
+ const int prim = kernel_tex_fetch(__prim_index, prim_addr);
+
+ if (motion_triangle_intersect(kg,
+ isect,
+ P,
+ dir,
+ isect->t,
+ ray->time,
+ visibility,
+ prim_object,
+ prim,
+ prim_addr)) {
/* shadow ray early termination */
if (visibility & PATH_RAY_SHADOW_OPAQUE)
return true;
@@ -173,13 +193,14 @@ ccl_device_noinline bool BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals kg,
}
}
- const int curve_object = (object == OBJECT_NONE) ?
- kernel_tex_fetch(__prim_object, prim_addr) :
-
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list