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. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs