Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2015-01-15 23:38:54 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2015-01-15 23:42:58 +0300
commit146eb7947ef4e660849e51bc070761fbed322f31 (patch)
tree2b73c29568a2ee054df782099c6ef22479934484 /intern/cycles/bvh/bvh_build.cpp
parentf02dba58ff5887d416460779ecbe92c40d3522f1 (diff)
Cycles: Tweak to leaf creation criteria in all BVH types
Since leaf node gets split further into per-primitive type leaves old check for number of curves became a bit ridiculous -- it might lead to two leaf nodes each of which would contain only one curve primitive (one motion curve and one regular curve). This lead to quite dramatic slowdown for Victor model -- around 40%, which is totally unacceptable. This commit is aimed to prevent such situation and from quick render test it seems victor is now back to normal render time. Further testing is needed tho. There are also other ideas about splitting the node, will need to look into them next.
Diffstat (limited to 'intern/cycles/bvh/bvh_build.cpp')
-rw-r--r--intern/cycles/bvh/bvh_build.cpp9
1 files changed, 7 insertions, 2 deletions
diff --git a/intern/cycles/bvh/bvh_build.cpp b/intern/cycles/bvh/bvh_build.cpp
index da263c4945e..3f56be0c538 100644
--- a/intern/cycles/bvh/bvh_build.cpp
+++ b/intern/cycles/bvh/bvh_build.cpp
@@ -329,17 +329,22 @@ bool BVHBuild::range_within_max_leaf_size(const BVHRange& range)
size_t num_triangles = 0;
size_t num_curves = 0;
+ size_t num_motion_curves = 0;
for(int i = 0; i < size; i++) {
BVHReference& ref = references[range.start() + i];
- if(ref.prim_type() & PRIMITIVE_ALL_CURVE)
+ if(ref.prim_type() & PRIMITIVE_CURVE)
num_curves++;
+ if(ref.prim_type() & PRIMITIVE_MOTION_CURVE)
+ num_motion_curves++;
else if(ref.prim_type() & PRIMITIVE_ALL_TRIANGLE)
num_triangles++;
}
- return (num_triangles < params.max_triangle_leaf_size) && (num_curves < params.max_curve_leaf_size);
+ return (num_triangles < params.max_triangle_leaf_size) &&
+ (num_curves < params.max_curve_leaf_size);
+ (num_motion_curves < params.max_curve_leaf_size);
}
/* multithreaded binning builder */