[Bf-blender-cvs] [c6cfa45] cycles_bvh: Cycles: Hook up intersectors to non-SSE2 BVH traversal
Sergey Sharybin
noreply at git.blender.org
Fri Jun 17 16:21:57 CEST 2016
Commit: c6cfa45f67f7a9a60d1d2c650d611c326345c472
Author: Sergey Sharybin
Date: Fri Jun 17 14:26:03 2016 +0200
Branches: cycles_bvh
https://developer.blender.org/rBc6cfa45f67f7a9a60d1d2c650d611c326345c472
Cycles: Hook up intersectors to non-SSE2 BVH traversal
Seems to be passing regression tests on CPU. CUDA kernels also seems to work fine.
===================================================================
M intern/cycles/kernel/geom/geom_bvh_nodes.h
M intern/cycles/kernel/geom/geom_bvh_shadow.h
M intern/cycles/kernel/geom/geom_bvh_subsurface.h
M intern/cycles/kernel/geom/geom_bvh_traversal.h
M intern/cycles/kernel/geom/geom_bvh_volume.h
M intern/cycles/kernel/geom/geom_bvh_volume_all.h
===================================================================
diff --git a/intern/cycles/kernel/geom/geom_bvh_nodes.h b/intern/cycles/kernel/geom/geom_bvh_nodes.h
index f7b9cec..c622d7a 100644
--- a/intern/cycles/kernel/geom/geom_bvh_nodes.h
+++ b/intern/cycles/kernel/geom/geom_bvh_nodes.h
@@ -273,14 +273,14 @@ ccl_device_inline int bvh_unaligned_node_intersect_robust(KernelGlobals *kg,
return mask;
}
-ccl_device_inline int bvh_curve_intersect_node(KernelGlobals *kg,
- const float3 P,
- const float3 dir,
- const float3 idir,
- const float t,
- const uint visibility,
- int nodeAddr,
- float dist[2])
+ccl_device_inline int bvh_node_intersect(KernelGlobals *kg,
+ const float3 P,
+ const float3 dir,
+ const float3 idir,
+ const float t,
+ const uint visibility,
+ int nodeAddr,
+ float dist[2])
{
float4 node = kernel_tex_fetch(__bvh_nodes, nodeAddr);
if(__float_as_uint(node.x) & PATH_RAY_NODE_UNALIGNED) {
@@ -304,15 +304,15 @@ ccl_device_inline int bvh_curve_intersect_node(KernelGlobals *kg,
}
}
-ccl_device_inline int bvh_curve_intersect_node_robust(KernelGlobals *kg,
- const float3 P,
- const float3 dir,
- const float3 idir,
- const float t,
- const float difl,
- const uint visibility,
- int nodeAddr,
- float dist[2])
+ccl_device_inline int bvh_node_intersect_robust(KernelGlobals *kg,
+ const float3 P,
+ const float3 dir,
+ const float3 idir,
+ const float t,
+ const float difl,
+ const uint visibility,
+ int nodeAddr,
+ float dist[2])
{
float4 node = kernel_tex_fetch(__bvh_nodes, nodeAddr);
if(__float_as_uint(node.x) & PATH_RAY_NODE_UNALIGNED) {
@@ -458,14 +458,14 @@ int ccl_device_inline bvh_aligned_node_intersect_robust(
# endif
}
-int ccl_device bvh_unaligned_node_intersect(KernelGlobals *kg,
- const float3 P,
- const float3 dir,
- const ssef& tnear,
- const ssef& tfar,
- const uint visibility,
- int nodeAddr,
- float dist[2])
+int ccl_device_inline bvh_unaligned_node_intersect(KernelGlobals *kg,
+ const float3 P,
+ const float3 dir,
+ const ssef& tnear,
+ const ssef& tfar,
+ const uint visibility,
+ int nodeAddr,
+ float dist[2])
{
Transform space0 = bvh_unaligned_node_fetch_space(kg, nodeAddr, 0);
Transform space1 = bvh_unaligned_node_fetch_space(kg, nodeAddr, 1);
@@ -519,15 +519,15 @@ int ccl_device bvh_unaligned_node_intersect(KernelGlobals *kg,
# endif
}
-int ccl_device bvh_unaligned_node_intersect_robust(KernelGlobals *kg,
- const float3 P,
- const float3 dir,
- const ssef& tnear,
- const ssef& tfar,
- const float difl,
- const uint visibility,
- int nodeAddr,
- float dist[2])
+int ccl_device_inline bvh_unaligned_node_intersect_robust(KernelGlobals *kg,
+ const float3 P,
+ const float3 dir,
+ const ssef& tnear,
+ const ssef& tfar,
+ const float difl,
+ const uint visibility,
+ int nodeAddr,
+ float dist[2])
{
Transform space0 = bvh_unaligned_node_fetch_space(kg, nodeAddr, 0);
Transform space1 = bvh_unaligned_node_fetch_space(kg, nodeAddr, 1);
diff --git a/intern/cycles/kernel/geom/geom_bvh_shadow.h b/intern/cycles/kernel/geom/geom_bvh_shadow.h
index 0d4e9cf..cbc92c0 100644
--- a/intern/cycles/kernel/geom/geom_bvh_shadow.h
+++ b/intern/cycles/kernel/geom/geom_bvh_shadow.h
@@ -100,6 +100,14 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals *kg,
float4 cnodes = kernel_tex_fetch(__bvh_nodes, nodeAddr+0);
#if !defined(__KERNEL_SSE2__)
+ traverse_mask = bvh_node_intersect(kg,
+ P,
+ dir,
+ idir,
+ isect_t,
+ PATH_RAY_SHADOW,
+ nodeAddr,
+ dist);
#else // __KERNEL_SSE2__
traverse_mask = bvh_node_intersect(kg,
P,
diff --git a/intern/cycles/kernel/geom/geom_bvh_subsurface.h b/intern/cycles/kernel/geom/geom_bvh_subsurface.h
index 514c0f4..f42cca0 100644
--- a/intern/cycles/kernel/geom/geom_bvh_subsurface.h
+++ b/intern/cycles/kernel/geom/geom_bvh_subsurface.h
@@ -109,6 +109,14 @@ ccl_device void BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals *kg,
float4 cnodes = kernel_tex_fetch(__bvh_nodes, nodeAddr+0);
#if !defined(__KERNEL_SSE2__)
+ traverse_mask = bvh_node_intersect(kg,
+ P,
+ dir,
+ idir,
+ isect_t,
+ PATH_RAY_ALL_VISIBILITY,
+ nodeAddr,
+ dist);
#else // __KERNEL_SSE2__
traverse_mask = bvh_node_intersect(kg,
P,
diff --git a/intern/cycles/kernel/geom/geom_bvh_traversal.h b/intern/cycles/kernel/geom/geom_bvh_traversal.h
index add8fce..c6c41b5 100644
--- a/intern/cycles/kernel/geom/geom_bvh_traversal.h
+++ b/intern/cycles/kernel/geom/geom_bvh_traversal.h
@@ -109,10 +109,27 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals *kg,
#if !defined(__KERNEL_SSE2__)
# if BVH_FEATURE(BVH_HAIR_MINIMUM_WIDTH)
if(difl != 0.0f) {
+ traverse_mask = bvh_node_intersect_robust(kg,
+ P,
+ dir,
+ idir,
+ isect->t,
+ difl,
+ visibility,
+ nodeAddr,
+ dist);
}
else
# endif
{
+ traverse_mask = bvh_node_intersect(kg,
+ P,
+ dir,
+ idir,
+ isect->t,
+ visibility,
+ nodeAddr,
+ dist);
}
#else // __KERNEL_SSE2__
# if BVH_FEATURE(BVH_HAIR_MINIMUM_WIDTH)
diff --git a/intern/cycles/kernel/geom/geom_bvh_volume.h b/intern/cycles/kernel/geom/geom_bvh_volume.h
index 31dd238..7da8b7e 100644
--- a/intern/cycles/kernel/geom/geom_bvh_volume.h
+++ b/intern/cycles/kernel/geom/geom_bvh_volume.h
@@ -97,6 +97,14 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals *kg,
float4 cnodes = kernel_tex_fetch(__bvh_nodes, nodeAddr+0);
#if !defined(__KERNEL_SSE2__)
+ traverse_mask = bvh_node_intersect(kg,
+ P,
+ dir,
+ idir,
+ isect->t,
+ visibility,
+ nodeAddr,
+ dist);
#else // __KERNEL_SSE2__
traverse_mask = bvh_node_intersect(kg,
P,
diff --git a/intern/cycles/kernel/geom/geom_bvh_volume_all.h b/intern/cycles/kernel/geom/geom_bvh_volume_all.h
index 13c54d1..07b12b8 100644
--- a/intern/cycles/kernel/geom/geom_bvh_volume_all.h
+++ b/intern/cycles/kernel/geom/geom_bvh_volume_all.h
@@ -101,6 +101,14 @@ ccl_device uint BVH_FU
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list