bvh_builder_sah.cpp 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559
  1. // ======================================================================== //
  2. // Copyright 2009-2017 Intel Corporation //
  3. // //
  4. // Licensed under the Apache License, Version 2.0 (the "License"); //
  5. // you may not use this file except in compliance with the License. //
  6. // You may obtain a copy of the License at //
  7. // //
  8. // http://www.apache.org/licenses/LICENSE-2.0 //
  9. // //
  10. // Unless required by applicable law or agreed to in writing, software //
  11. // distributed under the License is distributed on an "AS IS" BASIS, //
  12. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //
  13. // See the License for the specific language governing permissions and //
  14. // limitations under the License. //
  15. // ======================================================================== //
  16. #include "bvh.h"
  17. #include "bvh_builder.h"
  18. #include "../builders/primrefgen.h"
  19. #include "../builders/splitter.h"
  20. #include "../geometry/bezier1v.h"
  21. #include "../geometry/bezier1i.h"
  22. #include "../geometry/linei.h"
  23. #include "../geometry/triangle.h"
  24. #include "../geometry/trianglev.h"
  25. #include "../geometry/trianglei.h"
  26. #include "../geometry/trianglev_mb.h"
  27. #include "../geometry/trianglei_mb.h"
  28. #include "../geometry/quadv.h"
  29. #include "../geometry/quadi.h"
  30. #include "../geometry/quadi_mb.h"
  31. #include "../geometry/object.h"
  32. #include "../common/state.h"
  33. #define PROFILE 0
  34. #define PROFILE_RUNS 20
  35. namespace embree
  36. {
  37. namespace isa
  38. {
  39. MAYBE_UNUSED static const float travCost = 1.0f;
  40. MAYBE_UNUSED static const size_t DEFAULT_SINGLE_THREAD_THRESHOLD = 1024;
  41. MAYBE_UNUSED static const size_t HIGH_SINGLE_THREAD_THRESHOLD = 3*1024;
  42. typedef FastAllocator::ThreadLocal2 Allocator;
  43. template<int N, typename Primitive>
  44. struct CreateLeaf
  45. {
  46. typedef BVHN<N> BVH;
  47. typedef typename BVH::NodeRef NodeRef;
  48. __forceinline CreateLeaf (BVH* bvh, PrimRef* prims) : bvh(bvh), prims(prims) {}
  49. template<typename BuildRecord>
  50. __forceinline NodeRef operator() (const BuildRecord& current, Allocator* alloc) const
  51. {
  52. size_t n = current.prims.size();
  53. size_t items = Primitive::blocks(n);
  54. size_t start = current.prims.begin();
  55. Primitive* accel = (Primitive*) alloc->alloc1->malloc(items*sizeof(Primitive),BVH::byteAlignment);
  56. typename BVH::NodeRef node = BVH::encodeLeaf((char*)accel,items);
  57. for (size_t i=0; i<items; i++) {
  58. accel[i].fill(prims,start,current.prims.end(),bvh->scene);
  59. }
  60. return node;
  61. }
  62. BVH* bvh;
  63. PrimRef* prims;
  64. };
  65. template<int N, typename Primitive>
  66. struct CreateLeafQuantized
  67. {
  68. typedef BVHN<N> BVH;
  69. typedef typename BVH::NodeRef NodeRef;
  70. __forceinline CreateLeafQuantized (BVH* bvh, PrimRef* prims) : bvh(bvh), prims(prims) {}
  71. __forceinline NodeRef operator() (const BVHBuilderBinnedSAH::BuildRecord& current, Allocator* alloc) const
  72. {
  73. size_t n = current.prims.size();
  74. size_t items = Primitive::blocks(n);
  75. size_t start = current.prims.begin();
  76. Primitive* accel = (Primitive*) alloc->alloc1->malloc(items*sizeof(Primitive),BVH::byteAlignment);
  77. typename BVH::NodeRef node = BVH::encodeLeaf((char*)accel,items);
  78. for (size_t i=0; i<items; i++) {
  79. accel[i].fill(prims,start,current.prims.end(),bvh->scene);
  80. }
  81. return node;
  82. }
  83. BVH* bvh;
  84. PrimRef* prims;
  85. };
  86. /************************************************************************************/
  87. /************************************************************************************/
  88. /************************************************************************************/
  89. /************************************************************************************/
  90. template<int N, typename Mesh, typename Primitive>
  91. struct BVHNBuilderSAH : public Builder
  92. {
  93. typedef BVHN<N> BVH;
  94. typedef typename BVHN<N>::NodeRef NodeRef;
  95. BVH* bvh;
  96. Scene* scene;
  97. Mesh* mesh;
  98. mvector<PrimRef> prims;
  99. GeneralBVHBuilder::Settings settings;
  100. BVHNBuilderSAH (BVH* bvh, Scene* scene, const size_t sahBlockSize, const float intCost, const size_t minLeafSize, const size_t maxLeafSize,
  101. const size_t mode, const size_t singleThreadThreshold = DEFAULT_SINGLE_THREAD_THRESHOLD)
  102. : bvh(bvh), scene(scene), mesh(nullptr), prims(scene->device), settings(sahBlockSize, minLeafSize, min(maxLeafSize,Primitive::max_size()*BVH::maxLeafBlocks), travCost, intCost, singleThreadThreshold) {}
  103. BVHNBuilderSAH (BVH* bvh, Mesh* mesh, const size_t sahBlockSize, const float intCost, const size_t minLeafSize, const size_t maxLeafSize,
  104. const size_t mode, const size_t singleThreadThreshold = DEFAULT_SINGLE_THREAD_THRESHOLD)
  105. : bvh(bvh), scene(nullptr), mesh(mesh), prims(bvh->device), settings(sahBlockSize, minLeafSize, min(maxLeafSize,Primitive::max_size()*BVH::maxLeafBlocks), travCost, intCost, singleThreadThreshold) {}
  106. // FIXME: shrink bvh->alloc in destructor here and in other builders too
  107. void build()
  108. {
  109. /* we reset the allocator when the mesh size changed */
  110. if (mesh && mesh->numPrimitivesChanged) {
  111. bvh->alloc.clear();
  112. mesh->numPrimitivesChanged = false;
  113. }
  114. /* skip build for empty scene */
  115. const size_t numPrimitives = mesh ? mesh->size() : scene->getNumPrimitives<Mesh,false>();
  116. if (numPrimitives == 0) {
  117. prims.clear();
  118. bvh->clear();
  119. return;
  120. }
  121. double t0 = bvh->preBuild(mesh ? "" : TOSTRING(isa) "::BVH" + toString(N) + "BuilderSAH");
  122. #if PROFILE
  123. profile(2,PROFILE_RUNS,numPrimitives,[&] (ProfileTimer& timer) {
  124. #endif
  125. /* create primref array */
  126. prims.resize(numPrimitives);
  127. PrimInfo pinfo = mesh ?
  128. createPrimRefArray<Mesh> (mesh ,prims,bvh->scene->progressInterface) :
  129. createPrimRefArray<Mesh,false>(scene,prims,bvh->scene->progressInterface);
  130. /* pinfo might has zero size due to invalid geometry */
  131. if (unlikely(pinfo.size() == 0))
  132. {
  133. prims.clear();
  134. bvh->clear();
  135. return;
  136. }
  137. /* call BVH builder */
  138. bvh->alloc.init_estimate(pinfo.size()*sizeof(PrimRef),settings.singleThreadThreshold != DEFAULT_SINGLE_THREAD_THRESHOLD);
  139. NodeRef root = BVHNBuilderVirtual<N>::build(&bvh->alloc,CreateLeaf<N,Primitive>(bvh,prims.data()),bvh->scene->progressInterface,prims.data(),pinfo,settings);
  140. bvh->set(root,LBBox3fa(pinfo.geomBounds),pinfo.size());
  141. bvh->layoutLargeNodes(size_t(pinfo.size()*0.005f));
  142. #if PROFILE
  143. });
  144. #endif
  145. /* clear temporary data for static geometry */
  146. bool staticGeom = mesh ? mesh->isStatic() : scene->isStatic();
  147. if (staticGeom) {
  148. #if 0
  149. bvh->primrefs = std::move(prims);
  150. #else
  151. prims.clear();
  152. bvh->shrink();
  153. #endif
  154. }
  155. bvh->cleanup();
  156. bvh->postBuild(t0);
  157. }
  158. void clear() {
  159. prims.clear();
  160. }
  161. };
  162. /************************************************************************************/
  163. /************************************************************************************/
  164. /************************************************************************************/
  165. /************************************************************************************/
  166. template<int N, typename Mesh, typename Primitive>
  167. struct BVHNBuilderSAHQuantized : public Builder
  168. {
  169. typedef BVHN<N> BVH;
  170. typedef typename BVHN<N>::NodeRef NodeRef;
  171. BVH* bvh;
  172. Scene* scene;
  173. Mesh* mesh;
  174. mvector<PrimRef> prims;
  175. GeneralBVHBuilder::Settings settings;
  176. BVHNBuilderSAHQuantized (BVH* bvh, Scene* scene, const size_t sahBlockSize, const float intCost, const size_t minLeafSize, const size_t maxLeafSize, const size_t mode, const size_t singleThreadThreshold = DEFAULT_SINGLE_THREAD_THRESHOLD)
  177. : bvh(bvh), scene(scene), mesh(nullptr), prims(scene->device), settings(sahBlockSize, minLeafSize, min(maxLeafSize,Primitive::max_size()*BVH::maxLeafBlocks), travCost, intCost, singleThreadThreshold) {}
  178. BVHNBuilderSAHQuantized (BVH* bvh, Mesh* mesh, const size_t sahBlockSize, const float intCost, const size_t minLeafSize, const size_t maxLeafSize, const size_t mode, const size_t singleThreadThreshold = DEFAULT_SINGLE_THREAD_THRESHOLD)
  179. : bvh(bvh), scene(nullptr), mesh(mesh), prims(bvh->device), settings(sahBlockSize, minLeafSize, min(maxLeafSize,Primitive::max_size()*BVH::maxLeafBlocks), travCost, intCost, singleThreadThreshold) {}
  180. // FIXME: shrink bvh->alloc in destructor here and in other builders too
  181. void build()
  182. {
  183. /* we reset the allocator when the mesh size changed */
  184. if (mesh && mesh->numPrimitivesChanged) {
  185. bvh->alloc.clear();
  186. mesh->numPrimitivesChanged = false;
  187. }
  188. /* skip build for empty scene */
  189. const size_t numPrimitives = mesh ? mesh->size() : scene->getNumPrimitives<Mesh,false>();
  190. if (numPrimitives == 0) {
  191. prims.clear();
  192. bvh->clear();
  193. return;
  194. }
  195. double t0 = bvh->preBuild(mesh ? "" : TOSTRING(isa) "::QBVH" + toString(N) + "BuilderSAH");
  196. #if PROFILE
  197. profile(2,PROFILE_RUNS,numPrimitives,[&] (ProfileTimer& timer) {
  198. #endif
  199. /* create primref array */
  200. prims.resize(numPrimitives);
  201. PrimInfo pinfo = mesh ?
  202. createPrimRefArray<Mesh> (mesh ,prims,bvh->scene->progressInterface) :
  203. createPrimRefArray<Mesh,false>(scene,prims,bvh->scene->progressInterface);
  204. /* call BVH builder */
  205. bvh->alloc.init_estimate(pinfo.size()*sizeof(PrimRef),settings.singleThreadThreshold != DEFAULT_SINGLE_THREAD_THRESHOLD);
  206. NodeRef root = BVHNBuilderQuantizedVirtual<N>::build(&bvh->alloc,CreateLeafQuantized<N,Primitive>(bvh,prims.data()),bvh->scene->progressInterface,prims.data(),pinfo,settings);
  207. bvh->set(root,LBBox3fa(pinfo.geomBounds),pinfo.size());
  208. //bvh->layoutLargeNodes(pinfo.size()*0.005f); // FIXME: COPY LAYOUT FOR LARGE NODES !!!
  209. #if PROFILE
  210. });
  211. #endif
  212. /* clear temporary data for static geometry */
  213. bool staticGeom = mesh ? mesh->isStatic() : scene->isStatic();
  214. if (staticGeom) {
  215. prims.clear();
  216. bvh->shrink();
  217. }
  218. bvh->cleanup();
  219. bvh->postBuild(t0);
  220. }
  221. void clear() {
  222. prims.clear();
  223. }
  224. };
  225. /************************************************************************************/
  226. /************************************************************************************/
  227. /************************************************************************************/
  228. /************************************************************************************/
  229. template<int N, typename Primitive>
  230. struct CreateMSMBlurLeaf
  231. {
  232. typedef BVHN<N> BVH;
  233. typedef typename BVH::NodeRef NodeRef;
  234. __forceinline CreateMSMBlurLeaf (BVH* bvh, PrimRef* prims, size_t time) : bvh(bvh), prims(prims), time(time) {}
  235. __forceinline std::pair<NodeRef,LBBox3fa> operator() (const BVHBuilderBinnedSAH::BuildRecord& current, Allocator* alloc) const
  236. {
  237. size_t items = Primitive::blocks(current.prims.size());
  238. size_t start = current.prims.begin();
  239. Primitive* accel = (Primitive*) alloc->alloc1->malloc(items*sizeof(Primitive),BVH::byteAlignment);
  240. NodeRef node = bvh->encodeLeaf((char*)accel,items);
  241. LBBox3fa allBounds = empty;
  242. for (size_t i=0; i<items; i++)
  243. allBounds.extend(accel[i].fillMB(prims, start, current.prims.end(), bvh->scene, time, bvh->numTimeSteps));
  244. return std::make_pair(node,allBounds);
  245. }
  246. BVH* bvh;
  247. PrimRef* prims;
  248. size_t time;
  249. };
  250. template<int N, typename Mesh, typename Primitive>
  251. struct BVHNBuilderMSMBlurSAH : public Builder
  252. {
  253. typedef BVHN<N> BVH;
  254. typedef typename BVHN<N>::NodeRef NodeRef;
  255. BVH* bvh;
  256. Scene* scene;
  257. mvector<PrimRef> prims;
  258. GeneralBVHBuilder::Settings settings;
  259. BVHNBuilderMSMBlurSAH (BVH* bvh, Scene* scene, const size_t sahBlockSize, const float intCost, const size_t minLeafSize, const size_t maxLeafSize, const size_t singleThreadThreshold = DEFAULT_SINGLE_THREAD_THRESHOLD)
  260. : bvh(bvh), scene(scene), prims(scene->device), settings(sahBlockSize, minLeafSize, min(maxLeafSize,Primitive::max_size()*BVH::maxLeafBlocks), travCost, intCost, singleThreadThreshold) {}
  261. void build()
  262. {
  263. /* skip build for empty scene */
  264. const size_t numPrimitives = scene->getNumPrimitives<Mesh,true>();
  265. if (numPrimitives == 0) {
  266. prims.clear();
  267. bvh->clear();
  268. return;
  269. }
  270. double t0 = bvh->preBuild(TOSTRING(isa) "::BVH" + toString(N) + "BuilderMSMBlurSAH");
  271. /* allocate buffers */
  272. bvh->numTimeSteps = scene->getNumTimeSteps<Mesh,true>();
  273. const size_t numTimeSegments = bvh->numTimeSteps-1; assert(bvh->numTimeSteps > 1);
  274. prims.resize(numPrimitives);
  275. bvh->alloc.init_estimate(numPrimitives*sizeof(PrimRef)*numTimeSegments,settings.singleThreadThreshold != DEFAULT_SINGLE_THREAD_THRESHOLD);
  276. NodeRef* roots = (NodeRef*) bvh->alloc.threadLocal()->malloc(sizeof(NodeRef)*numTimeSegments,BVH::byteNodeAlignment);
  277. /* build BVH for each timestep */
  278. avector<BBox3fa> bounds(bvh->numTimeSteps);
  279. size_t num_bvh_primitives = 0;
  280. for (size_t t=0; t<numTimeSegments; t++)
  281. {
  282. /* call BVH builder */
  283. NodeRef root; LBBox3fa tbounds;
  284. const PrimInfo pinfo = createPrimRefArrayMBlur<Mesh>(t,bvh->numTimeSteps,scene,prims,bvh->scene->progressInterface);
  285. if (pinfo.size()) {
  286. std::tie(root, tbounds) = BVHNBuilderMblurVirtual<N>::build(&bvh->alloc,CreateMSMBlurLeaf<N,Primitive>(bvh,prims.data(),t),bvh->scene->progressInterface,prims.data(),pinfo,settings);
  287. } else {
  288. tbounds = LBBox3fa(empty);
  289. root = BVH::emptyNode;
  290. }
  291. roots[t] = root;
  292. bounds[t+0] = tbounds.bounds0;
  293. bounds[t+1] = tbounds.bounds1;
  294. num_bvh_primitives = max(num_bvh_primitives,pinfo.size());
  295. }
  296. bvh->set(NodeRef((size_t)roots),LBBox3fa(bounds),num_bvh_primitives);
  297. bvh->msmblur = true;
  298. /* clear temporary data for static geometry */
  299. if (scene->isStatic())
  300. {
  301. prims.clear();
  302. bvh->shrink();
  303. }
  304. bvh->cleanup();
  305. bvh->postBuild(t0);
  306. }
  307. void clear() {
  308. prims.clear();
  309. }
  310. };
  311. /************************************************************************************/
  312. /************************************************************************************/
  313. /************************************************************************************/
  314. /************************************************************************************/
  315. template<int N, typename Mesh, typename Primitive, typename Splitter>
  316. struct BVHNBuilderFastSpatialSAH : public Builder
  317. {
  318. typedef BVHN<N> BVH;
  319. typedef typename BVH::NodeRef NodeRef;
  320. BVH* bvh;
  321. Scene* scene;
  322. Mesh* mesh;
  323. mvector<PrimRef> prims0;
  324. GeneralBVHBuilder::Settings settings;
  325. const float splitFactor;
  326. BVHNBuilderFastSpatialSAH (BVH* bvh, Scene* scene, const size_t sahBlockSize, const float intCost, const size_t minLeafSize, const size_t maxLeafSize, const size_t mode, const size_t singleThreadThreshold = DEFAULT_SINGLE_THREAD_THRESHOLD)
  327. : bvh(bvh), scene(scene), mesh(nullptr), prims0(scene->device), settings(sahBlockSize, minLeafSize, min(maxLeafSize,Primitive::max_size()*BVH::maxLeafBlocks), travCost, intCost, singleThreadThreshold),
  328. splitFactor(scene->device->max_spatial_split_replications) {}
  329. BVHNBuilderFastSpatialSAH (BVH* bvh, Mesh* mesh, const size_t sahBlockSize, const float intCost, const size_t minLeafSize, const size_t maxLeafSize, const size_t mode, const size_t singleThreadThreshold = DEFAULT_SINGLE_THREAD_THRESHOLD)
  330. : bvh(bvh), scene(nullptr), mesh(mesh), prims0(bvh->device), settings(sahBlockSize, minLeafSize, min(maxLeafSize,Primitive::max_size()*BVH::maxLeafBlocks), travCost, intCost, singleThreadThreshold),
  331. splitFactor(scene->device->max_spatial_split_replications) {}
  332. // FIXME: shrink bvh->alloc in destructor here and in other builders too
  333. void build()
  334. {
  335. /* we reset the allocator when the mesh size changed */
  336. if (mesh && mesh->numPrimitivesChanged) {
  337. bvh->alloc.clear();
  338. mesh->numPrimitivesChanged = false;
  339. }
  340. /* skip build for empty scene */
  341. const size_t numOriginalPrimitives = mesh ? mesh->size() : scene->getNumPrimitives<Mesh,false>();
  342. if (numOriginalPrimitives == 0) {
  343. prims0.clear();
  344. bvh->clear();
  345. return;
  346. }
  347. double t0 = bvh->preBuild(mesh ? "" : TOSTRING(isa) "::BVH" + toString(N) + "BuilderFastSpatialSAH");
  348. /* create primref array */
  349. const size_t numSplitPrimitives = max(numOriginalPrimitives,size_t(splitFactor*numOriginalPrimitives));
  350. prims0.resize(numSplitPrimitives);
  351. PrimInfo pinfo = mesh ?
  352. createPrimRefArray<Mesh> (mesh ,prims0,bvh->scene->progressInterface) :
  353. createPrimRefArray<Mesh,false>(scene,prims0,bvh->scene->progressInterface);
  354. Splitter splitter(scene);
  355. bvh->alloc.init_estimate(pinfo.size()*sizeof(PrimRef));
  356. settings.branchingFactor = N;
  357. settings.maxDepth = BVH::maxBuildDepthLeaf;
  358. NodeRef root = BVHBuilderBinnedFastSpatialSAH::build<NodeRef>(
  359. typename BVH::CreateAlloc(bvh),
  360. typename BVH::AlignedNode::Create2(),
  361. typename BVH::AlignedNode::Set2(),
  362. CreateLeaf<N,Primitive>(bvh,prims0.data()),
  363. splitter,
  364. bvh->scene->progressInterface,
  365. prims0.data(),
  366. numSplitPrimitives,
  367. pinfo,settings);
  368. bvh->set(root,LBBox3fa(pinfo.geomBounds),pinfo.size());
  369. bvh->layoutLargeNodes(size_t(pinfo.size()*0.005f));
  370. /* clear temporary data for static geometry */
  371. bool staticGeom = mesh ? mesh->isStatic() : scene->isStatic();
  372. if (staticGeom) {
  373. prims0.clear();
  374. bvh->shrink();
  375. }
  376. bvh->cleanup();
  377. bvh->postBuild(t0);
  378. }
  379. void clear() {
  380. prims0.clear();
  381. }
  382. };
  383. /************************************************************************************/
  384. /************************************************************************************/
  385. /************************************************************************************/
  386. /************************************************************************************/
  387. #if defined(EMBREE_GEOMETRY_LINES)
  388. Builder* BVH4Line4iMeshBuilderSAH (void* bvh, LineSegments* mesh, size_t mode) { return new BVHNBuilderSAH<4,LineSegments,Line4i>((BVH4*)bvh,mesh,4,1.0f,4,inf,mode,HIGH_SINGLE_THREAD_THRESHOLD); }
  389. Builder* BVH4Line4iSceneBuilderSAH (void* bvh, Scene* scene, size_t mode) { return new BVHNBuilderSAH<4,LineSegments,Line4i>((BVH4*)bvh,scene,4,1.0f,4,inf,mode,HIGH_SINGLE_THREAD_THRESHOLD); }
  390. Builder* BVH4Line4iMBSceneBuilderSAH (void* bvh, Scene* scene, size_t mode) { return new BVHNBuilderMSMBlurSAH<4,LineSegments,Line4i>((BVH4*)bvh,scene ,4,1.0f,4,inf,HIGH_SINGLE_THREAD_THRESHOLD); }
  391. #if defined(__AVX__)
  392. Builder* BVH8Line4iSceneBuilderSAH (void* bvh, Scene* scene, size_t mode) { return new BVHNBuilderSAH<8,LineSegments,Line4i>((BVH8*)bvh,scene,4,1.0f,4,inf,mode,HIGH_SINGLE_THREAD_THRESHOLD); }
  393. Builder* BVH8Line4iMBSceneBuilderSAH (void* bvh, Scene* scene, size_t mode) { return new BVHNBuilderMSMBlurSAH<8,LineSegments,Line4i>((BVH8*)bvh,scene,4,1.0f,4,inf,HIGH_SINGLE_THREAD_THRESHOLD); }
  394. #endif
  395. #endif
  396. #if defined(EMBREE_GEOMETRY_HAIR)
  397. Builder* BVH4Bezier1vSceneBuilderSAH (void* bvh, Scene* scene, size_t mode) { return new BVHNBuilderSAH<4,NativeCurves,Bezier1v>((BVH4*)bvh,scene,1,1.0f,1,inf,mode,HIGH_SINGLE_THREAD_THRESHOLD); }
  398. Builder* BVH4Bezier1iSceneBuilderSAH (void* bvh, Scene* scene, size_t mode) { return new BVHNBuilderSAH<4,NativeCurves,Bezier1i>((BVH4*)bvh,scene,1,1.0f,1,inf,mode,HIGH_SINGLE_THREAD_THRESHOLD); }
  399. #endif
  400. #if defined(EMBREE_GEOMETRY_TRIANGLES)
  401. Builder* BVH4Triangle4MeshBuilderSAH (void* bvh, TriangleMesh* mesh, size_t mode) { return new BVHNBuilderSAH<4,TriangleMesh,Triangle4>((BVH4*)bvh,mesh,4,1.0f,4,inf,mode); }
  402. Builder* BVH4Triangle4vMeshBuilderSAH (void* bvh, TriangleMesh* mesh, size_t mode) { return new BVHNBuilderSAH<4,TriangleMesh,Triangle4v>((BVH4*)bvh,mesh,4,1.0f,4,inf,mode); }
  403. Builder* BVH4Triangle4iMeshBuilderSAH (void* bvh, TriangleMesh* mesh, size_t mode) { return new BVHNBuilderSAH<4,TriangleMesh,Triangle4i>((BVH4*)bvh,mesh,4,1.0f,4,inf,mode); }
  404. Builder* BVH4Triangle4SceneBuilderSAH (void* bvh, Scene* scene, size_t mode) { return new BVHNBuilderSAH<4,TriangleMesh,Triangle4>((BVH4*)bvh,scene,4,1.0f,4,inf,mode); }
  405. Builder* BVH4Triangle4vSceneBuilderSAH (void* bvh, Scene* scene, size_t mode) { return new BVHNBuilderSAH<4,TriangleMesh,Triangle4v>((BVH4*)bvh,scene,4,1.0f,4,inf,mode); }
  406. Builder* BVH4Triangle4iSceneBuilderSAH (void* bvh, Scene* scene, size_t mode) { return new BVHNBuilderSAH<4,TriangleMesh,Triangle4i>((BVH4*)bvh,scene,4,1.0f,4,inf,mode); }
  407. Builder* BVH4Triangle4vMBSceneBuilderSAH (void* bvh, Scene* scene, size_t mode) { return new BVHNBuilderMSMBlurSAH<4,TriangleMesh,Triangle4vMB>((BVH4*)bvh,scene,4,1.0f,4,inf,HIGH_SINGLE_THREAD_THRESHOLD); }
  408. Builder* BVH4Triangle4iMBSceneBuilderSAH (void* bvh, Scene* scene, size_t mode) { return new BVHNBuilderMSMBlurSAH<4,TriangleMesh,Triangle4iMB>((BVH4*)bvh,scene,4,1.0f,4,inf,HIGH_SINGLE_THREAD_THRESHOLD); }
  409. Builder* BVH4Triangle4SceneBuilderFastSpatialSAH (void* bvh, Scene* scene, size_t mode) { return new BVHNBuilderFastSpatialSAH<4,TriangleMesh,Triangle4,TriangleSplitterFactory>((BVH4*)bvh,scene,4,1.0f,4,inf,mode); }
  410. Builder* BVH4Triangle4vSceneBuilderFastSpatialSAH (void* bvh, Scene* scene, size_t mode) { return new BVHNBuilderFastSpatialSAH<4,TriangleMesh,Triangle4v,TriangleSplitterFactory>((BVH4*)bvh,scene,4,1.0f,4,inf,mode); }
  411. Builder* BVH4Triangle4iSceneBuilderFastSpatialSAH (void* bvh, Scene* scene, size_t mode) { return new BVHNBuilderFastSpatialSAH<4,TriangleMesh,Triangle4i,TriangleSplitterFactory>((BVH4*)bvh,scene,4,1.0f,4,inf,mode); }
  412. Builder* BVH4QuantizedTriangle4iSceneBuilderSAH (void* bvh, Scene* scene, size_t mode) { return new BVHNBuilderSAHQuantized<4,TriangleMesh,Triangle4i>((BVH4*)bvh,scene,4,1.0f,4,inf,mode); }
  413. #if defined(__AVX__)
  414. Builder* BVH8Triangle4MeshBuilderSAH (void* bvh, TriangleMesh* mesh, size_t mode) { return new BVHNBuilderSAH<8,TriangleMesh,Triangle4>((BVH8*)bvh,mesh,4,1.0f,4,inf,mode); }
  415. Builder* BVH8Triangle4vMeshBuilderSAH (void* bvh, TriangleMesh* mesh, size_t mode) { return new BVHNBuilderSAH<8,TriangleMesh,Triangle4v>((BVH8*)bvh,mesh,4,1.0f,4,inf,mode); }
  416. Builder* BVH8Triangle4iMeshBuilderSAH (void* bvh, TriangleMesh* mesh, size_t mode) { return new BVHNBuilderSAH<8,TriangleMesh,Triangle4i>((BVH8*)bvh,mesh,4,1.0f,4,inf,mode); }
  417. Builder* BVH8Triangle4SceneBuilderSAH (void* bvh, Scene* scene, size_t mode) { return new BVHNBuilderSAH<8,TriangleMesh,Triangle4>((BVH8*)bvh,scene,4,1.0f,4,inf,mode); }
  418. Builder* BVH8Triangle4vSceneBuilderSAH (void* bvh, Scene* scene, size_t mode) { return new BVHNBuilderSAH<8,TriangleMesh,Triangle4v>((BVH8*)bvh,scene,4,1.0f,4,inf,mode); }
  419. Builder* BVH8Triangle4iSceneBuilderSAH (void* bvh, Scene* scene, size_t mode) { return new BVHNBuilderSAH<8,TriangleMesh,Triangle4i>((BVH8*)bvh,scene,4,1.0f,4,inf,mode); }
  420. Builder* BVH8Triangle4vMBSceneBuilderSAH (void* bvh, Scene* scene, size_t mode) { return new BVHNBuilderMSMBlurSAH<8,TriangleMesh,Triangle4vMB>((BVH8*)bvh,scene,4,1.0f,4,inf,HIGH_SINGLE_THREAD_THRESHOLD); }
  421. Builder* BVH8Triangle4iMBSceneBuilderSAH (void* bvh, Scene* scene, size_t mode) { return new BVHNBuilderMSMBlurSAH<8,TriangleMesh,Triangle4iMB>((BVH8*)bvh,scene,4,1.0f,4,inf,HIGH_SINGLE_THREAD_THRESHOLD); }
  422. Builder* BVH8QuantizedTriangle4iSceneBuilderSAH (void* bvh, Scene* scene, size_t mode) { return new BVHNBuilderSAHQuantized<8,TriangleMesh,Triangle4i>((BVH8*)bvh,scene,4,1.0f,4,inf,mode); }
  423. Builder* BVH8Triangle4SceneBuilderFastSpatialSAH (void* bvh, Scene* scene, size_t mode) { return new BVHNBuilderFastSpatialSAH<8,TriangleMesh,Triangle4,TriangleSplitterFactory>((BVH8*)bvh,scene,4,1.0f,4,inf,mode); }
  424. Builder* BVH8Triangle4vSceneBuilderFastSpatialSAH (void* bvh, Scene* scene, size_t mode) { return new BVHNBuilderFastSpatialSAH<8,TriangleMesh,Triangle4v,TriangleSplitterFactory>((BVH8*)bvh,scene,4,1.0f,4,inf,mode); }
  425. #endif
  426. #endif
  427. #if defined(EMBREE_GEOMETRY_QUADS)
  428. Builder* BVH4Quad4vMeshBuilderSAH (void* bvh, QuadMesh* mesh, size_t mode) { return new BVHNBuilderSAH<4,QuadMesh,Quad4v>((BVH4*)bvh,mesh,4,1.0f,4,inf,mode); }
  429. Builder* BVH4Quad4iMeshBuilderSAH (void* bvh, QuadMesh* mesh, size_t mode) { return new BVHNBuilderSAH<4,QuadMesh,Quad4i>((BVH4*)bvh,mesh,4,1.0f,4,inf,mode); }
  430. Builder* BVH4Quad4vSceneBuilderSAH (void* bvh, Scene* scene, size_t mode) { return new BVHNBuilderSAH<4,QuadMesh,Quad4v>((BVH4*)bvh,scene,4,1.0f,4,inf,mode); }
  431. Builder* BVH4Quad4iSceneBuilderSAH (void* bvh, Scene* scene, size_t mode) { return new BVHNBuilderSAH<4,QuadMesh,Quad4i>((BVH4*)bvh,scene,4,1.0f,4,inf,mode); }
  432. Builder* BVH4Quad4iMBSceneBuilderSAH (void* bvh, Scene* scene, size_t mode) { return new BVHNBuilderMSMBlurSAH<4,QuadMesh,Quad4iMB>((BVH4*)bvh,scene ,4,1.0f,4,inf,HIGH_SINGLE_THREAD_THRESHOLD); }
  433. Builder* BVH4QuantizedQuad4vSceneBuilderSAH (void* bvh, Scene* scene, size_t mode) { return new BVHNBuilderSAHQuantized<4,QuadMesh,Quad4v>((BVH4*)bvh,scene,4,1.0f,4,inf,mode); }
  434. Builder* BVH4QuantizedQuad4iSceneBuilderSAH (void* bvh, Scene* scene, size_t mode) { return new BVHNBuilderSAHQuantized<4,QuadMesh,Quad4i>((BVH4*)bvh,scene,4,1.0f,4,inf,mode); }
  435. Builder* BVH4Quad4vSceneBuilderFastSpatialSAH (void* bvh, Scene* scene, size_t mode) { return new BVHNBuilderFastSpatialSAH<4,QuadMesh,Quad4v,QuadSplitterFactory>((BVH4*)bvh,scene,4,1.0f,4,inf,mode); }
  436. #if defined(__AVX__)
  437. Builder* BVH8Quad4vSceneBuilderSAH (void* bvh, Scene* scene, size_t mode) { return new BVHNBuilderSAH<8,QuadMesh,Quad4v>((BVH8*)bvh,scene,4,1.0f,4,inf,mode); }
  438. Builder* BVH8Quad4iSceneBuilderSAH (void* bvh, Scene* scene, size_t mode) { return new BVHNBuilderSAH<8,QuadMesh,Quad4i>((BVH8*)bvh,scene,4,1.0f,4,inf,mode); }
  439. Builder* BVH8Quad4iMBSceneBuilderSAH (void* bvh, Scene* scene, size_t mode) { return new BVHNBuilderMSMBlurSAH<8,QuadMesh,Quad4iMB>((BVH8*)bvh,scene,4,1.0f,4,inf,HIGH_SINGLE_THREAD_THRESHOLD); }
  440. Builder* BVH8QuantizedQuad4vSceneBuilderSAH (void* bvh, Scene* scene, size_t mode) { return new BVHNBuilderSAHQuantized<8,QuadMesh,Quad4v>((BVH8*)bvh,scene,4,1.0f,4,inf,mode); }
  441. Builder* BVH8QuantizedQuad4iSceneBuilderSAH (void* bvh, Scene* scene, size_t mode) { return new BVHNBuilderSAHQuantized<8,QuadMesh,Quad4i>((BVH8*)bvh,scene,4,1.0f,4,inf,mode); }
  442. Builder* BVH8Quad4vMeshBuilderSAH (void* bvh, QuadMesh* mesh, size_t mode) { return new BVHNBuilderSAH<8,QuadMesh,Quad4v>((BVH8*)bvh,mesh,4,1.0f,4,inf,mode); }
  443. Builder* BVH8Quad4vSceneBuilderFastSpatialSAH (void* bvh, Scene* scene, size_t mode) { return new BVHNBuilderFastSpatialSAH<8,QuadMesh,Quad4v,QuadSplitterFactory>((BVH8*)bvh,scene,4,1.0f,4,inf,mode); }
  444. #endif
  445. #endif
  446. #if defined(EMBREE_GEOMETRY_USER)
  447. Builder* BVH4VirtualSceneBuilderSAH (void* bvh, Scene* scene, size_t mode) {
  448. int minLeafSize = scene->device->object_accel_min_leaf_size;
  449. int maxLeafSize = scene->device->object_accel_max_leaf_size;
  450. return new BVHNBuilderSAH<4,AccelSet,Object>((BVH4*)bvh,scene,4,1.0f,minLeafSize,maxLeafSize,mode);
  451. }
  452. Builder* BVH4VirtualMeshBuilderSAH (void* bvh, AccelSet* mesh, size_t mode) {
  453. return new BVHNBuilderSAH<4,AccelSet,Object>((BVH4*)bvh,mesh,4,1.0f,1,inf,mode);
  454. }
  455. Builder* BVH4VirtualMBSceneBuilderSAH (void* bvh, Scene* scene, size_t mode) {
  456. int minLeafSize = scene->device->object_accel_mb_min_leaf_size;
  457. int maxLeafSize = scene->device->object_accel_mb_max_leaf_size;
  458. return new BVHNBuilderMSMBlurSAH<4,AccelSet,Object>((BVH4*)bvh,scene,4,1.0f,minLeafSize,maxLeafSize);
  459. }
  460. #endif
  461. }
  462. }