Cycles: Make regular bvh traversal functions close to each other
This commit is contained in:
@@ -108,7 +108,7 @@ bool BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals *kg,
|
|||||||
do {
|
do {
|
||||||
/* traverse internal nodes */
|
/* traverse internal nodes */
|
||||||
while(node_addr >= 0 && node_addr != ENTRYPOINT_SENTINEL) {
|
while(node_addr >= 0 && node_addr != ENTRYPOINT_SENTINEL) {
|
||||||
int node_addr_ahild1, traverse_mask;
|
int node_addr_child1, traverse_mask;
|
||||||
float dist[2];
|
float dist[2];
|
||||||
float4 cnodes = kernel_tex_fetch(__bvh_nodes, node_addr+0);
|
float4 cnodes = kernel_tex_fetch(__bvh_nodes, node_addr+0);
|
||||||
|
|
||||||
@@ -141,25 +141,25 @@ bool BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals *kg,
|
|||||||
#endif // __KERNEL_SSE2__
|
#endif // __KERNEL_SSE2__
|
||||||
|
|
||||||
node_addr = __float_as_int(cnodes.z);
|
node_addr = __float_as_int(cnodes.z);
|
||||||
node_addr_ahild1 = __float_as_int(cnodes.w);
|
node_addr_child1 = __float_as_int(cnodes.w);
|
||||||
|
|
||||||
if(traverse_mask == 3) {
|
if(traverse_mask == 3) {
|
||||||
/* Both children were intersected, push the farther one. */
|
/* Both children were intersected, push the farther one. */
|
||||||
bool is_closest_child1 = (dist[1] < dist[0]);
|
bool is_closest_child1 = (dist[1] < dist[0]);
|
||||||
if(is_closest_child1) {
|
if(is_closest_child1) {
|
||||||
int tmp = node_addr;
|
int tmp = node_addr;
|
||||||
node_addr = node_addr_ahild1;
|
node_addr = node_addr_child1;
|
||||||
node_addr_ahild1 = tmp;
|
node_addr_child1 = tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
++stack_ptr;
|
++stack_ptr;
|
||||||
kernel_assert(stack_ptr < BVH_STACK_SIZE);
|
kernel_assert(stack_ptr < BVH_STACK_SIZE);
|
||||||
traversal_stack[stack_ptr] = node_addr_ahild1;
|
traversal_stack[stack_ptr] = node_addr_child1;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* One child was intersected. */
|
/* One child was intersected. */
|
||||||
if(traverse_mask == 2) {
|
if(traverse_mask == 2) {
|
||||||
node_addr = node_addr_ahild1;
|
node_addr = node_addr_child1;
|
||||||
}
|
}
|
||||||
else if(traverse_mask == 0) {
|
else if(traverse_mask == 0) {
|
||||||
/* Neither child was intersected. */
|
/* Neither child was intersected. */
|
||||||
|
@@ -99,7 +99,7 @@ uint BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals *kg,
|
|||||||
ssef tsplat(0.0f, 0.0f, -isect_t, -isect_t);
|
ssef tsplat(0.0f, 0.0f, -isect_t, -isect_t);
|
||||||
|
|
||||||
gen_idirsplat_swap(pn, shuf_identity, shuf_swap, idir, idirsplat, shufflexyz);
|
gen_idirsplat_swap(pn, shuf_identity, shuf_swap, idir, idirsplat, shufflexyz);
|
||||||
#endif
|
#endif /* __KERNEL_SSE2__ */
|
||||||
|
|
||||||
IsectPrecalc isect_precalc;
|
IsectPrecalc isect_precalc;
|
||||||
triangle_intersect_precalc(dir, &isect_precalc);
|
triangle_intersect_precalc(dir, &isect_precalc);
|
||||||
@@ -378,7 +378,7 @@ uint BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals *kg,
|
|||||||
node_addr = traversal_stack[stack_ptr];
|
node_addr = traversal_stack[stack_ptr];
|
||||||
--stack_ptr;
|
--stack_ptr;
|
||||||
}
|
}
|
||||||
#endif /* FEATURE(BVH_MOTION) */
|
#endif /* FEATURE(BVH_INSTANCING) */
|
||||||
} while(node_addr != ENTRYPOINT_SENTINEL);
|
} while(node_addr != ENTRYPOINT_SENTINEL);
|
||||||
|
|
||||||
return num_hits;
|
return num_hits;
|
||||||
|
Reference in New Issue
Block a user