bvh8_factory.cpp 54 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015
  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. #if defined (__TARGET_AVX__)
  17. #include "bvh8_factory.h"
  18. #include "../bvh/bvh.h"
  19. #include "../geometry/bezier1v.h"
  20. #include "../geometry/bezier1i.h"
  21. #include "../geometry/linei.h"
  22. #include "../geometry/triangle.h"
  23. #include "../geometry/trianglev.h"
  24. #include "../geometry/trianglev_mb.h"
  25. #include "../geometry/trianglei.h"
  26. #include "../geometry/trianglei_mb.h"
  27. #include "../geometry/quadv.h"
  28. #include "../geometry/quadi.h"
  29. #include "../geometry/quadi_mb.h"
  30. #include "../geometry/subdivpatch1cached.h"
  31. #include "../common/accelinstance.h"
  32. namespace embree
  33. {
  34. DECLARE_SYMBOL2(Accel::Intersector1,BVH8Line4iIntersector1);
  35. DECLARE_SYMBOL2(Accel::Intersector1,BVH8Line4iMBIntersector1);
  36. DECLARE_SYMBOL2(Accel::Intersector1,BVH8Bezier1vIntersector1_OBB);
  37. DECLARE_SYMBOL2(Accel::Intersector1,BVH8Bezier1iIntersector1_OBB);
  38. DECLARE_SYMBOL2(Accel::Intersector1,BVH8Bezier1iMBIntersector1_OBB);
  39. DECLARE_SYMBOL2(Accel::Intersector1,BVH8Triangle4Intersector1Moeller);
  40. DECLARE_SYMBOL2(Accel::Intersector1,BVH8Triangle4iIntersector1Moeller);
  41. DECLARE_SYMBOL2(Accel::Intersector1,BVH8Triangle4vIntersector1Pluecker);
  42. DECLARE_SYMBOL2(Accel::Intersector1,BVH8Triangle4iIntersector1Pluecker);
  43. DECLARE_SYMBOL2(Accel::Intersector1,BVH8Triangle4vMBIntersector1Moeller);
  44. DECLARE_SYMBOL2(Accel::Intersector1,BVH8Triangle4iMBIntersector1Moeller);
  45. DECLARE_SYMBOL2(Accel::Intersector1,BVH8Triangle4vMBIntersector1Pluecker);
  46. DECLARE_SYMBOL2(Accel::Intersector1,BVH8Triangle4iMBIntersector1Pluecker);
  47. DECLARE_SYMBOL2(Accel::Intersector1,BVH8Quad4vIntersector1Moeller);
  48. DECLARE_SYMBOL2(Accel::Intersector1,BVH8Quad4iIntersector1Moeller);
  49. DECLARE_SYMBOL2(Accel::Intersector1,BVH8Quad4vIntersector1Pluecker);
  50. DECLARE_SYMBOL2(Accel::Intersector1,BVH8Quad4iIntersector1Pluecker);
  51. DECLARE_SYMBOL2(Accel::Intersector1,BVH8Quad4iMBIntersector1Moeller);
  52. DECLARE_SYMBOL2(Accel::Intersector1,BVH8Quad4iMBIntersector1Pluecker);
  53. DECLARE_SYMBOL2(Accel::Intersector1,QBVH8Triangle4iIntersector1Pluecker);
  54. DECLARE_SYMBOL2(Accel::Intersector1,QBVH8Quad4iIntersector1Pluecker);
  55. DECLARE_SYMBOL2(Accel::Intersector4,BVH8Line4iIntersector4);
  56. DECLARE_SYMBOL2(Accel::Intersector4,BVH8Line4iMBIntersector4);
  57. DECLARE_SYMBOL2(Accel::Intersector4,BVH8Bezier1vIntersector4Hybrid_OBB);
  58. DECLARE_SYMBOL2(Accel::Intersector4,BVH8Bezier1iIntersector4Hybrid_OBB);
  59. DECLARE_SYMBOL2(Accel::Intersector4,BVH8Bezier1iMBIntersector4Hybrid_OBB);
  60. DECLARE_SYMBOL2(Accel::Intersector4,BVH8Triangle4Intersector4HybridMoeller);
  61. DECLARE_SYMBOL2(Accel::Intersector4,BVH8Triangle4Intersector4HybridMoellerNoFilter);
  62. DECLARE_SYMBOL2(Accel::Intersector4,BVH8Triangle4iIntersector4HybridMoeller);
  63. DECLARE_SYMBOL2(Accel::Intersector4,BVH8Triangle4vIntersector4HybridPluecker);
  64. DECLARE_SYMBOL2(Accel::Intersector4,BVH8Triangle4iIntersector4HybridPluecker);
  65. DECLARE_SYMBOL2(Accel::Intersector4,BVH8Triangle4vMBIntersector4HybridMoeller);
  66. DECLARE_SYMBOL2(Accel::Intersector4,BVH8Triangle4iMBIntersector4HybridMoeller);
  67. DECLARE_SYMBOL2(Accel::Intersector4,BVH8Triangle4vMBIntersector4HybridPluecker);
  68. DECLARE_SYMBOL2(Accel::Intersector4,BVH8Triangle4iMBIntersector4HybridPluecker);
  69. DECLARE_SYMBOL2(Accel::Intersector4,BVH8Quad4vIntersector4HybridMoeller);
  70. DECLARE_SYMBOL2(Accel::Intersector4,BVH8Quad4vIntersector4HybridMoellerNoFilter);
  71. DECLARE_SYMBOL2(Accel::Intersector4,BVH8Quad4iIntersector4HybridMoeller);
  72. DECLARE_SYMBOL2(Accel::Intersector4,BVH8Quad4vIntersector4HybridPluecker);
  73. DECLARE_SYMBOL2(Accel::Intersector4,BVH8Quad4iIntersector4HybridPluecker);
  74. DECLARE_SYMBOL2(Accel::Intersector4,BVH8Quad4iMBIntersector4HybridMoeller);
  75. DECLARE_SYMBOL2(Accel::Intersector4,BVH8Quad4iMBIntersector4HybridPluecker);
  76. DECLARE_SYMBOL2(Accel::Intersector8,BVH8Line4iIntersector8);
  77. DECLARE_SYMBOL2(Accel::Intersector8,BVH8Line4iMBIntersector8);
  78. DECLARE_SYMBOL2(Accel::Intersector8,BVH8Bezier1vIntersector8Hybrid_OBB);
  79. DECLARE_SYMBOL2(Accel::Intersector8,BVH8Bezier1iIntersector8Hybrid_OBB);
  80. DECLARE_SYMBOL2(Accel::Intersector8,BVH8Bezier1iMBIntersector8Hybrid_OBB);
  81. DECLARE_SYMBOL2(Accel::Intersector8,BVH8Triangle4Intersector8HybridMoeller);
  82. DECLARE_SYMBOL2(Accel::Intersector8,BVH8Triangle4Intersector8HybridMoellerNoFilter);
  83. DECLARE_SYMBOL2(Accel::Intersector8,BVH8Triangle4iIntersector8HybridMoeller);
  84. DECLARE_SYMBOL2(Accel::Intersector8,BVH8Triangle4vIntersector8HybridPluecker);
  85. DECLARE_SYMBOL2(Accel::Intersector8,BVH8Triangle4iIntersector8HybridPluecker);
  86. DECLARE_SYMBOL2(Accel::Intersector8,BVH8Triangle4vMBIntersector8HybridMoeller);
  87. DECLARE_SYMBOL2(Accel::Intersector8,BVH8Triangle4iMBIntersector8HybridMoeller);
  88. DECLARE_SYMBOL2(Accel::Intersector8,BVH8Triangle4vMBIntersector8HybridPluecker);
  89. DECLARE_SYMBOL2(Accel::Intersector8,BVH8Triangle4iMBIntersector8HybridPluecker);
  90. DECLARE_SYMBOL2(Accel::Intersector8,BVH8Quad4vIntersector8HybridMoeller);
  91. DECLARE_SYMBOL2(Accel::Intersector8,BVH8Quad4vIntersector8HybridMoellerNoFilter);
  92. DECLARE_SYMBOL2(Accel::Intersector8,BVH8Quad4iIntersector8HybridMoeller);
  93. DECLARE_SYMBOL2(Accel::Intersector8,BVH8Quad4vIntersector8HybridPluecker);
  94. DECLARE_SYMBOL2(Accel::Intersector8,BVH8Quad4iIntersector8HybridPluecker);
  95. DECLARE_SYMBOL2(Accel::Intersector8,BVH8Quad4iMBIntersector8HybridMoeller);
  96. DECLARE_SYMBOL2(Accel::Intersector8,BVH8Quad4iMBIntersector8HybridPluecker);
  97. DECLARE_SYMBOL2(Accel::Intersector16,BVH8Line4iIntersector16);
  98. DECLARE_SYMBOL2(Accel::Intersector16,BVH8Line4iMBIntersector16);
  99. DECLARE_SYMBOL2(Accel::Intersector16,BVH8Bezier1vIntersector16Hybrid_OBB);
  100. DECLARE_SYMBOL2(Accel::Intersector16,BVH8Bezier1iIntersector16Hybrid_OBB);
  101. DECLARE_SYMBOL2(Accel::Intersector16,BVH8Bezier1iMBIntersector16Hybrid_OBB);
  102. DECLARE_SYMBOL2(Accel::Intersector16,BVH8Triangle4Intersector16HybridMoeller);
  103. DECLARE_SYMBOL2(Accel::Intersector16,BVH8Triangle4Intersector16HybridMoellerNoFilter);
  104. DECLARE_SYMBOL2(Accel::Intersector16,BVH8Triangle4iIntersector16HybridMoeller);
  105. DECLARE_SYMBOL2(Accel::Intersector16,BVH8Triangle4vIntersector16HybridPluecker);
  106. DECLARE_SYMBOL2(Accel::Intersector16,BVH8Triangle4iIntersector16HybridPluecker);
  107. DECLARE_SYMBOL2(Accel::Intersector16,BVH8Triangle4vMBIntersector16HybridMoeller);
  108. DECLARE_SYMBOL2(Accel::Intersector16,BVH8Triangle4iMBIntersector16HybridMoeller);
  109. DECLARE_SYMBOL2(Accel::Intersector16,BVH8Triangle4vMBIntersector16HybridPluecker);
  110. DECLARE_SYMBOL2(Accel::Intersector16,BVH8Triangle4iMBIntersector16HybridPluecker);
  111. DECLARE_SYMBOL2(Accel::Intersector16,BVH8Quad4vIntersector16HybridMoeller);
  112. DECLARE_SYMBOL2(Accel::Intersector16,BVH8Quad4vIntersector16HybridMoellerNoFilter);
  113. DECLARE_SYMBOL2(Accel::Intersector16,BVH8Quad4iIntersector16HybridMoeller);
  114. DECLARE_SYMBOL2(Accel::Intersector16,BVH8Quad4vIntersector16HybridPluecker);
  115. DECLARE_SYMBOL2(Accel::Intersector16,BVH8Quad4iIntersector16HybridPluecker);
  116. DECLARE_SYMBOL2(Accel::Intersector16,BVH8Quad4iMBIntersector16HybridMoeller);
  117. DECLARE_SYMBOL2(Accel::Intersector16,BVH8Quad4iMBIntersector16HybridPluecker);
  118. //DECLARE_SYMBOL2(Accel::IntersectorN,BVH8Line4iIntersectorStream);
  119. //DECLARE_SYMBOL2(Accel::IntersectorN,BVH8Line4iMBIntersectorStream);
  120. //DECLARE_SYMBOL2(Accel::IntersectorN,BVH8Bezier1vIntersectorStream_OBB);
  121. //DECLARE_SYMBOL2(Accel::IntersectorN,BVH8Bezier1iIntersectorStream_OBB);
  122. //DECLARE_SYMBOL2(Accel::IntersectorN,BVH8Bezier1iMBIntersectorStream_OBB);
  123. DECLARE_SYMBOL2(Accel::IntersectorN,BVH8Triangle4IntersectorStreamMoeller);
  124. DECLARE_SYMBOL2(Accel::IntersectorN,BVH8Triangle4IntersectorStreamMoellerNoFilter);
  125. DECLARE_SYMBOL2(Accel::IntersectorN,BVH8Triangle4iIntersectorStreamMoeller);
  126. DECLARE_SYMBOL2(Accel::IntersectorN,BVH8Triangle4vIntersectorStreamPluecker);
  127. DECLARE_SYMBOL2(Accel::IntersectorN,BVH8Triangle4iIntersectorStreamPluecker);
  128. DECLARE_SYMBOL2(Accel::IntersectorN,BVH8Quad4vIntersectorStreamMoeller);
  129. DECLARE_SYMBOL2(Accel::IntersectorN,BVH8Quad4vIntersectorStreamMoellerNoFilter);
  130. DECLARE_SYMBOL2(Accel::IntersectorN,BVH8Quad4iIntersectorStreamMoeller);
  131. DECLARE_SYMBOL2(Accel::IntersectorN,BVH8Quad4vIntersectorStreamPluecker);
  132. DECLARE_SYMBOL2(Accel::IntersectorN,BVH8Quad4iIntersectorStreamPluecker);
  133. DECLARE_BUILDER2(void,Scene,const createTriangleMeshAccelTy,BVH8BuilderTwoLevelTriangleMeshSAH);
  134. DECLARE_BUILDER2(void,Scene,const createQuadMeshAccelTy,BVH8BuilderTwoLevelQuadMeshSAH);
  135. DECLARE_BUILDER2(void,Scene,size_t,BVH8Bezier1vBuilder_OBB_New);
  136. DECLARE_BUILDER2(void,Scene,size_t,BVH8Bezier1iBuilder_OBB_New);
  137. DECLARE_BUILDER2(void,Scene,size_t,BVH8Bezier1iMBBuilder_OBB_New);
  138. DECLARE_BUILDER2(void,Scene,size_t,BVH8Line4iSceneBuilderSAH);
  139. DECLARE_BUILDER2(void,Scene,size_t,BVH8Line4iMBSceneBuilderSAH);
  140. DECLARE_BUILDER2(void,Scene,size_t,BVH8Triangle4SceneBuilderSAH);
  141. DECLARE_BUILDER2(void,Scene,size_t,BVH8Triangle4vSceneBuilderSAH);
  142. DECLARE_BUILDER2(void,Scene,size_t,BVH8Triangle4iSceneBuilderSAH);
  143. DECLARE_BUILDER2(void,Scene,size_t,BVH8Triangle4vMBSceneBuilderSAH);
  144. DECLARE_BUILDER2(void,Scene,size_t,BVH8Triangle4iMBSceneBuilderSAH);
  145. DECLARE_BUILDER2(void,Scene,size_t,BVH8Quad4vSceneBuilderSAH);
  146. DECLARE_BUILDER2(void,Scene,size_t,BVH8Quad4iSceneBuilderSAH);
  147. DECLARE_BUILDER2(void,Scene,size_t,BVH8Quad4iMBSceneBuilderSAH);
  148. //DECLARE_BUILDER2(void,QuadMesh,size_t,BVH8Quad4iMBMeshBuilderSAH);
  149. DECLARE_BUILDER2(void,TriangleMesh,size_t,BVH8Triangle4MeshBuilderSAH);
  150. DECLARE_BUILDER2(void,TriangleMesh,size_t,BVH8Triangle4vMeshBuilderSAH);
  151. DECLARE_BUILDER2(void,TriangleMesh,size_t,BVH8Triangle4iMeshBuilderSAH);
  152. DECLARE_BUILDER2(void,TriangleMesh,size_t,BVH8Triangle4MeshRefitSAH);
  153. DECLARE_BUILDER2(void,TriangleMesh,size_t,BVH8Triangle4vMeshRefitSAH);
  154. DECLARE_BUILDER2(void,TriangleMesh,size_t,BVH8Triangle4iMeshRefitSAH);
  155. DECLARE_BUILDER2(void,QuadMesh,size_t,BVH8Quad4vMeshBuilderSAH);
  156. DECLARE_BUILDER2(void,QuadMesh,size_t,BVH8Quad4vMeshRefitSAH);
  157. DECLARE_BUILDER2(void,Scene,size_t,BVH8Triangle4SceneBuilderFastSpatialSAH);
  158. DECLARE_BUILDER2(void,Scene,size_t,BVH8Triangle4vSceneBuilderFastSpatialSAH);
  159. DECLARE_BUILDER2(void,Scene,size_t,BVH8QuantizedTriangle4iSceneBuilderSAH);
  160. DECLARE_BUILDER2(void,Scene,size_t,BVH8QuantizedQuad4iSceneBuilderSAH);
  161. DECLARE_BUILDER2(void,TriangleMesh,size_t,BVH8Triangle4MeshBuilderMortonGeneral);
  162. DECLARE_BUILDER2(void,TriangleMesh,size_t,BVH8Triangle4vMeshBuilderMortonGeneral);
  163. DECLARE_BUILDER2(void,TriangleMesh,size_t,BVH8Triangle4iMeshBuilderMortonGeneral);
  164. DECLARE_BUILDER2(void,QuadMesh,size_t,BVH8Quad4vMeshBuilderMortonGeneral);
  165. DECLARE_BUILDER2(void,Scene,size_t,BVH8Quad4vSceneBuilderFastSpatialSAH);
  166. BVH8Factory::BVH8Factory(int bfeatures, int ifeatures)
  167. {
  168. selectBuilders(bfeatures);
  169. selectIntersectors(ifeatures);
  170. }
  171. void BVH8Factory::selectBuilders(int features)
  172. {
  173. IF_ENABLED_HAIR(SELECT_SYMBOL_INIT_AVX(features,BVH8Bezier1vBuilder_OBB_New));
  174. IF_ENABLED_HAIR(SELECT_SYMBOL_INIT_AVX(features,BVH8Bezier1vBuilder_OBB_New));
  175. IF_ENABLED_HAIR(SELECT_SYMBOL_INIT_AVX(features,BVH8Bezier1iBuilder_OBB_New));
  176. IF_ENABLED_HAIR(SELECT_SYMBOL_INIT_AVX(features,BVH8Bezier1iMBBuilder_OBB_New));
  177. IF_ENABLED_LINES(SELECT_SYMBOL_INIT_AVX_AVX512KNL_AVX512SKX(features,BVH8Line4iSceneBuilderSAH));
  178. IF_ENABLED_LINES(SELECT_SYMBOL_INIT_AVX_AVX512KNL_AVX512SKX(features,BVH8Line4iMBSceneBuilderSAH));
  179. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX512KNL_AVX512SKX(features,BVH8Triangle4SceneBuilderSAH));
  180. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX512KNL_AVX512SKX(features,BVH8Triangle4vSceneBuilderSAH));
  181. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX512KNL_AVX512SKX(features,BVH8Triangle4iSceneBuilderSAH));
  182. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX512KNL_AVX512SKX(features,BVH8Triangle4vMBSceneBuilderSAH));
  183. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX512KNL_AVX512SKX(features,BVH8Triangle4iMBSceneBuilderSAH));
  184. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX512KNL_AVX512SKX(features,BVH8Quad4vSceneBuilderSAH));
  185. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX512KNL_AVX512SKX(features,BVH8Quad4iSceneBuilderSAH));
  186. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX512KNL_AVX512SKX(features,BVH8Quad4iMBSceneBuilderSAH));
  187. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX512KNL_AVX512SKX(features,BVH8Triangle4MeshBuilderSAH));
  188. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX512KNL_AVX512SKX(features,BVH8Triangle4vMeshBuilderSAH));
  189. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX512KNL_AVX512SKX(features,BVH8Triangle4iMeshBuilderSAH));
  190. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX512KNL_AVX512SKX(features,BVH8Triangle4MeshRefitSAH));
  191. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX512KNL_AVX512SKX(features,BVH8Triangle4vMeshRefitSAH));
  192. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX512KNL_AVX512SKX(features,BVH8Triangle4iMeshRefitSAH));
  193. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512KNL_AVX512SKX(features,BVH8Triangle4MeshBuilderMortonGeneral));
  194. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512KNL_AVX512SKX(features,BVH8Triangle4vMeshBuilderMortonGeneral));
  195. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512KNL_AVX512SKX(features,BVH8Triangle4iMeshBuilderMortonGeneral));
  196. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX512KNL_AVX512SKX(features,BVH8Quad4vMeshBuilderSAH));
  197. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX512KNL_AVX512SKX(features,BVH8Quad4vMeshRefitSAH));
  198. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512KNL_AVX512SKX(features,BVH8Quad4vMeshBuilderMortonGeneral));
  199. IF_ENABLED_TRIS (SELECT_SYMBOL_INIT_AVX_AVX512KNL_AVX512SKX(features,BVH8BuilderTwoLevelTriangleMeshSAH));
  200. IF_ENABLED_QUADS (SELECT_SYMBOL_INIT_AVX_AVX512KNL_AVX512SKX(features,BVH8BuilderTwoLevelQuadMeshSAH));
  201. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX(features,BVH8QuantizedTriangle4iSceneBuilderSAH));
  202. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX(features,BVH8QuantizedQuad4iSceneBuilderSAH));
  203. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX512KNL_AVX512SKX(features,BVH8Triangle4SceneBuilderFastSpatialSAH));
  204. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX512KNL_AVX512SKX(features,BVH8Triangle4vSceneBuilderFastSpatialSAH));
  205. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX512KNL_AVX512SKX(features,BVH8Quad4vSceneBuilderFastSpatialSAH));
  206. }
  207. void BVH8Factory::selectIntersectors(int features)
  208. {
  209. /* select intersectors1 */
  210. IF_ENABLED_LINES(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512KNL_AVX512SKX(features,BVH8Line4iIntersector1));
  211. IF_ENABLED_LINES(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512KNL_AVX512SKX(features,BVH8Line4iMBIntersector1));
  212. IF_ENABLED_HAIR(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512KNL_AVX512SKX(features,BVH8Bezier1vIntersector1_OBB));
  213. IF_ENABLED_HAIR(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512KNL_AVX512SKX(features,BVH8Bezier1iIntersector1_OBB));
  214. IF_ENABLED_HAIR(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512KNL_AVX512SKX(features,BVH8Bezier1iMBIntersector1_OBB));
  215. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512KNL_AVX512SKX(features,BVH8Triangle4Intersector1Moeller));
  216. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512KNL_AVX512SKX(features,BVH8Triangle4iIntersector1Moeller));
  217. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512KNL_AVX512SKX(features,BVH8Triangle4vIntersector1Pluecker));
  218. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512KNL_AVX512SKX(features,BVH8Triangle4iIntersector1Pluecker));
  219. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512KNL_AVX512SKX(features,BVH8Triangle4vMBIntersector1Moeller));
  220. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512KNL_AVX512SKX(features,BVH8Triangle4iMBIntersector1Moeller));
  221. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512KNL_AVX512SKX(features,BVH8Triangle4vMBIntersector1Pluecker));
  222. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512KNL_AVX512SKX(features,BVH8Triangle4iMBIntersector1Pluecker));
  223. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512KNL_AVX512SKX(features,BVH8Quad4vIntersector1Moeller));
  224. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512KNL_AVX512SKX(features,BVH8Quad4iIntersector1Moeller));
  225. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512KNL_AVX512SKX(features,BVH8Quad4vIntersector1Pluecker));
  226. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512KNL_AVX512SKX(features,BVH8Quad4iIntersector1Pluecker));
  227. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512KNL_AVX512SKX(features,BVH8Quad4iMBIntersector1Moeller));
  228. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512KNL_AVX512SKX(features,BVH8Quad4iMBIntersector1Pluecker));
  229. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512KNL_AVX512SKX(features,QBVH8Triangle4iIntersector1Pluecker));
  230. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512KNL_AVX512SKX(features,QBVH8Quad4iIntersector1Pluecker));
  231. #if defined (EMBREE_RAY_PACKETS)
  232. /* select intersectors4 */
  233. IF_ENABLED_LINES(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512SKX(features,BVH8Line4iIntersector4));
  234. IF_ENABLED_LINES(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512SKX(features,BVH8Line4iMBIntersector4));
  235. IF_ENABLED_HAIR(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512SKX(features,BVH8Bezier1vIntersector4Hybrid_OBB));
  236. IF_ENABLED_HAIR(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512SKX(features,BVH8Bezier1iIntersector4Hybrid_OBB));
  237. IF_ENABLED_HAIR(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512SKX(features,BVH8Bezier1iMBIntersector4Hybrid_OBB));
  238. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512SKX(features,BVH8Triangle4Intersector4HybridMoeller));
  239. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512SKX(features,BVH8Triangle4Intersector4HybridMoellerNoFilter));
  240. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512SKX(features,BVH8Triangle4iIntersector4HybridMoeller));
  241. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512SKX(features,BVH8Triangle4vIntersector4HybridPluecker));
  242. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512SKX(features,BVH8Triangle4iIntersector4HybridPluecker));
  243. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512SKX(features,BVH8Triangle4vMBIntersector4HybridMoeller));
  244. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512SKX(features,BVH8Triangle4iMBIntersector4HybridMoeller));
  245. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512SKX(features,BVH8Triangle4vMBIntersector4HybridPluecker));
  246. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512SKX(features,BVH8Triangle4iMBIntersector4HybridPluecker));
  247. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512SKX(features,BVH8Quad4vIntersector4HybridMoeller));
  248. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512SKX(features,BVH8Quad4vIntersector4HybridMoellerNoFilter));
  249. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512SKX(features,BVH8Quad4iIntersector4HybridMoeller));
  250. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512SKX(features,BVH8Quad4vIntersector4HybridPluecker));
  251. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512SKX(features,BVH8Quad4iIntersector4HybridPluecker));
  252. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512SKX(features,BVH8Quad4iMBIntersector4HybridMoeller));
  253. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512SKX(features,BVH8Quad4iMBIntersector4HybridPluecker));
  254. /* select intersectors8 */
  255. IF_ENABLED_LINES(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512SKX(features,BVH8Line4iIntersector8));
  256. IF_ENABLED_LINES(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512SKX(features,BVH8Line4iMBIntersector8));
  257. IF_ENABLED_HAIR(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512SKX(features,BVH8Bezier1vIntersector8Hybrid_OBB));
  258. IF_ENABLED_HAIR(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512SKX(features,BVH8Bezier1iIntersector8Hybrid_OBB));
  259. IF_ENABLED_HAIR(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512SKX(features,BVH8Bezier1iMBIntersector8Hybrid_OBB));
  260. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512SKX(features,BVH8Triangle4Intersector8HybridMoeller));
  261. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512SKX(features,BVH8Triangle4Intersector8HybridMoellerNoFilter));
  262. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512SKX(features,BVH8Triangle4iIntersector8HybridMoeller));
  263. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512SKX(features,BVH8Triangle4vIntersector8HybridPluecker));
  264. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512SKX(features,BVH8Triangle4iIntersector8HybridPluecker));
  265. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512SKX(features,BVH8Triangle4vMBIntersector8HybridMoeller));
  266. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512SKX(features,BVH8Triangle4iMBIntersector8HybridMoeller));
  267. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512SKX(features,BVH8Triangle4vMBIntersector8HybridPluecker));
  268. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512SKX(features,BVH8Triangle4iMBIntersector8HybridPluecker));
  269. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512SKX(features,BVH8Quad4vIntersector8HybridMoeller));
  270. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512SKX(features,BVH8Quad4vIntersector8HybridMoellerNoFilter));
  271. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512SKX(features,BVH8Quad4iIntersector8HybridMoeller));
  272. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512SKX(features,BVH8Quad4vIntersector8HybridPluecker));
  273. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512SKX(features,BVH8Quad4iIntersector8HybridPluecker));
  274. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512SKX(features,BVH8Quad4iMBIntersector8HybridMoeller));
  275. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512SKX(features,BVH8Quad4iMBIntersector8HybridPluecker));
  276. /* select intersectors16 */
  277. IF_ENABLED_LINES(SELECT_SYMBOL_INIT_AVX512KNL_AVX512SKX(features,BVH8Line4iIntersector16));
  278. IF_ENABLED_LINES(SELECT_SYMBOL_INIT_AVX512KNL_AVX512SKX(features,BVH8Line4iMBIntersector16));
  279. IF_ENABLED_HAIR(SELECT_SYMBOL_INIT_AVX512KNL_AVX512SKX(features,BVH8Bezier1vIntersector16Hybrid_OBB));
  280. IF_ENABLED_HAIR(SELECT_SYMBOL_INIT_AVX512KNL_AVX512SKX(features,BVH8Bezier1iIntersector16Hybrid_OBB));
  281. IF_ENABLED_HAIR(SELECT_SYMBOL_INIT_AVX512KNL_AVX512SKX(features,BVH8Bezier1iMBIntersector16Hybrid_OBB));
  282. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX512KNL_AVX512SKX(features,BVH8Triangle4Intersector16HybridMoeller));
  283. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX512KNL_AVX512SKX(features,BVH8Triangle4Intersector16HybridMoellerNoFilter));
  284. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX512KNL_AVX512SKX(features,BVH8Triangle4iIntersector16HybridMoeller));
  285. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX512KNL_AVX512SKX(features,BVH8Triangle4vIntersector16HybridPluecker));
  286. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX512KNL_AVX512SKX(features,BVH8Triangle4iIntersector16HybridPluecker));
  287. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX512KNL_AVX512SKX(features,BVH8Triangle4vMBIntersector16HybridMoeller));
  288. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX512KNL_AVX512SKX(features,BVH8Triangle4iMBIntersector16HybridMoeller));
  289. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX512KNL_AVX512SKX(features,BVH8Triangle4vMBIntersector16HybridPluecker));
  290. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX512KNL_AVX512SKX(features,BVH8Triangle4iMBIntersector16HybridPluecker));
  291. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX512KNL_AVX512SKX(features,BVH8Quad4vIntersector16HybridMoeller));
  292. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX512KNL_AVX512SKX(features,BVH8Quad4vIntersector16HybridMoellerNoFilter));
  293. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX512KNL_AVX512SKX(features,BVH8Quad4iIntersector16HybridMoeller));
  294. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX512KNL_AVX512SKX(features,BVH8Quad4vIntersector16HybridPluecker));
  295. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX512KNL_AVX512SKX(features,BVH8Quad4iIntersector16HybridPluecker));
  296. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX512KNL_AVX512SKX(features,BVH8Quad4iMBIntersector16HybridMoeller));
  297. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX512KNL_AVX512SKX(features,BVH8Quad4iMBIntersector16HybridPluecker));
  298. /* select stream intersectors */
  299. //IF_ENABLED_LINES(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512KNL_AVX512SKX(features,BVH8Line4iIntersectorStream));
  300. //IF_ENABLED_LINES(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512KNL_AVX512SKX(features,BVH8Line4iMBIntersectorStream));
  301. //IF_ENABLED_HAIR(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512KNL_AVX512SKX(features,BVH8Bezier1vIntersectorStream_OBB));
  302. //IF_ENABLED_HAIR(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512KNL_AVX512SKX(features,BVH8Bezier1iIntersectorStream_OBB));
  303. //IF_ENABLED_HAIR(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512KNL_AVX512SKX(features,BVH8Bezier1iMBIntersectorStream_OBB));
  304. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512KNL_AVX512SKX(features,BVH8Triangle4IntersectorStreamMoeller));
  305. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512KNL_AVX512SKX(features,BVH8Triangle4IntersectorStreamMoellerNoFilter));
  306. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512KNL_AVX512SKX(features,BVH8Triangle4iIntersectorStreamMoeller));
  307. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512KNL_AVX512SKX(features,BVH8Triangle4vIntersectorStreamPluecker));
  308. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512KNL_AVX512SKX(features,BVH8Triangle4iIntersectorStreamPluecker));
  309. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512KNL_AVX512SKX(features,BVH8Quad4vIntersectorStreamMoeller));
  310. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512KNL_AVX512SKX(features,BVH8Quad4vIntersectorStreamMoellerNoFilter));
  311. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512KNL_AVX512SKX(features,BVH8Quad4iIntersectorStreamMoeller));
  312. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512KNL_AVX512SKX(features,BVH8Quad4vIntersectorStreamPluecker));
  313. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512KNL_AVX512SKX(features,BVH8Quad4iIntersectorStreamPluecker));
  314. #endif
  315. }
  316. void BVH8Factory::createTriangleMeshTriangle4Morton(TriangleMesh* mesh, AccelData*& accel, Builder*& builder)
  317. {
  318. BVH8Factory* factory = mesh->parent->device->bvh8_factory.get();
  319. accel = new BVH8(Triangle4::type,mesh->parent);
  320. builder = factory->BVH8Triangle4MeshBuilderMortonGeneral(accel,mesh,0);
  321. }
  322. void BVH8Factory::createTriangleMeshTriangle4vMorton(TriangleMesh* mesh, AccelData*& accel, Builder*& builder)
  323. {
  324. BVH8Factory* factory = mesh->parent->device->bvh8_factory.get();
  325. accel = new BVH8(Triangle4v::type,mesh->parent);
  326. builder = factory->BVH8Triangle4vMeshBuilderMortonGeneral(accel,mesh,0);
  327. }
  328. void BVH8Factory::createTriangleMeshTriangle4iMorton(TriangleMesh* mesh, AccelData*& accel, Builder*& builder)
  329. {
  330. BVH8Factory* factory = mesh->parent->device->bvh8_factory.get();
  331. accel = new BVH8(Triangle4i::type,mesh->parent);
  332. builder = factory->BVH8Triangle4iMeshBuilderMortonGeneral(accel,mesh,0);
  333. }
  334. void BVH8Factory::createTriangleMeshTriangle4(TriangleMesh* mesh, AccelData*& accel, Builder*& builder)
  335. {
  336. BVH8Factory* factory = mesh->parent->device->bvh8_factory.get();
  337. accel = new BVH8(Triangle4::type,mesh->parent);
  338. switch (mesh->flags) {
  339. case RTC_GEOMETRY_STATIC: builder = factory->BVH8Triangle4MeshBuilderSAH(accel,mesh,0); break;
  340. case RTC_GEOMETRY_DEFORMABLE: builder = factory->BVH8Triangle4MeshRefitSAH(accel,mesh,0); break;
  341. case RTC_GEOMETRY_DYNAMIC: builder = factory->BVH8Triangle4MeshBuilderMortonGeneral(accel,mesh,0); break;
  342. default: throw_RTCError(RTC_UNKNOWN_ERROR,"invalid geometry flag");
  343. }
  344. }
  345. void BVH8Factory::createTriangleMeshTriangle4v(TriangleMesh* mesh, AccelData*& accel, Builder*& builder)
  346. {
  347. BVH8Factory* factory = mesh->parent->device->bvh8_factory.get();
  348. accel = new BVH8(Triangle4v::type,mesh->parent);
  349. switch (mesh->flags) {
  350. case RTC_GEOMETRY_STATIC: builder = factory->BVH8Triangle4vMeshBuilderSAH(accel,mesh,0); break;
  351. case RTC_GEOMETRY_DEFORMABLE: builder = factory->BVH8Triangle4vMeshRefitSAH(accel,mesh,0); break;
  352. case RTC_GEOMETRY_DYNAMIC: builder = factory->BVH8Triangle4vMeshBuilderMortonGeneral(accel,mesh,0); break;
  353. default: throw_RTCError(RTC_UNKNOWN_ERROR,"invalid geometry flag");
  354. }
  355. }
  356. void BVH8Factory::createTriangleMeshTriangle4i(TriangleMesh* mesh, AccelData*& accel, Builder*& builder)
  357. {
  358. BVH8Factory* factory = mesh->parent->device->bvh8_factory.get();
  359. accel = new BVH8(Triangle4i::type,mesh->parent);
  360. switch (mesh->flags) {
  361. case RTC_GEOMETRY_STATIC: builder = factory->BVH8Triangle4iMeshBuilderSAH(accel,mesh,0); break;
  362. case RTC_GEOMETRY_DEFORMABLE: builder = factory->BVH8Triangle4iMeshRefitSAH(accel,mesh,0); break;
  363. case RTC_GEOMETRY_DYNAMIC: builder = factory->BVH8Triangle4iMeshBuilderMortonGeneral(accel,mesh,0); break;
  364. default: throw_RTCError(RTC_UNKNOWN_ERROR,"invalid geometry flag");
  365. }
  366. }
  367. void BVH8Factory::createQuadMeshQuad4v(QuadMesh* mesh, AccelData*& accel, Builder*& builder)
  368. {
  369. BVH8Factory* factory = mesh->parent->device->bvh8_factory.get();
  370. accel = new BVH8(Quad4v::type,mesh->parent);
  371. switch (mesh->flags) {
  372. case RTC_GEOMETRY_STATIC: builder = factory->BVH8Quad4vMeshBuilderSAH(accel,mesh,0); break;
  373. case RTC_GEOMETRY_DEFORMABLE: builder = factory->BVH8Quad4vMeshRefitSAH(accel,mesh,0); break;
  374. case RTC_GEOMETRY_DYNAMIC: builder = factory->BVH8Quad4vMeshBuilderMortonGeneral(accel,mesh,0); break;
  375. default: throw_RTCError(RTC_UNKNOWN_ERROR,"invalid geometry flag");
  376. }
  377. }
  378. void BVH8Factory::createQuadMeshQuad4vMorton(QuadMesh* mesh, AccelData*& accel, Builder*& builder)
  379. {
  380. BVH8Factory* factory = mesh->parent->device->bvh8_factory.get();
  381. accel = new BVH8(Quad4v::type,mesh->parent);
  382. builder = factory->BVH8Quad4vMeshBuilderMortonGeneral(accel,mesh,0);
  383. }
  384. Accel::Intersectors BVH8Factory::BVH8Bezier1vIntersectors_OBB(BVH8* bvh)
  385. {
  386. Accel::Intersectors intersectors;
  387. intersectors.ptr = bvh;
  388. intersectors.intersector1 = BVH8Bezier1vIntersector1_OBB();
  389. #if defined (EMBREE_RAY_PACKETS)
  390. intersectors.intersector4 = BVH8Bezier1vIntersector4Hybrid_OBB();
  391. intersectors.intersector8 = BVH8Bezier1vIntersector8Hybrid_OBB();
  392. intersectors.intersector16 = BVH8Bezier1vIntersector16Hybrid_OBB();
  393. //intersectors.intersectorN = BVH8Bezier1vIntersectorStream_OBB();
  394. #endif
  395. return intersectors;
  396. }
  397. Accel::Intersectors BVH8Factory::BVH8Bezier1iIntersectors_OBB(BVH8* bvh)
  398. {
  399. Accel::Intersectors intersectors;
  400. intersectors.ptr = bvh;
  401. intersectors.intersector1 = BVH8Bezier1iIntersector1_OBB();
  402. #if defined (EMBREE_RAY_PACKETS)
  403. intersectors.intersector4 = BVH8Bezier1iIntersector4Hybrid_OBB();
  404. intersectors.intersector8 = BVH8Bezier1iIntersector8Hybrid_OBB();
  405. intersectors.intersector16 = BVH8Bezier1iIntersector16Hybrid_OBB();
  406. //intersectors.intersectorN = BVH8Bezier1iIntersectorStream_OBB();
  407. #endif
  408. return intersectors;
  409. }
  410. Accel::Intersectors BVH8Factory::BVH8Bezier1iMBIntersectors_OBB(BVH8* bvh)
  411. {
  412. Accel::Intersectors intersectors;
  413. intersectors.ptr = bvh;
  414. intersectors.intersector1 = BVH8Bezier1iMBIntersector1_OBB();
  415. #if defined (EMBREE_RAY_PACKETS)
  416. intersectors.intersector4 = BVH8Bezier1iMBIntersector4Hybrid_OBB();
  417. intersectors.intersector8 = BVH8Bezier1iMBIntersector8Hybrid_OBB();
  418. intersectors.intersector16 = BVH8Bezier1iMBIntersector16Hybrid_OBB();
  419. //intersectors.intersectorN = BVH8Bezier1iMBIntersectorStream_OBB();
  420. #endif
  421. return intersectors;
  422. }
  423. Accel::Intersectors BVH8Factory::BVH8Line4iIntersectors(BVH8* bvh)
  424. {
  425. Accel::Intersectors intersectors;
  426. intersectors.ptr = bvh;
  427. intersectors.intersector1 = BVH8Line4iIntersector1();
  428. #if defined (EMBREE_RAY_PACKETS)
  429. intersectors.intersector4 = BVH8Line4iIntersector4();
  430. intersectors.intersector8 = BVH8Line4iIntersector8();
  431. intersectors.intersector16 = BVH8Line4iIntersector16();
  432. //intersectors.intersectorN = BVH8Line4iIntersectorStream();
  433. #endif
  434. return intersectors;
  435. }
  436. Accel::Intersectors BVH8Factory::BVH8Line4iMBIntersectors(BVH8* bvh)
  437. {
  438. Accel::Intersectors intersectors;
  439. intersectors.ptr = bvh;
  440. intersectors.intersector1 = BVH8Line4iMBIntersector1();
  441. #if defined (EMBREE_RAY_PACKETS)
  442. intersectors.intersector4 = BVH8Line4iMBIntersector4();
  443. intersectors.intersector8 = BVH8Line4iMBIntersector8();
  444. intersectors.intersector16 = BVH8Line4iMBIntersector16();
  445. //intersectors.intersectorN = BVH8Line4iMBIntersectorStream();
  446. #endif
  447. return intersectors;
  448. }
  449. Accel::Intersectors BVH8Factory::BVH8Triangle4Intersectors(BVH8* bvh, IntersectVariant ivariant)
  450. {
  451. assert(ivariant == IntersectVariant::FAST);
  452. Accel::Intersectors intersectors;
  453. intersectors.ptr = bvh;
  454. intersectors.intersector1 = BVH8Triangle4Intersector1Moeller();
  455. #if defined (EMBREE_RAY_PACKETS)
  456. intersectors.intersector4_filter = BVH8Triangle4Intersector4HybridMoeller();
  457. intersectors.intersector4_nofilter = BVH8Triangle4Intersector4HybridMoellerNoFilter();
  458. intersectors.intersector8_filter = BVH8Triangle4Intersector8HybridMoeller();
  459. intersectors.intersector8_nofilter = BVH8Triangle4Intersector8HybridMoellerNoFilter();
  460. intersectors.intersector16_filter = BVH8Triangle4Intersector16HybridMoeller();
  461. intersectors.intersector16_nofilter = BVH8Triangle4Intersector16HybridMoellerNoFilter();
  462. intersectors.intersectorN_filter = BVH8Triangle4IntersectorStreamMoeller();
  463. intersectors.intersectorN_nofilter = BVH8Triangle4IntersectorStreamMoellerNoFilter();
  464. #endif
  465. return intersectors;
  466. }
  467. Accel::Intersectors BVH8Factory::BVH8Triangle4vIntersectors(BVH8* bvh, IntersectVariant ivariant)
  468. {
  469. assert(ivariant == IntersectVariant::ROBUST);
  470. Accel::Intersectors intersectors;
  471. intersectors.ptr = bvh;
  472. intersectors.intersector1 = BVH8Triangle4vIntersector1Pluecker();
  473. #if defined (EMBREE_RAY_PACKETS)
  474. intersectors.intersector4 = BVH8Triangle4vIntersector4HybridPluecker();
  475. intersectors.intersector8 = BVH8Triangle4vIntersector8HybridPluecker();
  476. intersectors.intersector16 = BVH8Triangle4vIntersector16HybridPluecker();
  477. intersectors.intersectorN = BVH8Triangle4vIntersectorStreamPluecker();
  478. #endif
  479. return intersectors;
  480. }
  481. Accel::Intersectors BVH8Factory::BVH8Triangle4iIntersectors(BVH8* bvh, IntersectVariant ivariant)
  482. {
  483. switch (ivariant) {
  484. case IntersectVariant::FAST:
  485. {
  486. Accel::Intersectors intersectors;
  487. intersectors.ptr = bvh;
  488. intersectors.intersector1 = BVH8Triangle4iIntersector1Moeller();
  489. #if defined (EMBREE_RAY_PACKETS)
  490. intersectors.intersector4 = BVH8Triangle4iIntersector4HybridMoeller();
  491. intersectors.intersector8 = BVH8Triangle4iIntersector8HybridMoeller();
  492. intersectors.intersector16 = BVH8Triangle4iIntersector16HybridMoeller();
  493. intersectors.intersectorN = BVH8Triangle4iIntersectorStreamMoeller();
  494. #endif
  495. return intersectors;
  496. }
  497. case IntersectVariant::ROBUST:
  498. {
  499. Accel::Intersectors intersectors;
  500. intersectors.ptr = bvh;
  501. intersectors.intersector1 = BVH8Triangle4iIntersector1Pluecker();
  502. #if defined (EMBREE_RAY_PACKETS)
  503. intersectors.intersector4 = BVH8Triangle4iIntersector4HybridPluecker();
  504. intersectors.intersector8 = BVH8Triangle4iIntersector8HybridPluecker();
  505. intersectors.intersector16 = BVH8Triangle4iIntersector16HybridPluecker();
  506. intersectors.intersectorN = BVH8Triangle4iIntersectorStreamPluecker();
  507. #endif
  508. return intersectors;
  509. }
  510. }
  511. return Accel::Intersectors();
  512. }
  513. Accel::Intersectors BVH8Factory::BVH8Triangle4vMBIntersectors(BVH8* bvh, IntersectVariant ivariant)
  514. {
  515. switch (ivariant) {
  516. case IntersectVariant::FAST:
  517. {
  518. Accel::Intersectors intersectors;
  519. intersectors.ptr = bvh;
  520. intersectors.intersector1 = BVH8Triangle4vMBIntersector1Moeller();
  521. #if defined (EMBREE_RAY_PACKETS)
  522. intersectors.intersector4 = BVH8Triangle4vMBIntersector4HybridMoeller();
  523. intersectors.intersector8 = BVH8Triangle4vMBIntersector8HybridMoeller();
  524. intersectors.intersector16 = BVH8Triangle4vMBIntersector16HybridMoeller();
  525. //intersectors.intersectorN = BVH8Triangle4vMBIntersectorStreamMoeller();
  526. #endif
  527. return intersectors;
  528. }
  529. case IntersectVariant::ROBUST:
  530. {
  531. Accel::Intersectors intersectors;
  532. intersectors.ptr = bvh;
  533. intersectors.intersector1 = BVH8Triangle4vMBIntersector1Pluecker();
  534. #if defined (EMBREE_RAY_PACKETS)
  535. intersectors.intersector4 = BVH8Triangle4vMBIntersector4HybridPluecker();
  536. intersectors.intersector8 = BVH8Triangle4vMBIntersector8HybridPluecker();
  537. intersectors.intersector16 = BVH8Triangle4vMBIntersector16HybridPluecker();
  538. //intersectors.intersectorN = BVH8Triangle4vMBIntersectorStreamPluecker();
  539. #endif
  540. return intersectors;
  541. }
  542. }
  543. return Accel::Intersectors();
  544. }
  545. Accel::Intersectors BVH8Factory::BVH8Triangle4iMBIntersectors(BVH8* bvh, IntersectVariant ivariant)
  546. {
  547. switch (ivariant) {
  548. case IntersectVariant::FAST:
  549. {
  550. Accel::Intersectors intersectors;
  551. intersectors.ptr = bvh;
  552. intersectors.intersector1 = BVH8Triangle4iMBIntersector1Moeller();
  553. #if defined (EMBREE_RAY_PACKETS)
  554. intersectors.intersector4 = BVH8Triangle4iMBIntersector4HybridMoeller();
  555. intersectors.intersector8 = BVH8Triangle4iMBIntersector8HybridMoeller();
  556. intersectors.intersector16 = BVH8Triangle4iMBIntersector16HybridMoeller();
  557. //intersectors.intersectorN = BVH8Triangle4iMBIntersectorStreamMoeller();
  558. #endif
  559. return intersectors;
  560. }
  561. case IntersectVariant::ROBUST:
  562. {
  563. Accel::Intersectors intersectors;
  564. intersectors.ptr = bvh;
  565. intersectors.intersector1 = BVH8Triangle4iMBIntersector1Pluecker();
  566. #if defined (EMBREE_RAY_PACKETS)
  567. intersectors.intersector4 = BVH8Triangle4iMBIntersector4HybridPluecker();
  568. intersectors.intersector8 = BVH8Triangle4iMBIntersector8HybridPluecker();
  569. intersectors.intersector16 = BVH8Triangle4iMBIntersector16HybridPluecker();
  570. //intersectors.intersectorN = BVH8Triangle4iMBIntersectorStreamPluecker();
  571. #endif
  572. return intersectors;
  573. }
  574. }
  575. return Accel::Intersectors();
  576. }
  577. Accel::Intersectors BVH8Factory::BVH8Quad4vIntersectors(BVH8* bvh, IntersectVariant ivariant)
  578. {
  579. switch (ivariant) {
  580. case IntersectVariant::FAST:
  581. {
  582. Accel::Intersectors intersectors;
  583. intersectors.ptr = bvh;
  584. intersectors.intersector1 = BVH8Quad4vIntersector1Moeller();
  585. #if defined (EMBREE_RAY_PACKETS)
  586. intersectors.intersector4_filter = BVH8Quad4vIntersector4HybridMoeller();
  587. intersectors.intersector4_nofilter = BVH8Quad4vIntersector4HybridMoellerNoFilter();
  588. intersectors.intersector8_filter = BVH8Quad4vIntersector8HybridMoeller();
  589. intersectors.intersector8_nofilter = BVH8Quad4vIntersector8HybridMoellerNoFilter();
  590. intersectors.intersector16_filter = BVH8Quad4vIntersector16HybridMoeller();
  591. intersectors.intersector16_nofilter = BVH8Quad4vIntersector16HybridMoellerNoFilter();
  592. intersectors.intersectorN_filter = BVH8Quad4vIntersectorStreamMoeller();
  593. intersectors.intersectorN_nofilter = BVH8Quad4vIntersectorStreamMoellerNoFilter();
  594. #endif
  595. return intersectors;
  596. }
  597. case IntersectVariant::ROBUST:
  598. {
  599. Accel::Intersectors intersectors;
  600. intersectors.ptr = bvh;
  601. intersectors.intersector1 = BVH8Quad4vIntersector1Pluecker();
  602. #if defined (EMBREE_RAY_PACKETS)
  603. intersectors.intersector4 = BVH8Quad4vIntersector4HybridPluecker();
  604. intersectors.intersector8 = BVH8Quad4vIntersector8HybridPluecker();
  605. intersectors.intersector16 = BVH8Quad4vIntersector16HybridPluecker();
  606. intersectors.intersectorN = BVH8Quad4vIntersectorStreamPluecker();
  607. #endif
  608. return intersectors;
  609. }
  610. }
  611. return Accel::Intersectors();
  612. }
  613. Accel::Intersectors BVH8Factory::BVH8Quad4iIntersectors(BVH8* bvh, IntersectVariant ivariant)
  614. {
  615. switch (ivariant) {
  616. case IntersectVariant::FAST:
  617. {
  618. Accel::Intersectors intersectors;
  619. intersectors.ptr = bvh;
  620. intersectors.intersector1 = BVH8Quad4iIntersector1Moeller();
  621. #if defined (EMBREE_RAY_PACKETS)
  622. intersectors.intersector4 = BVH8Quad4iIntersector4HybridMoeller();
  623. intersectors.intersector8 = BVH8Quad4iIntersector8HybridMoeller();
  624. intersectors.intersector16 = BVH8Quad4iIntersector16HybridMoeller();
  625. intersectors.intersectorN = BVH8Quad4iIntersectorStreamMoeller();
  626. #endif
  627. return intersectors;
  628. }
  629. case IntersectVariant::ROBUST:
  630. {
  631. Accel::Intersectors intersectors;
  632. intersectors.ptr = bvh;
  633. intersectors.intersector1 = BVH8Quad4iIntersector1Pluecker();
  634. #if defined (EMBREE_RAY_PACKETS)
  635. intersectors.intersector4 = BVH8Quad4iIntersector4HybridPluecker();
  636. intersectors.intersector8 = BVH8Quad4iIntersector8HybridPluecker();
  637. intersectors.intersector16 = BVH8Quad4iIntersector16HybridPluecker();
  638. intersectors.intersectorN = BVH8Quad4iIntersectorStreamPluecker();
  639. #endif
  640. return intersectors;
  641. }
  642. }
  643. return Accel::Intersectors();
  644. }
  645. Accel::Intersectors BVH8Factory::BVH8Quad4iMBIntersectors(BVH8* bvh, IntersectVariant ivariant)
  646. {
  647. switch (ivariant) {
  648. case IntersectVariant::FAST:
  649. {
  650. Accel::Intersectors intersectors;
  651. intersectors.ptr = bvh;
  652. intersectors.intersector1 = BVH8Quad4iMBIntersector1Moeller();
  653. #if defined (EMBREE_RAY_PACKETS)
  654. intersectors.intersector4 = BVH8Quad4iMBIntersector4HybridMoeller();
  655. intersectors.intersector8 = BVH8Quad4iMBIntersector8HybridMoeller();
  656. intersectors.intersector16 = BVH8Quad4iMBIntersector16HybridMoeller();
  657. //intersectors.intersectorN = BVH8Quad4iMBIntersectorStreamMoeller();
  658. #endif
  659. return intersectors;
  660. }
  661. case IntersectVariant::ROBUST:
  662. {
  663. Accel::Intersectors intersectors;
  664. intersectors.ptr = bvh;
  665. intersectors.intersector1 = BVH8Quad4iMBIntersector1Pluecker();
  666. #if defined (EMBREE_RAY_PACKETS)
  667. intersectors.intersector4 = BVH8Quad4iMBIntersector4HybridPluecker();
  668. intersectors.intersector8 = BVH8Quad4iMBIntersector8HybridPluecker();
  669. intersectors.intersector16 = BVH8Quad4iMBIntersector16HybridPluecker();
  670. //intersectors.intersectorN = BVH8Quad4iMBIntersectorStreamPluecker();
  671. #endif
  672. return intersectors;
  673. }
  674. }
  675. return Accel::Intersectors();
  676. }
  677. Accel::Intersectors BVH8Factory::QBVH8Triangle4iIntersectors(BVH8* bvh)
  678. {
  679. Accel::Intersectors intersectors;
  680. intersectors.ptr = bvh;
  681. intersectors.intersector1 = QBVH8Triangle4iIntersector1Pluecker();
  682. return intersectors;
  683. }
  684. Accel::Intersectors BVH8Factory::QBVH8Quad4iIntersectors(BVH8* bvh)
  685. {
  686. Accel::Intersectors intersectors;
  687. intersectors.ptr = bvh;
  688. intersectors.intersector1 = QBVH8Quad4iIntersector1Pluecker();
  689. return intersectors;
  690. }
  691. Accel* BVH8Factory::BVH8OBBBezier1v(Scene* scene)
  692. {
  693. BVH8* accel = new BVH8(Bezier1v::type,scene);
  694. Accel::Intersectors intersectors = BVH8Bezier1vIntersectors_OBB(accel);
  695. Builder* builder = BVH8Bezier1vBuilder_OBB_New(accel,scene,0);
  696. return new AccelInstance(accel,builder,intersectors);
  697. }
  698. Accel* BVH8Factory::BVH8OBBBezier1i(Scene* scene)
  699. {
  700. BVH8* accel = new BVH8(Bezier1i::type,scene);
  701. Accel::Intersectors intersectors = BVH8Bezier1iIntersectors_OBB(accel);
  702. Builder* builder = BVH8Bezier1iBuilder_OBB_New(accel,scene,0);
  703. scene->needBezierVertices = true;
  704. return new AccelInstance(accel,builder,intersectors);
  705. }
  706. Accel* BVH8Factory::BVH8OBBBezier1iMB(Scene* scene)
  707. {
  708. BVH8* accel = new BVH8(Bezier1i::type,scene);
  709. Accel::Intersectors intersectors = BVH8Bezier1iMBIntersectors_OBB(accel);
  710. Builder* builder = BVH8Bezier1iMBBuilder_OBB_New(accel,scene,0);
  711. scene->needBezierVertices = true;
  712. return new AccelInstance(accel,builder,intersectors);
  713. }
  714. Accel* BVH8Factory::BVH8Line4i(Scene* scene)
  715. {
  716. BVH8* accel = new BVH8(Line4i::type,scene);
  717. Accel::Intersectors intersectors = BVH8Line4iIntersectors(accel);
  718. Builder* builder = nullptr;
  719. if (scene->device->line_builder == "default" ) builder = BVH8Line4iSceneBuilderSAH(accel,scene,0);
  720. else throw_RTCError(RTC_INVALID_ARGUMENT,"unknown builder "+scene->device->line_builder+" for BVH8<Line4i>");
  721. scene->needLineVertices = true;
  722. return new AccelInstance(accel,builder,intersectors);
  723. }
  724. Accel* BVH8Factory::BVH8Line4iMB(Scene* scene)
  725. {
  726. BVH8* accel = new BVH8(Line4i::type,scene);
  727. Accel::Intersectors intersectors = BVH8Line4iMBIntersectors(accel);
  728. Builder* builder = nullptr;
  729. if (scene->device->line_builder_mb == "default" ) builder = BVH8Line4iMBSceneBuilderSAH(accel,scene,0);
  730. else throw_RTCError(RTC_INVALID_ARGUMENT,"unknown builder "+scene->device->line_builder_mb+" for BVH8MB<Line4i>");
  731. scene->needLineVertices = true;
  732. return new AccelInstance(accel,builder,intersectors);
  733. }
  734. Accel* BVH8Factory::BVH8Triangle4(Scene* scene, BuildVariant bvariant, IntersectVariant ivariant)
  735. {
  736. BVH8* accel = new BVH8(Triangle4::type,scene);
  737. Accel::Intersectors intersectors= BVH8Triangle4Intersectors(accel,ivariant);
  738. Builder* builder = nullptr;
  739. if (scene->device->tri_builder == "default") {
  740. switch (bvariant) {
  741. case BuildVariant::STATIC : builder = BVH8Triangle4SceneBuilderSAH(accel,scene,0); break;
  742. case BuildVariant::DYNAMIC : builder = BVH8BuilderTwoLevelTriangleMeshSAH(accel,scene,&createTriangleMeshTriangle4); break;
  743. case BuildVariant::HIGH_QUALITY: builder = BVH8Triangle4SceneBuilderFastSpatialSAH(accel,scene,0); break;
  744. }
  745. }
  746. else if (scene->device->tri_builder == "sah" ) builder = BVH8Triangle4SceneBuilderSAH(accel,scene,0);
  747. else if (scene->device->tri_builder == "sah_fast_spatial") builder = BVH8Triangle4SceneBuilderFastSpatialSAH(accel,scene,0);
  748. else if (scene->device->tri_builder == "sah_presplit") builder = BVH8Triangle4SceneBuilderSAH(accel,scene,MODE_HIGH_QUALITY);
  749. else if (scene->device->tri_builder == "dynamic" ) builder = BVH8BuilderTwoLevelTriangleMeshSAH(accel,scene,&createTriangleMeshTriangle4);
  750. else if (scene->device->tri_builder == "morton" ) builder = BVH8BuilderTwoLevelTriangleMeshSAH(accel,scene,&createTriangleMeshTriangle4Morton);
  751. else throw_RTCError(RTC_INVALID_ARGUMENT,"unknown builder "+scene->device->tri_builder+" for BVH8<Triangle4>");
  752. return new AccelInstance(accel,builder,intersectors);
  753. }
  754. Accel* BVH8Factory::BVH8Triangle4v(Scene* scene, BuildVariant bvariant, IntersectVariant ivariant)
  755. {
  756. BVH8* accel = new BVH8(Triangle4v::type,scene);
  757. Accel::Intersectors intersectors= BVH8Triangle4vIntersectors(accel,ivariant);
  758. Builder* builder = nullptr;
  759. if (scene->device->tri_builder == "default") {
  760. switch (bvariant) {
  761. case BuildVariant::STATIC : builder = BVH8Triangle4vSceneBuilderSAH(accel,scene,0); break;
  762. case BuildVariant::DYNAMIC : builder = BVH8BuilderTwoLevelTriangleMeshSAH(accel,scene,&createTriangleMeshTriangle4v); break;
  763. case BuildVariant::HIGH_QUALITY: builder = BVH8Triangle4vSceneBuilderFastSpatialSAH(accel,scene,0); break;
  764. }
  765. }
  766. else throw_RTCError(RTC_INVALID_ARGUMENT,"unknown builder "+scene->device->tri_builder+" for BVH8<Triangle4v>");
  767. return new AccelInstance(accel,builder,intersectors);
  768. }
  769. Accel* BVH8Factory::BVH8Triangle4i(Scene* scene, BuildVariant bvariant, IntersectVariant ivariant)
  770. {
  771. BVH8* accel = new BVH8(Triangle4i::type,scene);
  772. Accel::Intersectors intersectors = BVH8Triangle4iIntersectors(accel,ivariant);
  773. Builder* builder = nullptr;
  774. if (scene->device->tri_builder == "default") {
  775. switch (bvariant) {
  776. case BuildVariant::STATIC : builder = BVH8Triangle4iSceneBuilderSAH(accel,scene,0); break;
  777. case BuildVariant::DYNAMIC : builder = BVH8BuilderTwoLevelTriangleMeshSAH(accel,scene,&createTriangleMeshTriangle4i); break;
  778. case BuildVariant::HIGH_QUALITY: assert(false); break; // FIXME: implement
  779. }
  780. }
  781. else throw_RTCError(RTC_INVALID_ARGUMENT,"unknown builder "+scene->device->tri_builder+" for BVH8<Triangle4i>");
  782. scene->needTriangleVertices = true;
  783. return new AccelInstance(accel,builder,intersectors);
  784. }
  785. Accel* BVH8Factory::BVH8Triangle4vMB(Scene* scene, BuildVariant bvariant, IntersectVariant ivariant)
  786. {
  787. BVH8* accel = new BVH8(Triangle4vMB::type,scene);
  788. Accel::Intersectors intersectors= BVH8Triangle4vMBIntersectors(accel,ivariant);
  789. Builder* builder = nullptr;
  790. if (scene->device->tri_builder_mb == "default") {
  791. switch (bvariant) {
  792. case BuildVariant::STATIC : builder = BVH8Triangle4vMBSceneBuilderSAH(accel,scene,0); break;
  793. case BuildVariant::DYNAMIC : assert(false); break; // FIXME: implement
  794. case BuildVariant::HIGH_QUALITY: assert(false); break;
  795. }
  796. }
  797. else if (scene->device->tri_builder_mb == "sah") builder = BVH8Triangle4vMBSceneBuilderSAH(accel,scene,0);
  798. else throw_RTCError(RTC_INVALID_ARGUMENT,"unknown builder "+scene->device->tri_builder_mb+" for BVH8MB<Triangle4vMB>");
  799. return new AccelInstance(accel,builder,intersectors);
  800. }
  801. Accel* BVH8Factory::BVH8Triangle4iMB(Scene* scene, BuildVariant bvariant, IntersectVariant ivariant)
  802. {
  803. BVH8* accel = new BVH8(Triangle4iMB::type,scene);
  804. Accel::Intersectors intersectors= BVH8Triangle4iMBIntersectors(accel,ivariant);
  805. Builder* builder = nullptr;
  806. if (scene->device->tri_builder_mb == "default") {
  807. switch (bvariant) {
  808. case BuildVariant::STATIC : builder = BVH8Triangle4iMBSceneBuilderSAH(accel,scene,0); break;
  809. case BuildVariant::DYNAMIC : assert(false); break; // FIXME: implement
  810. case BuildVariant::HIGH_QUALITY: assert(false); break;
  811. }
  812. }
  813. else if (scene->device->tri_builder_mb == "sah") builder = BVH8Triangle4iMBSceneBuilderSAH(accel,scene,0);
  814. else throw_RTCError(RTC_INVALID_ARGUMENT,"unknown builder "+scene->device->tri_builder_mb+" for BVH8MB<Triangle4iMB>");
  815. scene->needTriangleVertices = true;
  816. return new AccelInstance(accel,builder,intersectors);
  817. }
  818. Accel* BVH8Factory::BVH8QuantizedTriangle4i(Scene* scene)
  819. {
  820. BVH8* accel = new BVH8(Triangle4i::type,scene);
  821. Accel::Intersectors intersectors = QBVH8Triangle4iIntersectors(accel);
  822. Builder* builder = BVH8QuantizedTriangle4iSceneBuilderSAH(accel,scene,0);
  823. scene->needTriangleVertices = true;
  824. return new AccelInstance(accel,builder,intersectors);
  825. }
  826. Accel* BVH8Factory::BVH8Quad4v(Scene* scene, BuildVariant bvariant, IntersectVariant ivariant)
  827. {
  828. BVH8* accel = new BVH8(Quad4v::type,scene);
  829. Accel::Intersectors intersectors = BVH8Quad4vIntersectors(accel,ivariant);
  830. Builder* builder = nullptr;
  831. if (scene->device->quad_builder == "default") {
  832. switch (bvariant) {
  833. case BuildVariant::STATIC : builder = BVH8Quad4vSceneBuilderSAH(accel,scene,0); break;
  834. case BuildVariant::DYNAMIC : builder = BVH8BuilderTwoLevelQuadMeshSAH(accel,scene,&createQuadMeshQuad4v); break;
  835. case BuildVariant::HIGH_QUALITY: builder = BVH8Quad4vSceneBuilderFastSpatialSAH(accel,scene,0); break;
  836. }
  837. }
  838. else if (scene->device->quad_builder == "dynamic" ) builder = BVH8BuilderTwoLevelQuadMeshSAH(accel,scene,&createQuadMeshQuad4v);
  839. else if (scene->device->quad_builder == "morton" ) builder = BVH8BuilderTwoLevelQuadMeshSAH(accel,scene,&createQuadMeshQuad4vMorton);
  840. else if (scene->device->quad_builder == "sah_fast_spatial" ) builder = BVH8Quad4vSceneBuilderFastSpatialSAH(accel,scene,0);
  841. else throw_RTCError(RTC_INVALID_ARGUMENT,"unknown builder "+scene->device->quad_builder+" for BVH8<Quad4v>");
  842. return new AccelInstance(accel,builder,intersectors);
  843. }
  844. Accel* BVH8Factory::BVH8Quad4i(Scene* scene, BuildVariant bvariant, IntersectVariant ivariant)
  845. {
  846. BVH8* accel = new BVH8(Quad4i::type,scene);
  847. Accel::Intersectors intersectors = BVH8Quad4iIntersectors(accel,ivariant);
  848. Builder* builder = nullptr;
  849. if (scene->device->quad_builder == "default") {
  850. switch (bvariant) {
  851. case BuildVariant::STATIC : builder = BVH8Quad4iSceneBuilderSAH(accel,scene,0); break;
  852. case BuildVariant::DYNAMIC : assert(false); break; // FIXME: implement
  853. case BuildVariant::HIGH_QUALITY: assert(false); break; // FIXME: implement
  854. }
  855. }
  856. else throw_RTCError(RTC_INVALID_ARGUMENT,"unknown builder "+scene->device->quad_builder+" for BVH8<Quad4i>");
  857. scene->needQuadVertices = true;
  858. return new AccelInstance(accel,builder,intersectors);
  859. }
  860. Accel* BVH8Factory::BVH8Quad4iMB(Scene* scene, BuildVariant bvariant, IntersectVariant ivariant)
  861. {
  862. BVH8* accel = new BVH8(Quad4iMB::type,scene);
  863. Accel::Intersectors intersectors = BVH8Quad4iMBIntersectors(accel,ivariant);
  864. Builder* builder = nullptr;
  865. if (scene->device->quad_builder_mb == "default") {
  866. switch (bvariant) {
  867. case BuildVariant::STATIC : builder = BVH8Quad4iMBSceneBuilderSAH(accel,scene,0); break;
  868. case BuildVariant::DYNAMIC : assert(false); break; // FIXME: implement
  869. case BuildVariant::HIGH_QUALITY: assert(false); break;
  870. }
  871. }
  872. else throw_RTCError(RTC_INVALID_ARGUMENT,"unknown builder "+scene->device->quad_builder_mb+" for BVH8MB<Quad4i>");
  873. scene->needQuadVertices = true;
  874. return new AccelInstance(accel,builder,intersectors);
  875. }
  876. Accel* BVH8Factory::BVH8QuantizedQuad4i(Scene* scene)
  877. {
  878. BVH8* accel = new BVH8(Quad4i::type,scene);
  879. Accel::Intersectors intersectors = QBVH8Quad4iIntersectors(accel);
  880. Builder* builder = nullptr;
  881. if (scene->device->quad_builder == "default" ) builder = BVH8QuantizedQuad4iSceneBuilderSAH(accel,scene,0);
  882. else throw_RTCError(RTC_INVALID_ARGUMENT,"unknown builder "+scene->device->quad_builder+" for QBVH8<Quad4i>");
  883. scene->needQuadVertices = true;
  884. return new AccelInstance(accel,builder,intersectors);
  885. }
  886. }
  887. #endif