From 92fd83a7667fe13f339405e3b85493b23ade9a7c Mon Sep 17 00:00:00 2001 From: Nathan Vegdahl Date: Sun, 16 Apr 2017 17:22:51 -0700 Subject: [PATCH] Actually using the None match arm in BVH4 traversal now. It seems to maybe be just a hair faster. But, also, it sets the code up to try some more optimizations. --- src/accel/bvh4.rs | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/accel/bvh4.rs b/src/accel/bvh4.rs index 79b338e..0c33f4d 100644 --- a/src/accel/bvh4.rs +++ b/src/accel/bvh4.rs @@ -108,6 +108,8 @@ impl<'a> BVH4<'a> { let noc3 = (node_order_code >> 4) & 3; let noc4 = (node_order_code >> 6) & 3; + let mut all_hits = 0; + // Ray testing let part = partition(&mut rays[..ray_i_stack[stack_ptr]], |r| { if (!r.is_done()) && (first_loop || r.trav_stack.pop()) { @@ -115,6 +117,8 @@ impl<'a> BVH4<'a> { .intersect_accel_ray(r) .to_bitmask(); + all_hits |= hits; + if hits != 0 { // Push hit bits onto ray's traversal stack let shuffled_hits = match children.len() { @@ -142,9 +146,13 @@ impl<'a> BVH4<'a> { if part > 0 { for i in 0..children.len() { let inv_i = (children.len() - 1) - i; - node_stack[stack_ptr + i] = - Some(&children[((node_order_code >> (inv_i * 2)) & 3) as - usize]); + let child_i = ((node_order_code >> (inv_i * 2)) & 3) as usize; + node_stack[stack_ptr + i] = if ((all_hits >> child_i) & 1) == + 0 { + None + } else { + Some(&children[child_i]) + }; ray_i_stack[stack_ptr + i] = part; }