bvh8_factory.cpp 60 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190
  1. // Copyright 2009-2021 Intel Corporation
  2. // SPDX-License-Identifier: Apache-2.0
  3. #include "../common/isa.h" // to define EMBREE_TARGET_SIMD8
  4. #if defined (EMBREE_TARGET_SIMD8)
  5. #include "bvh8_factory.h"
  6. #include "../bvh/bvh.h"
  7. #include "../geometry/curveNv.h"
  8. #include "../geometry/curveNi.h"
  9. #include "../geometry/curveNi_mb.h"
  10. #include "../geometry/linei.h"
  11. #include "../geometry/triangle.h"
  12. #include "../geometry/trianglev.h"
  13. #include "../geometry/trianglev_mb.h"
  14. #include "../geometry/trianglei.h"
  15. #include "../geometry/quadv.h"
  16. #include "../geometry/quadi.h"
  17. #include "../geometry/subdivpatch1.h"
  18. #include "../geometry/object.h"
  19. #include "../geometry/instance.h"
  20. #include "../geometry/instance_array.h"
  21. #include "../geometry/subgrid.h"
  22. #include "../common/accelinstance.h"
  23. namespace embree
  24. {
  25. DECLARE_SYMBOL2(Accel::Collider,BVH8ColliderUserGeom);
  26. DECLARE_ISA_FUNCTION(VirtualCurveIntersector*,VirtualCurveIntersector8v,void);
  27. DECLARE_ISA_FUNCTION(VirtualCurveIntersector*,VirtualCurveIntersector8iMB,void);
  28. DECLARE_SYMBOL2(Accel::Intersector1,BVH8OBBVirtualCurveIntersector1);
  29. DECLARE_SYMBOL2(Accel::Intersector1,BVH8OBBVirtualCurveIntersector1MB);
  30. DECLARE_SYMBOL2(Accel::Intersector1,BVH8OBBVirtualCurveIntersectorRobust1);
  31. DECLARE_SYMBOL2(Accel::Intersector1,BVH8OBBVirtualCurveIntersectorRobust1MB);
  32. DECLARE_SYMBOL2(Accel::Intersector1,BVH8Triangle4Intersector1Moeller);
  33. DECLARE_SYMBOL2(Accel::Intersector1,BVH8Triangle4iIntersector1Moeller);
  34. DECLARE_SYMBOL2(Accel::Intersector1,BVH8Triangle4vIntersector1Pluecker);
  35. DECLARE_SYMBOL2(Accel::Intersector1,BVH8Triangle4iIntersector1Pluecker);
  36. DECLARE_SYMBOL2(Accel::Intersector1,BVH8Triangle4vIntersector1Woop);
  37. DECLARE_SYMBOL2(Accel::Intersector1,BVH8Triangle4vMBIntersector1Moeller);
  38. DECLARE_SYMBOL2(Accel::Intersector1,BVH8Triangle4iMBIntersector1Moeller);
  39. DECLARE_SYMBOL2(Accel::Intersector1,BVH8Triangle4vMBIntersector1Pluecker);
  40. DECLARE_SYMBOL2(Accel::Intersector1,BVH8Triangle4iMBIntersector1Pluecker);
  41. DECLARE_SYMBOL2(Accel::Intersector1,BVH8Quad4vIntersector1Moeller);
  42. DECLARE_SYMBOL2(Accel::Intersector1,BVH8Quad4iIntersector1Moeller);
  43. DECLARE_SYMBOL2(Accel::Intersector1,BVH8Quad4vIntersector1Pluecker);
  44. DECLARE_SYMBOL2(Accel::Intersector1,BVH8Quad4iIntersector1Pluecker);
  45. DECLARE_SYMBOL2(Accel::Intersector1,BVH8Quad4iMBIntersector1Moeller);
  46. DECLARE_SYMBOL2(Accel::Intersector1,BVH8Quad4iMBIntersector1Pluecker);
  47. DECLARE_SYMBOL2(Accel::Intersector1,QBVH8Triangle4iIntersector1Pluecker);
  48. DECLARE_SYMBOL2(Accel::Intersector1,QBVH8Triangle4Intersector1Moeller);
  49. DECLARE_SYMBOL2(Accel::Intersector1,QBVH8Quad4iIntersector1Pluecker);
  50. DECLARE_SYMBOL2(Accel::Intersector1,BVH8VirtualIntersector1);
  51. DECLARE_SYMBOL2(Accel::Intersector1,BVH8VirtualMBIntersector1);
  52. DECLARE_SYMBOL2(Accel::Intersector1,BVH8InstanceIntersector1);
  53. DECLARE_SYMBOL2(Accel::Intersector1,BVH8InstanceMBIntersector1);
  54. DECLARE_SYMBOL2(Accel::Intersector1,BVH8InstanceArrayIntersector1);
  55. DECLARE_SYMBOL2(Accel::Intersector1,BVH8InstanceArrayMBIntersector1);
  56. DECLARE_SYMBOL2(Accel::Intersector1,BVH8GridIntersector1Moeller);
  57. DECLARE_SYMBOL2(Accel::Intersector1,BVH8GridMBIntersector1Moeller);
  58. DECLARE_SYMBOL2(Accel::Intersector1,BVH8GridIntersector1Pluecker);
  59. DECLARE_SYMBOL2(Accel::Intersector4,BVH8OBBVirtualCurveIntersector4Hybrid);
  60. DECLARE_SYMBOL2(Accel::Intersector4,BVH8OBBVirtualCurveIntersector4HybridMB);
  61. DECLARE_SYMBOL2(Accel::Intersector4,BVH8OBBVirtualCurveIntersectorRobust4Hybrid);
  62. DECLARE_SYMBOL2(Accel::Intersector4,BVH8OBBVirtualCurveIntersectorRobust4HybridMB);
  63. DECLARE_SYMBOL2(Accel::Intersector4,BVH8Triangle4Intersector4HybridMoeller);
  64. DECLARE_SYMBOL2(Accel::Intersector4,BVH8Triangle4Intersector4HybridMoellerNoFilter);
  65. DECLARE_SYMBOL2(Accel::Intersector4,BVH8Triangle4iIntersector4HybridMoeller);
  66. DECLARE_SYMBOL2(Accel::Intersector4,BVH8Triangle4vIntersector4HybridPluecker);
  67. DECLARE_SYMBOL2(Accel::Intersector4,BVH8Triangle4iIntersector4HybridPluecker);
  68. DECLARE_SYMBOL2(Accel::Intersector4,BVH8Triangle4vMBIntersector4HybridMoeller);
  69. DECLARE_SYMBOL2(Accel::Intersector4,BVH8Triangle4iMBIntersector4HybridMoeller);
  70. DECLARE_SYMBOL2(Accel::Intersector4,BVH8Triangle4vMBIntersector4HybridPluecker);
  71. DECLARE_SYMBOL2(Accel::Intersector4,BVH8Triangle4iMBIntersector4HybridPluecker);
  72. DECLARE_SYMBOL2(Accel::Intersector4,BVH8Quad4vIntersector4HybridMoeller);
  73. DECLARE_SYMBOL2(Accel::Intersector4,BVH8Quad4vIntersector4HybridMoellerNoFilter);
  74. DECLARE_SYMBOL2(Accel::Intersector4,BVH8Quad4iIntersector4HybridMoeller);
  75. DECLARE_SYMBOL2(Accel::Intersector4,BVH8Quad4vIntersector4HybridPluecker);
  76. DECLARE_SYMBOL2(Accel::Intersector4,BVH8Quad4iIntersector4HybridPluecker);
  77. DECLARE_SYMBOL2(Accel::Intersector4,BVH8Quad4iMBIntersector4HybridMoeller);
  78. DECLARE_SYMBOL2(Accel::Intersector4,BVH8Quad4iMBIntersector4HybridPluecker);
  79. DECLARE_SYMBOL2(Accel::Intersector4,BVH8VirtualIntersector4Chunk);
  80. DECLARE_SYMBOL2(Accel::Intersector4,BVH8VirtualMBIntersector4Chunk);
  81. DECLARE_SYMBOL2(Accel::Intersector4,BVH8InstanceIntersector4Chunk);
  82. DECLARE_SYMBOL2(Accel::Intersector4,BVH8InstanceMBIntersector4Chunk);
  83. DECLARE_SYMBOL2(Accel::Intersector4,BVH8InstanceArrayIntersector4Chunk);
  84. DECLARE_SYMBOL2(Accel::Intersector4,BVH8InstanceArrayMBIntersector4Chunk);
  85. DECLARE_SYMBOL2(Accel::Intersector4,BVH8GridIntersector4HybridMoeller);
  86. DECLARE_SYMBOL2(Accel::Intersector4,BVH8GridIntersector4HybridPluecker);
  87. DECLARE_SYMBOL2(Accel::Intersector8,BVH8OBBVirtualCurveIntersector8Hybrid);
  88. DECLARE_SYMBOL2(Accel::Intersector8,BVH8OBBVirtualCurveIntersector8HybridMB);
  89. DECLARE_SYMBOL2(Accel::Intersector8,BVH8OBBVirtualCurveIntersectorRobust8Hybrid);
  90. DECLARE_SYMBOL2(Accel::Intersector8,BVH8OBBVirtualCurveIntersectorRobust8HybridMB);
  91. DECLARE_SYMBOL2(Accel::Intersector8,BVH8Triangle4Intersector8HybridMoeller);
  92. DECLARE_SYMBOL2(Accel::Intersector8,BVH8Triangle4Intersector8HybridMoellerNoFilter);
  93. DECLARE_SYMBOL2(Accel::Intersector8,BVH8Triangle4iIntersector8HybridMoeller);
  94. DECLARE_SYMBOL2(Accel::Intersector8,BVH8Triangle4vIntersector8HybridPluecker);
  95. DECLARE_SYMBOL2(Accel::Intersector8,BVH8Triangle4iIntersector8HybridPluecker);
  96. DECLARE_SYMBOL2(Accel::Intersector8,BVH8Triangle4vMBIntersector8HybridMoeller);
  97. DECLARE_SYMBOL2(Accel::Intersector8,BVH8Triangle4iMBIntersector8HybridMoeller);
  98. DECLARE_SYMBOL2(Accel::Intersector8,BVH8Triangle4vMBIntersector8HybridPluecker);
  99. DECLARE_SYMBOL2(Accel::Intersector8,BVH8Triangle4iMBIntersector8HybridPluecker);
  100. DECLARE_SYMBOL2(Accel::Intersector8,BVH8Quad4vIntersector8HybridMoeller);
  101. DECLARE_SYMBOL2(Accel::Intersector8,BVH8Quad4vIntersector8HybridMoellerNoFilter);
  102. DECLARE_SYMBOL2(Accel::Intersector8,BVH8Quad4iIntersector8HybridMoeller);
  103. DECLARE_SYMBOL2(Accel::Intersector8,BVH8Quad4vIntersector8HybridPluecker);
  104. DECLARE_SYMBOL2(Accel::Intersector8,BVH8Quad4iIntersector8HybridPluecker);
  105. DECLARE_SYMBOL2(Accel::Intersector8,BVH8Quad4iMBIntersector8HybridMoeller);
  106. DECLARE_SYMBOL2(Accel::Intersector8,BVH8Quad4iMBIntersector8HybridPluecker);
  107. DECLARE_SYMBOL2(Accel::Intersector8,BVH8VirtualIntersector8Chunk);
  108. DECLARE_SYMBOL2(Accel::Intersector8,BVH8VirtualMBIntersector8Chunk);
  109. DECLARE_SYMBOL2(Accel::Intersector8,BVH8InstanceIntersector8Chunk);
  110. DECLARE_SYMBOL2(Accel::Intersector8,BVH8InstanceMBIntersector8Chunk);
  111. DECLARE_SYMBOL2(Accel::Intersector8,BVH8InstanceArrayIntersector8Chunk);
  112. DECLARE_SYMBOL2(Accel::Intersector8,BVH8InstanceArrayMBIntersector8Chunk);
  113. DECLARE_SYMBOL2(Accel::Intersector8,BVH8GridIntersector8HybridMoeller);
  114. DECLARE_SYMBOL2(Accel::Intersector8,BVH8GridIntersector8HybridPluecker);
  115. DECLARE_SYMBOL2(Accel::Intersector16,BVH8OBBVirtualCurveIntersector16Hybrid);
  116. DECLARE_SYMBOL2(Accel::Intersector16,BVH8OBBVirtualCurveIntersector16HybridMB);
  117. DECLARE_SYMBOL2(Accel::Intersector16,BVH8OBBVirtualCurveIntersectorRobust16Hybrid);
  118. DECLARE_SYMBOL2(Accel::Intersector16,BVH8OBBVirtualCurveIntersectorRobust16HybridMB);
  119. DECLARE_SYMBOL2(Accel::Intersector16,BVH8Triangle4Intersector16HybridMoeller);
  120. DECLARE_SYMBOL2(Accel::Intersector16,BVH8Triangle4Intersector16HybridMoellerNoFilter);
  121. DECLARE_SYMBOL2(Accel::Intersector16,BVH8Triangle4iIntersector16HybridMoeller);
  122. DECLARE_SYMBOL2(Accel::Intersector16,BVH8Triangle4vIntersector16HybridPluecker);
  123. DECLARE_SYMBOL2(Accel::Intersector16,BVH8Triangle4iIntersector16HybridPluecker);
  124. DECLARE_SYMBOL2(Accel::Intersector16,BVH8Triangle4vMBIntersector16HybridMoeller);
  125. DECLARE_SYMBOL2(Accel::Intersector16,BVH8Triangle4iMBIntersector16HybridMoeller);
  126. DECLARE_SYMBOL2(Accel::Intersector16,BVH8Triangle4vMBIntersector16HybridPluecker);
  127. DECLARE_SYMBOL2(Accel::Intersector16,BVH8Triangle4iMBIntersector16HybridPluecker);
  128. DECLARE_SYMBOL2(Accel::Intersector16,BVH8Quad4vIntersector16HybridMoeller);
  129. DECLARE_SYMBOL2(Accel::Intersector16,BVH8Quad4vIntersector16HybridMoellerNoFilter);
  130. DECLARE_SYMBOL2(Accel::Intersector16,BVH8Quad4iIntersector16HybridMoeller);
  131. DECLARE_SYMBOL2(Accel::Intersector16,BVH8Quad4vIntersector16HybridPluecker);
  132. DECLARE_SYMBOL2(Accel::Intersector16,BVH8Quad4iIntersector16HybridPluecker);
  133. DECLARE_SYMBOL2(Accel::Intersector16,BVH8Quad4iMBIntersector16HybridMoeller);
  134. DECLARE_SYMBOL2(Accel::Intersector16,BVH8Quad4iMBIntersector16HybridPluecker);
  135. DECLARE_SYMBOL2(Accel::Intersector16,BVH8VirtualIntersector16Chunk);
  136. DECLARE_SYMBOL2(Accel::Intersector16,BVH8VirtualMBIntersector16Chunk);
  137. DECLARE_SYMBOL2(Accel::Intersector16,BVH8InstanceIntersector16Chunk);
  138. DECLARE_SYMBOL2(Accel::Intersector16,BVH8InstanceMBIntersector16Chunk);
  139. DECLARE_SYMBOL2(Accel::Intersector16,BVH8InstanceArrayIntersector16Chunk);
  140. DECLARE_SYMBOL2(Accel::Intersector16,BVH8InstanceArrayMBIntersector16Chunk);
  141. DECLARE_SYMBOL2(Accel::Intersector16,BVH8GridIntersector16HybridMoeller);
  142. DECLARE_SYMBOL2(Accel::Intersector16,BVH8GridIntersector16HybridPluecker);
  143. DECLARE_ISA_FUNCTION(Builder*,BVH8Curve8vBuilder_OBB_New,void* COMMA Scene* COMMA size_t);
  144. DECLARE_ISA_FUNCTION(Builder*,BVH8OBBCurve8iMBBuilder_OBB,void* COMMA Scene* COMMA size_t);
  145. DECLARE_ISA_FUNCTION(Builder*,BVH8Triangle4SceneBuilderSAH,void* COMMA Scene* COMMA size_t);
  146. DECLARE_ISA_FUNCTION(Builder*,BVH8Triangle4vSceneBuilderSAH,void* COMMA Scene* COMMA size_t);
  147. DECLARE_ISA_FUNCTION(Builder*,BVH8Triangle4iSceneBuilderSAH,void* COMMA Scene* COMMA size_t);
  148. DECLARE_ISA_FUNCTION(Builder*,BVH8Triangle4iMBSceneBuilderSAH,void* COMMA Scene* COMMA size_t);
  149. DECLARE_ISA_FUNCTION(Builder*,BVH8Triangle4vMBSceneBuilderSAH,void* COMMA Scene* COMMA size_t);
  150. DECLARE_ISA_FUNCTION(Builder*,BVH8QuantizedTriangle4iSceneBuilderSAH,void* COMMA Scene* COMMA size_t);
  151. DECLARE_ISA_FUNCTION(Builder*,BVH8QuantizedTriangle4SceneBuilderSAH,void* COMMA Scene* COMMA size_t);
  152. DECLARE_ISA_FUNCTION(Builder*,BVH8Quad4vSceneBuilderSAH,void* COMMA Scene* COMMA size_t);
  153. DECLARE_ISA_FUNCTION(Builder*,BVH8Quad4iSceneBuilderSAH,void* COMMA Scene* COMMA size_t);
  154. DECLARE_ISA_FUNCTION(Builder*,BVH8Quad4iMBSceneBuilderSAH,void* COMMA Scene* COMMA size_t);
  155. DECLARE_ISA_FUNCTION(Builder*,BVH8QuantizedQuad4iSceneBuilderSAH,void* COMMA Scene* COMMA size_t);
  156. DECLARE_ISA_FUNCTION(Builder*,BVH8VirtualSceneBuilderSAH,void* COMMA Scene* COMMA size_t);
  157. DECLARE_ISA_FUNCTION(Builder*,BVH8VirtualMBSceneBuilderSAH,void* COMMA Scene* COMMA size_t);
  158. DECLARE_ISA_FUNCTION(Builder*,BVH8InstanceSceneBuilderSAH,void* COMMA Scene* COMMA Geometry::GTypeMask);
  159. DECLARE_ISA_FUNCTION(Builder*,BVH8InstanceMBSceneBuilderSAH,void* COMMA Scene* COMMA Geometry::GTypeMask);
  160. DECLARE_ISA_FUNCTION(Builder*,BVH8InstanceArraySceneBuilderSAH,void* COMMA Scene* COMMA Geometry::GTypeMask);
  161. DECLARE_ISA_FUNCTION(Builder*,BVH8InstanceArrayMBSceneBuilderSAH,void* COMMA Scene* COMMA Geometry::GTypeMask);
  162. DECLARE_ISA_FUNCTION(Builder*,BVH8Triangle4SceneBuilderFastSpatialSAH,void* COMMA Scene* COMMA size_t);
  163. DECLARE_ISA_FUNCTION(Builder*,BVH8Triangle4vSceneBuilderFastSpatialSAH,void* COMMA Scene* COMMA size_t);
  164. DECLARE_ISA_FUNCTION(Builder*,BVH8Quad4vSceneBuilderFastSpatialSAH,void* COMMA Scene* COMMA size_t);
  165. DECLARE_ISA_FUNCTION(Builder*,BVH8GridSceneBuilderSAH,void* COMMA Scene* COMMA size_t);
  166. DECLARE_ISA_FUNCTION(Builder*,BVH8GridMBSceneBuilderSAH,void* COMMA Scene* COMMA size_t);
  167. DECLARE_ISA_FUNCTION(Builder*,BVH8BuilderTwoLevelTriangle4MeshSAH,void* COMMA Scene* COMMA bool);
  168. DECLARE_ISA_FUNCTION(Builder*,BVH8BuilderTwoLevelTriangle4vMeshSAH,void* COMMA Scene* COMMA bool);
  169. DECLARE_ISA_FUNCTION(Builder*,BVH8BuilderTwoLevelTriangle4iMeshSAH,void* COMMA Scene* COMMA bool);
  170. DECLARE_ISA_FUNCTION(Builder*,BVH8BuilderTwoLevelQuadMeshSAH,void* COMMA Scene* COMMA bool);
  171. DECLARE_ISA_FUNCTION(Builder*,BVH8BuilderTwoLevelVirtualSAH,void* COMMA Scene* COMMA bool);
  172. DECLARE_ISA_FUNCTION(Builder*,BVH8BuilderTwoLevelInstanceSAH,void* COMMA Scene* COMMA Geometry::GTypeMask COMMA bool);
  173. DECLARE_ISA_FUNCTION(Builder*,BVH8BuilderTwoLevelInstanceArraySAH,void* COMMA Scene* COMMA Geometry::GTypeMask COMMA bool);
  174. BVH8Factory::BVH8Factory(int bfeatures, int ifeatures)
  175. {
  176. SELECT_SYMBOL_INIT_AVX(ifeatures,BVH8ColliderUserGeom);
  177. selectBuilders(bfeatures);
  178. selectIntersectors(ifeatures);
  179. }
  180. void BVH8Factory::selectBuilders(int features)
  181. {
  182. IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX(features,BVH8Curve8vBuilder_OBB_New));
  183. IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX(features,BVH8OBBCurve8iMBBuilder_OBB));
  184. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX(features,BVH8Triangle4SceneBuilderSAH));
  185. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX(features,BVH8Triangle4vSceneBuilderSAH));
  186. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX(features,BVH8Triangle4iSceneBuilderSAH));
  187. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX(features,BVH8Triangle4iMBSceneBuilderSAH));
  188. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX(features,BVH8Triangle4vMBSceneBuilderSAH));
  189. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX(features,BVH8QuantizedTriangle4iSceneBuilderSAH));
  190. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX(features,BVH8QuantizedTriangle4SceneBuilderSAH));
  191. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX(features,BVH8Quad4vSceneBuilderSAH));
  192. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX(features,BVH8Quad4iSceneBuilderSAH));
  193. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX(features,BVH8Quad4iMBSceneBuilderSAH));
  194. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX(features,BVH8QuantizedQuad4iSceneBuilderSAH));
  195. IF_ENABLED_USER(SELECT_SYMBOL_INIT_AVX(features,BVH8VirtualSceneBuilderSAH));
  196. IF_ENABLED_USER(SELECT_SYMBOL_INIT_AVX(features,BVH8VirtualMBSceneBuilderSAH));
  197. IF_ENABLED_INSTANCE(SELECT_SYMBOL_INIT_AVX(features,BVH8InstanceSceneBuilderSAH));
  198. IF_ENABLED_INSTANCE(SELECT_SYMBOL_INIT_AVX(features,BVH8InstanceMBSceneBuilderSAH));
  199. IF_ENABLED_INSTANCE_ARRAY(SELECT_SYMBOL_INIT_AVX(features,BVH8InstanceArraySceneBuilderSAH));
  200. IF_ENABLED_INSTANCE_ARRAY(SELECT_SYMBOL_INIT_AVX(features,BVH8InstanceArrayMBSceneBuilderSAH));
  201. IF_ENABLED_GRIDS(SELECT_SYMBOL_INIT_AVX(features,BVH8GridSceneBuilderSAH));
  202. IF_ENABLED_GRIDS(SELECT_SYMBOL_INIT_AVX(features,BVH8GridMBSceneBuilderSAH));
  203. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX(features,BVH8Triangle4SceneBuilderFastSpatialSAH));
  204. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX(features,BVH8Triangle4vSceneBuilderFastSpatialSAH));
  205. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX(features,BVH8Quad4vSceneBuilderFastSpatialSAH));
  206. IF_ENABLED_TRIS (SELECT_SYMBOL_INIT_AVX(features,BVH8BuilderTwoLevelTriangle4MeshSAH));
  207. IF_ENABLED_TRIS (SELECT_SYMBOL_INIT_AVX(features,BVH8BuilderTwoLevelTriangle4vMeshSAH));
  208. IF_ENABLED_TRIS (SELECT_SYMBOL_INIT_AVX(features,BVH8BuilderTwoLevelTriangle4iMeshSAH));
  209. IF_ENABLED_QUADS (SELECT_SYMBOL_INIT_AVX(features,BVH8BuilderTwoLevelQuadMeshSAH));
  210. IF_ENABLED_USER (SELECT_SYMBOL_INIT_AVX(features,BVH8BuilderTwoLevelVirtualSAH));
  211. IF_ENABLED_INSTANCE (SELECT_SYMBOL_INIT_AVX(features,BVH8BuilderTwoLevelInstanceSAH));
  212. IF_ENABLED_INSTANCE_ARRAY (SELECT_SYMBOL_INIT_AVX(features,BVH8BuilderTwoLevelInstanceArraySAH));
  213. }
  214. void BVH8Factory::selectIntersectors(int features)
  215. {
  216. IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,VirtualCurveIntersector8v));
  217. IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,VirtualCurveIntersector8iMB));
  218. /* select intersectors1 */
  219. IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8OBBVirtualCurveIntersector1));
  220. IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8OBBVirtualCurveIntersector1MB));
  221. IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8OBBVirtualCurveIntersectorRobust1));
  222. IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8OBBVirtualCurveIntersectorRobust1MB));
  223. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4Intersector1Moeller));
  224. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4iIntersector1Moeller));
  225. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4vIntersector1Pluecker));
  226. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4iIntersector1Pluecker));
  227. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4vIntersector1Woop));
  228. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4vMBIntersector1Moeller));
  229. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4iMBIntersector1Moeller));
  230. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4vMBIntersector1Pluecker));
  231. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4iMBIntersector1Pluecker));
  232. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Quad4vIntersector1Moeller));
  233. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Quad4iIntersector1Moeller));
  234. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Quad4vIntersector1Pluecker));
  235. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Quad4iIntersector1Pluecker));
  236. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Quad4iMBIntersector1Moeller));
  237. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Quad4iMBIntersector1Pluecker));
  238. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,QBVH8Triangle4iIntersector1Pluecker));
  239. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,QBVH8Triangle4Intersector1Moeller));
  240. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,QBVH8Quad4iIntersector1Pluecker));
  241. IF_ENABLED_USER(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8VirtualIntersector1));
  242. IF_ENABLED_USER(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8VirtualMBIntersector1));
  243. IF_ENABLED_INSTANCE(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8InstanceIntersector1));
  244. IF_ENABLED_INSTANCE(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8InstanceMBIntersector1));
  245. IF_ENABLED_INSTANCE_ARRAY(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8InstanceArrayIntersector1));
  246. IF_ENABLED_INSTANCE_ARRAY(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8InstanceArrayMBIntersector1));
  247. IF_ENABLED_GRIDS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8GridIntersector1Moeller));
  248. IF_ENABLED_GRIDS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8GridMBIntersector1Moeller))
  249. IF_ENABLED_GRIDS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8GridIntersector1Pluecker));
  250. #if defined (EMBREE_RAY_PACKETS)
  251. /* select intersectors4 */
  252. IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8OBBVirtualCurveIntersector4Hybrid));
  253. IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8OBBVirtualCurveIntersector4HybridMB));
  254. IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8OBBVirtualCurveIntersectorRobust4Hybrid));
  255. IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8OBBVirtualCurveIntersectorRobust4HybridMB));
  256. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4Intersector4HybridMoeller));
  257. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4Intersector4HybridMoellerNoFilter));
  258. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4iIntersector4HybridMoeller));
  259. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4vIntersector4HybridPluecker));
  260. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4iIntersector4HybridPluecker));
  261. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4vMBIntersector4HybridMoeller));
  262. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4iMBIntersector4HybridMoeller));
  263. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4vMBIntersector4HybridPluecker));
  264. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4iMBIntersector4HybridPluecker));
  265. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Quad4vIntersector4HybridMoeller));
  266. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Quad4vIntersector4HybridMoellerNoFilter));
  267. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Quad4iIntersector4HybridMoeller));
  268. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Quad4vIntersector4HybridPluecker));
  269. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Quad4iIntersector4HybridPluecker));
  270. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2(features,BVH8Quad4iMBIntersector4HybridMoeller));
  271. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2(features,BVH8Quad4iMBIntersector4HybridPluecker));
  272. IF_ENABLED_USER(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8VirtualIntersector4Chunk));
  273. IF_ENABLED_USER(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8VirtualMBIntersector4Chunk));
  274. IF_ENABLED_INSTANCE(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8InstanceIntersector4Chunk));
  275. IF_ENABLED_INSTANCE(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8InstanceMBIntersector4Chunk));
  276. IF_ENABLED_INSTANCE_ARRAY(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8InstanceArrayIntersector4Chunk));
  277. IF_ENABLED_INSTANCE_ARRAY(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8InstanceArrayMBIntersector4Chunk));
  278. IF_ENABLED_GRIDS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8GridIntersector4HybridMoeller));
  279. IF_ENABLED_GRIDS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8GridIntersector4HybridPluecker));
  280. /* select intersectors8 */
  281. IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8OBBVirtualCurveIntersector8Hybrid));
  282. IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8OBBVirtualCurveIntersector8HybridMB));
  283. IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8OBBVirtualCurveIntersectorRobust8Hybrid));
  284. IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8OBBVirtualCurveIntersectorRobust8HybridMB));
  285. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4Intersector8HybridMoeller));
  286. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4Intersector8HybridMoellerNoFilter));
  287. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4iIntersector8HybridMoeller));
  288. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4vIntersector8HybridPluecker));
  289. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4iIntersector8HybridPluecker));
  290. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4vMBIntersector8HybridMoeller));
  291. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4iMBIntersector8HybridMoeller));
  292. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4vMBIntersector8HybridPluecker));
  293. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Triangle4iMBIntersector8HybridPluecker));
  294. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Quad4vIntersector8HybridMoeller));
  295. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Quad4vIntersector8HybridMoellerNoFilter));
  296. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Quad4iIntersector8HybridMoeller));
  297. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Quad4vIntersector8HybridPluecker));
  298. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8Quad4iIntersector8HybridPluecker));
  299. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2(features,BVH8Quad4iMBIntersector8HybridMoeller));
  300. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX_AVX2(features,BVH8Quad4iMBIntersector8HybridPluecker));
  301. IF_ENABLED_USER(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8VirtualIntersector8Chunk));
  302. IF_ENABLED_USER(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8VirtualMBIntersector8Chunk));
  303. IF_ENABLED_INSTANCE(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8InstanceIntersector8Chunk));
  304. IF_ENABLED_INSTANCE(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8InstanceMBIntersector8Chunk));
  305. IF_ENABLED_INSTANCE_ARRAY(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8InstanceArrayIntersector8Chunk));
  306. IF_ENABLED_INSTANCE_ARRAY(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8InstanceArrayMBIntersector8Chunk));
  307. IF_ENABLED_GRIDS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8GridIntersector8HybridMoeller));
  308. IF_ENABLED_GRIDS(SELECT_SYMBOL_INIT_AVX_AVX2_AVX512(features,BVH8GridIntersector8HybridPluecker));
  309. /* select intersectors16 */
  310. IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX512(features,BVH8OBBVirtualCurveIntersector16Hybrid));
  311. IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX512(features,BVH8OBBVirtualCurveIntersector16HybridMB));
  312. IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX512(features,BVH8OBBVirtualCurveIntersectorRobust16Hybrid));
  313. IF_ENABLED_CURVES_OR_POINTS(SELECT_SYMBOL_INIT_AVX512(features,BVH8OBBVirtualCurveIntersectorRobust16HybridMB));
  314. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX512(features,BVH8Triangle4Intersector16HybridMoeller));
  315. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX512(features,BVH8Triangle4Intersector16HybridMoellerNoFilter));
  316. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX512(features,BVH8Triangle4iIntersector16HybridMoeller));
  317. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX512(features,BVH8Triangle4vIntersector16HybridPluecker));
  318. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX512(features,BVH8Triangle4iIntersector16HybridPluecker));
  319. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX512(features,BVH8Triangle4vMBIntersector16HybridMoeller));
  320. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX512(features,BVH8Triangle4iMBIntersector16HybridMoeller));
  321. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX512(features,BVH8Triangle4vMBIntersector16HybridPluecker));
  322. IF_ENABLED_TRIS(SELECT_SYMBOL_INIT_AVX512(features,BVH8Triangle4iMBIntersector16HybridPluecker));
  323. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX512(features,BVH8Quad4vIntersector16HybridMoeller));
  324. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX512(features,BVH8Quad4vIntersector16HybridMoellerNoFilter));
  325. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX512(features,BVH8Quad4iIntersector16HybridMoeller));
  326. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX512(features,BVH8Quad4vIntersector16HybridPluecker));
  327. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX512(features,BVH8Quad4iIntersector16HybridPluecker));
  328. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX512(features,BVH8Quad4iMBIntersector16HybridMoeller));
  329. IF_ENABLED_QUADS(SELECT_SYMBOL_INIT_AVX512(features,BVH8Quad4iMBIntersector16HybridPluecker));
  330. IF_ENABLED_USER(SELECT_SYMBOL_INIT_AVX512(features,BVH8VirtualIntersector16Chunk));
  331. IF_ENABLED_USER(SELECT_SYMBOL_INIT_AVX512(features,BVH8VirtualMBIntersector16Chunk));
  332. IF_ENABLED_INSTANCE(SELECT_SYMBOL_INIT_AVX512(features,BVH8InstanceIntersector16Chunk));
  333. IF_ENABLED_INSTANCE(SELECT_SYMBOL_INIT_AVX512(features,BVH8InstanceMBIntersector16Chunk));
  334. IF_ENABLED_INSTANCE_ARRAY(SELECT_SYMBOL_INIT_AVX512(features,BVH8InstanceArrayIntersector16Chunk));
  335. IF_ENABLED_INSTANCE_ARRAY(SELECT_SYMBOL_INIT_AVX512(features,BVH8InstanceArrayMBIntersector16Chunk));
  336. IF_ENABLED_GRIDS(SELECT_SYMBOL_INIT_AVX512(features,BVH8GridIntersector16HybridMoeller));
  337. IF_ENABLED_GRIDS(SELECT_SYMBOL_INIT_AVX512(features,BVH8GridIntersector16HybridPluecker));
  338. #endif
  339. }
  340. Accel::Intersectors BVH8Factory::BVH8OBBVirtualCurveIntersectors(BVH8* bvh, VirtualCurveIntersector* leafIntersector, IntersectVariant ivariant)
  341. {
  342. switch (ivariant) {
  343. case IntersectVariant::FAST:
  344. {
  345. Accel::Intersectors intersectors;
  346. intersectors.ptr = bvh;
  347. intersectors.leafIntersector = leafIntersector;
  348. intersectors.intersector1 = BVH8OBBVirtualCurveIntersector1();
  349. #if defined (EMBREE_RAY_PACKETS)
  350. intersectors.intersector4 = BVH8OBBVirtualCurveIntersector4Hybrid();
  351. intersectors.intersector8 = BVH8OBBVirtualCurveIntersector8Hybrid();
  352. intersectors.intersector16 = BVH8OBBVirtualCurveIntersector16Hybrid();
  353. #endif
  354. return intersectors;
  355. }
  356. case IntersectVariant::ROBUST:
  357. {
  358. Accel::Intersectors intersectors;
  359. intersectors.ptr = bvh;
  360. intersectors.leafIntersector = leafIntersector;
  361. intersectors.intersector1 = BVH8OBBVirtualCurveIntersectorRobust1();
  362. #if defined (EMBREE_RAY_PACKETS)
  363. intersectors.intersector4 = BVH8OBBVirtualCurveIntersectorRobust4Hybrid();
  364. intersectors.intersector8 = BVH8OBBVirtualCurveIntersectorRobust8Hybrid();
  365. intersectors.intersector16 = BVH8OBBVirtualCurveIntersectorRobust16Hybrid();
  366. #endif
  367. return intersectors;
  368. }
  369. default: assert(false);
  370. }
  371. return Accel::Intersectors();
  372. }
  373. Accel::Intersectors BVH8Factory::BVH8OBBVirtualCurveIntersectorsMB(BVH8* bvh, VirtualCurveIntersector* leafIntersector, IntersectVariant ivariant)
  374. {
  375. switch (ivariant) {
  376. case IntersectVariant::FAST:
  377. {
  378. Accel::Intersectors intersectors;
  379. intersectors.ptr = bvh;
  380. intersectors.leafIntersector = leafIntersector;
  381. intersectors.intersector1 = BVH8OBBVirtualCurveIntersector1MB();
  382. #if defined (EMBREE_RAY_PACKETS)
  383. intersectors.intersector4 = BVH8OBBVirtualCurveIntersector4HybridMB();
  384. intersectors.intersector8 = BVH8OBBVirtualCurveIntersector8HybridMB();
  385. intersectors.intersector16 = BVH8OBBVirtualCurveIntersector16HybridMB();
  386. #endif
  387. return intersectors;
  388. }
  389. case IntersectVariant::ROBUST:
  390. {
  391. Accel::Intersectors intersectors;
  392. intersectors.ptr = bvh;
  393. intersectors.leafIntersector = leafIntersector;
  394. intersectors.intersector1 = BVH8OBBVirtualCurveIntersectorRobust1MB();
  395. #if defined (EMBREE_RAY_PACKETS)
  396. intersectors.intersector4 = BVH8OBBVirtualCurveIntersectorRobust4HybridMB();
  397. intersectors.intersector8 = BVH8OBBVirtualCurveIntersectorRobust8HybridMB();
  398. intersectors.intersector16 = BVH8OBBVirtualCurveIntersectorRobust16HybridMB();
  399. #endif
  400. return intersectors;
  401. }
  402. default: assert(false);
  403. }
  404. return Accel::Intersectors();
  405. }
  406. Accel::Intersectors BVH8Factory::BVH8Triangle4Intersectors(BVH8* bvh, IntersectVariant ivariant)
  407. {
  408. assert(ivariant == IntersectVariant::FAST);
  409. Accel::Intersectors intersectors;
  410. intersectors.ptr = bvh;
  411. intersectors.intersector1 = BVH8Triangle4Intersector1Moeller();
  412. #if defined (EMBREE_RAY_PACKETS)
  413. intersectors.intersector4_filter = BVH8Triangle4Intersector4HybridMoeller();
  414. intersectors.intersector4_nofilter = BVH8Triangle4Intersector4HybridMoellerNoFilter();
  415. intersectors.intersector8_filter = BVH8Triangle4Intersector8HybridMoeller();
  416. intersectors.intersector8_nofilter = BVH8Triangle4Intersector8HybridMoellerNoFilter();
  417. intersectors.intersector16_filter = BVH8Triangle4Intersector16HybridMoeller();
  418. intersectors.intersector16_nofilter = BVH8Triangle4Intersector16HybridMoellerNoFilter();
  419. #endif
  420. return intersectors;
  421. }
  422. Accel::Intersectors BVH8Factory::BVH8Triangle4vIntersectors(BVH8* bvh, IntersectVariant ivariant)
  423. {
  424. Accel::Intersectors intersectors;
  425. intersectors.ptr = bvh;
  426. #define ENABLE_WOOP_TEST 0
  427. #if ENABLE_WOOP_TEST == 0
  428. //assert(ivariant == IntersectVariant::ROBUST);
  429. intersectors.intersector1 = BVH8Triangle4vIntersector1Pluecker();
  430. #else
  431. intersectors.intersector1 = BVH8Triangle4vIntersector1Woop();
  432. #endif
  433. #if defined (EMBREE_RAY_PACKETS)
  434. intersectors.intersector4 = BVH8Triangle4vIntersector4HybridPluecker();
  435. intersectors.intersector8 = BVH8Triangle4vIntersector8HybridPluecker();
  436. intersectors.intersector16 = BVH8Triangle4vIntersector16HybridPluecker();
  437. #endif
  438. return intersectors;
  439. }
  440. Accel::Intersectors BVH8Factory::BVH8Triangle4iIntersectors(BVH8* bvh, IntersectVariant ivariant)
  441. {
  442. switch (ivariant) {
  443. case IntersectVariant::FAST:
  444. {
  445. Accel::Intersectors intersectors;
  446. intersectors.ptr = bvh;
  447. intersectors.intersector1 = BVH8Triangle4iIntersector1Moeller();
  448. #if defined (EMBREE_RAY_PACKETS)
  449. intersectors.intersector4 = BVH8Triangle4iIntersector4HybridMoeller();
  450. intersectors.intersector8 = BVH8Triangle4iIntersector8HybridMoeller();
  451. intersectors.intersector16 = BVH8Triangle4iIntersector16HybridMoeller();
  452. #endif
  453. return intersectors;
  454. }
  455. case IntersectVariant::ROBUST:
  456. {
  457. Accel::Intersectors intersectors;
  458. intersectors.ptr = bvh;
  459. intersectors.intersector1 = BVH8Triangle4iIntersector1Pluecker();
  460. #if defined (EMBREE_RAY_PACKETS)
  461. intersectors.intersector4 = BVH8Triangle4iIntersector4HybridPluecker();
  462. intersectors.intersector8 = BVH8Triangle4iIntersector8HybridPluecker();
  463. intersectors.intersector16 = BVH8Triangle4iIntersector16HybridPluecker();
  464. #endif
  465. return intersectors;
  466. }
  467. }
  468. return Accel::Intersectors();
  469. }
  470. Accel::Intersectors BVH8Factory::BVH8Triangle4vMBIntersectors(BVH8* bvh, IntersectVariant ivariant)
  471. {
  472. switch (ivariant) {
  473. case IntersectVariant::FAST:
  474. {
  475. Accel::Intersectors intersectors;
  476. intersectors.ptr = bvh;
  477. intersectors.intersector1 = BVH8Triangle4vMBIntersector1Moeller();
  478. #if defined (EMBREE_RAY_PACKETS)
  479. intersectors.intersector4 = BVH8Triangle4vMBIntersector4HybridMoeller();
  480. intersectors.intersector8 = BVH8Triangle4vMBIntersector8HybridMoeller();
  481. intersectors.intersector16 = BVH8Triangle4vMBIntersector16HybridMoeller();
  482. #endif
  483. return intersectors;
  484. }
  485. case IntersectVariant::ROBUST:
  486. {
  487. Accel::Intersectors intersectors;
  488. intersectors.ptr = bvh;
  489. intersectors.intersector1 = BVH8Triangle4vMBIntersector1Pluecker();
  490. #if defined (EMBREE_RAY_PACKETS)
  491. intersectors.intersector4 = BVH8Triangle4vMBIntersector4HybridPluecker();
  492. intersectors.intersector8 = BVH8Triangle4vMBIntersector8HybridPluecker();
  493. intersectors.intersector16 = BVH8Triangle4vMBIntersector16HybridPluecker();
  494. #endif
  495. return intersectors;
  496. }
  497. }
  498. return Accel::Intersectors();
  499. }
  500. Accel::Intersectors BVH8Factory::BVH8Triangle4iMBIntersectors(BVH8* bvh, IntersectVariant ivariant)
  501. {
  502. switch (ivariant) {
  503. case IntersectVariant::FAST:
  504. {
  505. Accel::Intersectors intersectors;
  506. intersectors.ptr = bvh;
  507. intersectors.intersector1 = BVH8Triangle4iMBIntersector1Moeller();
  508. #if defined (EMBREE_RAY_PACKETS)
  509. intersectors.intersector4 = BVH8Triangle4iMBIntersector4HybridMoeller();
  510. intersectors.intersector8 = BVH8Triangle4iMBIntersector8HybridMoeller();
  511. intersectors.intersector16 = BVH8Triangle4iMBIntersector16HybridMoeller();
  512. #endif
  513. return intersectors;
  514. }
  515. case IntersectVariant::ROBUST:
  516. {
  517. Accel::Intersectors intersectors;
  518. intersectors.ptr = bvh;
  519. intersectors.intersector1 = BVH8Triangle4iMBIntersector1Pluecker();
  520. #if defined (EMBREE_RAY_PACKETS)
  521. intersectors.intersector4 = BVH8Triangle4iMBIntersector4HybridPluecker();
  522. intersectors.intersector8 = BVH8Triangle4iMBIntersector8HybridPluecker();
  523. intersectors.intersector16 = BVH8Triangle4iMBIntersector16HybridPluecker();
  524. #endif
  525. return intersectors;
  526. }
  527. }
  528. return Accel::Intersectors();
  529. }
  530. Accel::Intersectors BVH8Factory::BVH8Quad4vIntersectors(BVH8* bvh, IntersectVariant ivariant)
  531. {
  532. switch (ivariant) {
  533. case IntersectVariant::FAST:
  534. {
  535. Accel::Intersectors intersectors;
  536. intersectors.ptr = bvh;
  537. intersectors.intersector1 = BVH8Quad4vIntersector1Moeller();
  538. #if defined (EMBREE_RAY_PACKETS)
  539. intersectors.intersector4_filter = BVH8Quad4vIntersector4HybridMoeller();
  540. intersectors.intersector4_nofilter = BVH8Quad4vIntersector4HybridMoellerNoFilter();
  541. intersectors.intersector8_filter = BVH8Quad4vIntersector8HybridMoeller();
  542. intersectors.intersector8_nofilter = BVH8Quad4vIntersector8HybridMoellerNoFilter();
  543. intersectors.intersector16_filter = BVH8Quad4vIntersector16HybridMoeller();
  544. intersectors.intersector16_nofilter = BVH8Quad4vIntersector16HybridMoellerNoFilter();
  545. #endif
  546. return intersectors;
  547. }
  548. case IntersectVariant::ROBUST:
  549. {
  550. Accel::Intersectors intersectors;
  551. intersectors.ptr = bvh;
  552. intersectors.intersector1 = BVH8Quad4vIntersector1Pluecker();
  553. #if defined (EMBREE_RAY_PACKETS)
  554. intersectors.intersector4 = BVH8Quad4vIntersector4HybridPluecker();
  555. intersectors.intersector8 = BVH8Quad4vIntersector8HybridPluecker();
  556. intersectors.intersector16 = BVH8Quad4vIntersector16HybridPluecker();
  557. #endif
  558. return intersectors;
  559. }
  560. }
  561. return Accel::Intersectors();
  562. }
  563. Accel::Intersectors BVH8Factory::BVH8Quad4iIntersectors(BVH8* bvh, IntersectVariant ivariant)
  564. {
  565. switch (ivariant) {
  566. case IntersectVariant::FAST:
  567. {
  568. Accel::Intersectors intersectors;
  569. intersectors.ptr = bvh;
  570. intersectors.intersector1 = BVH8Quad4iIntersector1Moeller();
  571. #if defined (EMBREE_RAY_PACKETS)
  572. intersectors.intersector4 = BVH8Quad4iIntersector4HybridMoeller();
  573. intersectors.intersector8 = BVH8Quad4iIntersector8HybridMoeller();
  574. intersectors.intersector16 = BVH8Quad4iIntersector16HybridMoeller();
  575. #endif
  576. return intersectors;
  577. }
  578. case IntersectVariant::ROBUST:
  579. {
  580. Accel::Intersectors intersectors;
  581. intersectors.ptr = bvh;
  582. intersectors.intersector1 = BVH8Quad4iIntersector1Pluecker();
  583. #if defined (EMBREE_RAY_PACKETS)
  584. intersectors.intersector4 = BVH8Quad4iIntersector4HybridPluecker();
  585. intersectors.intersector8 = BVH8Quad4iIntersector8HybridPluecker();
  586. intersectors.intersector16 = BVH8Quad4iIntersector16HybridPluecker();
  587. #endif
  588. return intersectors;
  589. }
  590. }
  591. return Accel::Intersectors();
  592. }
  593. Accel::Intersectors BVH8Factory::BVH8Quad4iMBIntersectors(BVH8* bvh, IntersectVariant ivariant)
  594. {
  595. switch (ivariant) {
  596. case IntersectVariant::FAST:
  597. {
  598. Accel::Intersectors intersectors;
  599. intersectors.ptr = bvh;
  600. intersectors.intersector1 = BVH8Quad4iMBIntersector1Moeller();
  601. #if defined (EMBREE_RAY_PACKETS)
  602. intersectors.intersector4 = BVH8Quad4iMBIntersector4HybridMoeller();
  603. intersectors.intersector8 = BVH8Quad4iMBIntersector8HybridMoeller();
  604. intersectors.intersector16 = BVH8Quad4iMBIntersector16HybridMoeller();
  605. #endif
  606. return intersectors;
  607. }
  608. case IntersectVariant::ROBUST:
  609. {
  610. Accel::Intersectors intersectors;
  611. intersectors.ptr = bvh;
  612. intersectors.intersector1 = BVH8Quad4iMBIntersector1Pluecker();
  613. #if defined (EMBREE_RAY_PACKETS)
  614. intersectors.intersector4 = BVH8Quad4iMBIntersector4HybridPluecker();
  615. intersectors.intersector8 = BVH8Quad4iMBIntersector8HybridPluecker();
  616. intersectors.intersector16 = BVH8Quad4iMBIntersector16HybridPluecker();
  617. #endif
  618. return intersectors;
  619. }
  620. }
  621. return Accel::Intersectors();
  622. }
  623. Accel::Intersectors BVH8Factory::QBVH8Triangle4iIntersectors(BVH8* bvh)
  624. {
  625. Accel::Intersectors intersectors;
  626. intersectors.ptr = bvh;
  627. intersectors.intersector1 = QBVH8Triangle4iIntersector1Pluecker();
  628. return intersectors;
  629. }
  630. Accel::Intersectors BVH8Factory::QBVH8Triangle4Intersectors(BVH8* bvh)
  631. {
  632. Accel::Intersectors intersectors;
  633. intersectors.ptr = bvh;
  634. intersectors.intersector1 = QBVH8Triangle4Intersector1Moeller();
  635. return intersectors;
  636. }
  637. Accel::Intersectors BVH8Factory::QBVH8Quad4iIntersectors(BVH8* bvh)
  638. {
  639. Accel::Intersectors intersectors;
  640. intersectors.ptr = bvh;
  641. intersectors.intersector1 = QBVH8Quad4iIntersector1Pluecker();
  642. return intersectors;
  643. }
  644. Accel::Intersectors BVH8Factory::BVH8UserGeometryIntersectors(BVH8* bvh)
  645. {
  646. Accel::Intersectors intersectors;
  647. intersectors.ptr = bvh;
  648. intersectors.intersector1 = BVH8VirtualIntersector1();
  649. #if defined (EMBREE_RAY_PACKETS)
  650. intersectors.intersector4 = BVH8VirtualIntersector4Chunk();
  651. intersectors.intersector8 = BVH8VirtualIntersector8Chunk();
  652. intersectors.intersector16 = BVH8VirtualIntersector16Chunk();
  653. #endif
  654. intersectors.collider = BVH8ColliderUserGeom();
  655. return intersectors;
  656. }
  657. Accel::Intersectors BVH8Factory::BVH8UserGeometryMBIntersectors(BVH8* bvh)
  658. {
  659. Accel::Intersectors intersectors;
  660. intersectors.ptr = bvh;
  661. intersectors.intersector1 = BVH8VirtualMBIntersector1();
  662. #if defined (EMBREE_RAY_PACKETS)
  663. intersectors.intersector4 = BVH8VirtualMBIntersector4Chunk();
  664. intersectors.intersector8 = BVH8VirtualMBIntersector8Chunk();
  665. intersectors.intersector16 = BVH8VirtualMBIntersector16Chunk();
  666. #endif
  667. return intersectors;
  668. }
  669. Accel::Intersectors BVH8Factory::BVH8InstanceIntersectors(BVH8* bvh)
  670. {
  671. Accel::Intersectors intersectors;
  672. intersectors.ptr = bvh;
  673. intersectors.intersector1 = BVH8InstanceIntersector1();
  674. #if defined (EMBREE_RAY_PACKETS)
  675. intersectors.intersector4 = BVH8InstanceIntersector4Chunk();
  676. intersectors.intersector8 = BVH8InstanceIntersector8Chunk();
  677. intersectors.intersector16 = BVH8InstanceIntersector16Chunk();
  678. #endif
  679. return intersectors;
  680. }
  681. Accel::Intersectors BVH8Factory::BVH8InstanceArrayIntersectors(BVH8* bvh)
  682. {
  683. Accel::Intersectors intersectors;
  684. intersectors.ptr = bvh;
  685. intersectors.intersector1 = BVH8InstanceArrayIntersector1();
  686. #if defined (EMBREE_RAY_PACKETS)
  687. intersectors.intersector4 = BVH8InstanceArrayIntersector4Chunk();
  688. intersectors.intersector8 = BVH8InstanceArrayIntersector8Chunk();
  689. intersectors.intersector16 = BVH8InstanceArrayIntersector16Chunk();
  690. #endif
  691. return intersectors;
  692. }
  693. Accel::Intersectors BVH8Factory::BVH8InstanceMBIntersectors(BVH8* bvh)
  694. {
  695. Accel::Intersectors intersectors;
  696. intersectors.ptr = bvh;
  697. intersectors.intersector1 = BVH8InstanceMBIntersector1();
  698. #if defined (EMBREE_RAY_PACKETS)
  699. intersectors.intersector4 = BVH8InstanceMBIntersector4Chunk();
  700. intersectors.intersector8 = BVH8InstanceMBIntersector8Chunk();
  701. intersectors.intersector16 = BVH8InstanceMBIntersector16Chunk();
  702. #endif
  703. return intersectors;
  704. }
  705. Accel::Intersectors BVH8Factory::BVH8InstanceArrayMBIntersectors(BVH8* bvh)
  706. {
  707. Accel::Intersectors intersectors;
  708. intersectors.ptr = bvh;
  709. intersectors.intersector1 = BVH8InstanceArrayMBIntersector1();
  710. #if defined (EMBREE_RAY_PACKETS)
  711. intersectors.intersector4 = BVH8InstanceArrayMBIntersector4Chunk();
  712. intersectors.intersector8 = BVH8InstanceArrayMBIntersector8Chunk();
  713. intersectors.intersector16 = BVH8InstanceArrayMBIntersector16Chunk();
  714. #endif
  715. return intersectors;
  716. }
  717. Accel* BVH8Factory::BVH8OBBVirtualCurve8v(Scene* scene, IntersectVariant ivariant)
  718. {
  719. BVH8* accel = new BVH8(Curve8v::type,scene);
  720. Accel::Intersectors intersectors = BVH8OBBVirtualCurveIntersectors(accel,VirtualCurveIntersector8v(),ivariant);
  721. Builder* builder = BVH8Curve8vBuilder_OBB_New(accel,scene,0);
  722. return new AccelInstance(accel,builder,intersectors);
  723. }
  724. Accel* BVH8Factory::BVH8OBBVirtualCurve8iMB(Scene* scene, IntersectVariant ivariant)
  725. {
  726. BVH8* accel = new BVH8(Curve8iMB::type,scene);
  727. Accel::Intersectors intersectors = BVH8OBBVirtualCurveIntersectorsMB(accel,VirtualCurveIntersector8iMB(),ivariant);
  728. Builder* builder = BVH8OBBCurve8iMBBuilder_OBB(accel,scene,0);
  729. return new AccelInstance(accel,builder,intersectors);
  730. }
  731. Accel* BVH8Factory::BVH8Triangle4(Scene* scene, BuildVariant bvariant, IntersectVariant ivariant)
  732. {
  733. BVH8* accel = new BVH8(Triangle4::type,scene);
  734. Accel::Intersectors intersectors= BVH8Triangle4Intersectors(accel,ivariant);
  735. Builder* builder = nullptr;
  736. if (scene->device->tri_builder == "default") {
  737. switch (bvariant) {
  738. case BuildVariant::STATIC : builder = BVH8Triangle4SceneBuilderSAH(accel,scene,0); break;
  739. case BuildVariant::DYNAMIC : builder = BVH8BuilderTwoLevelTriangle4MeshSAH(accel,scene,false); break;
  740. case BuildVariant::HIGH_QUALITY: builder = BVH8Triangle4SceneBuilderFastSpatialSAH(accel,scene,0); break;
  741. }
  742. }
  743. else if (scene->device->tri_builder == "sah" ) builder = BVH8Triangle4SceneBuilderSAH(accel,scene,0);
  744. else if (scene->device->tri_builder == "sah_fast_spatial") builder = BVH8Triangle4SceneBuilderFastSpatialSAH(accel,scene,0);
  745. else if (scene->device->tri_builder == "sah_presplit") builder = BVH8Triangle4SceneBuilderSAH(accel,scene,MODE_HIGH_QUALITY);
  746. else if (scene->device->tri_builder == "dynamic" ) builder = BVH8BuilderTwoLevelTriangle4MeshSAH(accel,scene,false);
  747. else if (scene->device->tri_builder == "morton" ) builder = BVH8BuilderTwoLevelTriangle4MeshSAH(accel,scene,true);
  748. else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->tri_builder+" for BVH8<Triangle4>");
  749. return new AccelInstance(accel,builder,intersectors);
  750. }
  751. Accel* BVH8Factory::BVH8Triangle4v(Scene* scene, BuildVariant bvariant, IntersectVariant ivariant)
  752. {
  753. BVH8* accel = new BVH8(Triangle4v::type,scene);
  754. Accel::Intersectors intersectors= BVH8Triangle4vIntersectors(accel,ivariant);
  755. Builder* builder = nullptr;
  756. if (scene->device->tri_builder == "default") {
  757. switch (bvariant) {
  758. case BuildVariant::STATIC : builder = BVH8Triangle4vSceneBuilderSAH(accel,scene,0); break;
  759. case BuildVariant::DYNAMIC : builder = BVH8BuilderTwoLevelTriangle4vMeshSAH(accel,scene,false); break;
  760. case BuildVariant::HIGH_QUALITY: builder = BVH8Triangle4vSceneBuilderFastSpatialSAH(accel,scene,0); break;
  761. }
  762. }
  763. else if (scene->device->tri_builder == "sah_fast_spatial") builder = BVH8Triangle4SceneBuilderFastSpatialSAH(accel,scene,0);
  764. else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->tri_builder+" for BVH8<Triangle4v>");
  765. return new AccelInstance(accel,builder,intersectors);
  766. }
  767. Accel* BVH8Factory::BVH8Triangle4i(Scene* scene, BuildVariant bvariant, IntersectVariant ivariant)
  768. {
  769. BVH8* accel = new BVH8(Triangle4i::type,scene);
  770. Accel::Intersectors intersectors = BVH8Triangle4iIntersectors(accel,ivariant);
  771. Builder* builder = nullptr;
  772. if (scene->device->tri_builder == "default") {
  773. switch (bvariant) {
  774. case BuildVariant::STATIC : builder = BVH8Triangle4iSceneBuilderSAH(accel,scene,0); break;
  775. case BuildVariant::DYNAMIC : builder = BVH8BuilderTwoLevelTriangle4iMeshSAH(accel,scene,false); break;
  776. case BuildVariant::HIGH_QUALITY: assert(false); break; // FIXME: implement
  777. }
  778. }
  779. else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->tri_builder+" for BVH8<Triangle4i>");
  780. return new AccelInstance(accel,builder,intersectors);
  781. }
  782. Accel* BVH8Factory::BVH8Triangle4iMB(Scene* scene, BuildVariant bvariant, IntersectVariant ivariant)
  783. {
  784. BVH8* accel = new BVH8(Triangle4i::type,scene);
  785. Accel::Intersectors intersectors = BVH8Triangle4iMBIntersectors(accel,ivariant);
  786. Builder* builder = nullptr;
  787. if (scene->device->tri_builder_mb == "default") { // FIXME: implement
  788. switch (bvariant) {
  789. case BuildVariant::STATIC : builder = BVH8Triangle4iMBSceneBuilderSAH(accel,scene,0); break;
  790. case BuildVariant::DYNAMIC : assert(false); break; // FIXME: implement
  791. case BuildVariant::HIGH_QUALITY: assert(false); break;
  792. }
  793. }
  794. else if (scene->device->tri_builder_mb == "internal_time_splits") builder = BVH8Triangle4iMBSceneBuilderSAH(accel,scene,0);
  795. else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->tri_builder_mb+" for BVH8<Triangle4iMB>");
  796. return new AccelInstance(accel,builder,intersectors);
  797. }
  798. Accel* BVH8Factory::BVH8Triangle4vMB(Scene* scene, BuildVariant bvariant, IntersectVariant ivariant)
  799. {
  800. BVH8* accel = new BVH8(Triangle4vMB::type,scene);
  801. Accel::Intersectors intersectors= BVH8Triangle4vMBIntersectors(accel,ivariant);
  802. Builder* builder = nullptr;
  803. if (scene->device->tri_builder_mb == "default") {
  804. switch (bvariant) {
  805. case BuildVariant::STATIC : builder = BVH8Triangle4vMBSceneBuilderSAH(accel,scene,0); break;
  806. case BuildVariant::DYNAMIC : assert(false); break; // FIXME: implement
  807. case BuildVariant::HIGH_QUALITY: assert(false); break;
  808. }
  809. }
  810. else if (scene->device->tri_builder_mb == "internal_time_splits") builder = BVH8Triangle4vMBSceneBuilderSAH(accel,scene,0);
  811. else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->tri_builder_mb+" for BVH8<Triangle4vMB>");
  812. return new AccelInstance(accel,builder,intersectors);
  813. }
  814. Accel* BVH8Factory::BVH8QuantizedTriangle4i(Scene* scene)
  815. {
  816. BVH8* accel = new BVH8(Triangle4i::type,scene);
  817. Accel::Intersectors intersectors = QBVH8Triangle4iIntersectors(accel);
  818. Builder* builder = BVH8QuantizedTriangle4iSceneBuilderSAH(accel,scene,0);
  819. return new AccelInstance(accel,builder,intersectors);
  820. }
  821. Accel* BVH8Factory::BVH8QuantizedTriangle4(Scene* scene)
  822. {
  823. BVH8* accel = new BVH8(Triangle4::type,scene);
  824. Accel::Intersectors intersectors = QBVH8Triangle4Intersectors(accel);
  825. Builder* builder = BVH8QuantizedTriangle4SceneBuilderSAH(accel,scene,0);
  826. return new AccelInstance(accel,builder,intersectors);
  827. }
  828. Accel* BVH8Factory::BVH8Quad4v(Scene* scene, BuildVariant bvariant, IntersectVariant ivariant)
  829. {
  830. BVH8* accel = new BVH8(Quad4v::type,scene);
  831. Accel::Intersectors intersectors = BVH8Quad4vIntersectors(accel,ivariant);
  832. Builder* builder = nullptr;
  833. if (scene->device->quad_builder == "default") {
  834. switch (bvariant) {
  835. case BuildVariant::STATIC : builder = BVH8Quad4vSceneBuilderSAH(accel,scene,0); break;
  836. case BuildVariant::DYNAMIC : builder = BVH8BuilderTwoLevelQuadMeshSAH(accel,scene,false); break;
  837. case BuildVariant::HIGH_QUALITY: builder = BVH8Quad4vSceneBuilderFastSpatialSAH(accel,scene,0); break;
  838. }
  839. }
  840. else if (scene->device->quad_builder == "dynamic" ) builder = BVH8BuilderTwoLevelQuadMeshSAH(accel,scene,false);
  841. else if (scene->device->quad_builder == "morton" ) builder = BVH8BuilderTwoLevelQuadMeshSAH(accel,scene,true);
  842. else if (scene->device->quad_builder == "sah_fast_spatial" ) builder = BVH8Quad4vSceneBuilderFastSpatialSAH(accel,scene,0);
  843. else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->quad_builder+" for BVH8<Quad4v>");
  844. return new AccelInstance(accel,builder,intersectors);
  845. }
  846. Accel* BVH8Factory::BVH8Quad4i(Scene* scene, BuildVariant bvariant, IntersectVariant ivariant)
  847. {
  848. BVH8* accel = new BVH8(Quad4i::type,scene);
  849. Accel::Intersectors intersectors = BVH8Quad4iIntersectors(accel,ivariant);
  850. Builder* builder = nullptr;
  851. if (scene->device->quad_builder == "default") {
  852. switch (bvariant) {
  853. case BuildVariant::STATIC : builder = BVH8Quad4iSceneBuilderSAH(accel,scene,0); break;
  854. case BuildVariant::DYNAMIC : assert(false); break; // FIXME: implement
  855. case BuildVariant::HIGH_QUALITY: assert(false); break; // FIXME: implement
  856. }
  857. }
  858. else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->quad_builder+" for BVH8<Quad4i>");
  859. return new AccelInstance(accel,builder,intersectors);
  860. }
  861. Accel* BVH8Factory::BVH8Quad4iMB(Scene* scene, BuildVariant bvariant, IntersectVariant ivariant)
  862. {
  863. BVH8* accel = new BVH8(Quad4i::type,scene);
  864. Accel::Intersectors intersectors = BVH8Quad4iMBIntersectors(accel,ivariant);
  865. Builder* builder = nullptr;
  866. if (scene->device->quad_builder_mb == "default") {
  867. switch (bvariant) {
  868. case BuildVariant::STATIC : builder = BVH8Quad4iMBSceneBuilderSAH(accel,scene,0); break;
  869. case BuildVariant::DYNAMIC : assert(false); break; // FIXME: implement
  870. case BuildVariant::HIGH_QUALITY: assert(false); break;
  871. }
  872. }
  873. else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->quad_builder_mb+" for BVH8<Quad4i>");
  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_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->quad_builder+" for QBVH8<Quad4i>");
  883. return new AccelInstance(accel,builder,intersectors);
  884. }
  885. Accel* BVH8Factory::BVH8UserGeometry(Scene* scene, BuildVariant bvariant)
  886. {
  887. BVH8* accel = new BVH8(Object::type,scene);
  888. Accel::Intersectors intersectors = BVH8UserGeometryIntersectors(accel);
  889. Builder* builder = nullptr;
  890. if (scene->device->object_builder == "default") {
  891. switch (bvariant) {
  892. case BuildVariant::STATIC : builder = BVH8VirtualSceneBuilderSAH(accel,scene,0); break;
  893. case BuildVariant::DYNAMIC : builder = BVH8BuilderTwoLevelVirtualSAH(accel,scene,false); break;
  894. case BuildVariant::HIGH_QUALITY: assert(false); break;
  895. }
  896. }
  897. else if (scene->device->object_builder == "sah") builder = BVH8VirtualSceneBuilderSAH(accel,scene,0);
  898. else if (scene->device->object_builder == "dynamic") builder = BVH8BuilderTwoLevelVirtualSAH(accel,scene,false);
  899. else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->object_builder+" for BVH8<Object>");
  900. return new AccelInstance(accel,builder,intersectors);
  901. }
  902. Accel* BVH8Factory::BVH8UserGeometryMB(Scene* scene)
  903. {
  904. BVH8* accel = new BVH8(Object::type,scene);
  905. Accel::Intersectors intersectors = BVH8UserGeometryMBIntersectors(accel);
  906. Builder* builder = BVH8VirtualMBSceneBuilderSAH(accel,scene,0);
  907. return new AccelInstance(accel,builder,intersectors);
  908. }
  909. Accel* BVH8Factory::BVH8Instance(Scene* scene, bool isExpensive, BuildVariant bvariant)
  910. {
  911. BVH8* accel = new BVH8(InstancePrimitive::type,scene);
  912. Accel::Intersectors intersectors = BVH8InstanceIntersectors(accel);
  913. auto gtype = isExpensive ? Geometry::MTY_INSTANCE_EXPENSIVE : Geometry::MTY_INSTANCE;
  914. // Builder* builder = BVH8InstanceSceneBuilderSAH(accel,scene,gtype);
  915. Builder* builder = nullptr;
  916. if (scene->device->object_builder == "default") {
  917. switch (bvariant) {
  918. case BuildVariant::STATIC : builder = BVH8InstanceSceneBuilderSAH(accel,scene,gtype);; break;
  919. case BuildVariant::DYNAMIC : builder = BVH8BuilderTwoLevelInstanceSAH(accel,scene,gtype,false); break;
  920. case BuildVariant::HIGH_QUALITY: assert(false); break;
  921. }
  922. }
  923. else if (scene->device->object_builder == "sah") builder = BVH8InstanceSceneBuilderSAH(accel,scene,gtype);
  924. else if (scene->device->object_builder == "dynamic") builder = BVH8BuilderTwoLevelInstanceSAH(accel,scene,gtype,false);
  925. else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->object_builder+" for BVH8<Object>");
  926. return new AccelInstance(accel,builder,intersectors);
  927. }
  928. Accel* BVH8Factory::BVH8InstanceArray(Scene* scene, BuildVariant bvariant)
  929. {
  930. BVH8* accel = new BVH8(InstanceArrayPrimitive::type,scene);
  931. Accel::Intersectors intersectors = BVH8InstanceArrayIntersectors(accel);
  932. auto gtype = Geometry::MTY_INSTANCE_ARRAY;
  933. // Builder* builder = BVH8InstanceSceneBuilderSAH(accel,scene,gtype);
  934. Builder* builder = nullptr;
  935. if (scene->device->object_builder == "default") {
  936. switch (bvariant) {
  937. case BuildVariant::STATIC : builder = BVH8InstanceArraySceneBuilderSAH(accel,scene,gtype); break;
  938. case BuildVariant::DYNAMIC : builder = BVH8BuilderTwoLevelInstanceArraySAH(accel,scene,gtype,false); break;
  939. case BuildVariant::HIGH_QUALITY: assert(false); break;
  940. }
  941. }
  942. else if (scene->device->object_builder == "sah") builder = BVH8InstanceArraySceneBuilderSAH(accel,scene,gtype);
  943. else if (scene->device->object_builder == "dynamic") builder = BVH8BuilderTwoLevelInstanceArraySAH(accel,scene,gtype,false);
  944. else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->object_builder+" for BVH8<Object>");
  945. return new AccelInstance(accel,builder,intersectors);
  946. }
  947. Accel* BVH8Factory::BVH8InstanceMB(Scene* scene, bool isExpensive)
  948. {
  949. BVH8* accel = new BVH8(InstancePrimitive::type,scene);
  950. Accel::Intersectors intersectors = BVH8InstanceMBIntersectors(accel);
  951. auto gtype = isExpensive ? Geometry::MTY_INSTANCE_EXPENSIVE : Geometry::MTY_INSTANCE;
  952. Builder* builder = BVH8InstanceMBSceneBuilderSAH(accel,scene,gtype);
  953. return new AccelInstance(accel,builder,intersectors);
  954. }
  955. Accel* BVH8Factory::BVH8InstanceArrayMB(Scene* scene)
  956. {
  957. BVH8* accel = new BVH8(InstanceArrayPrimitive::type,scene);
  958. Accel::Intersectors intersectors = BVH8InstanceArrayMBIntersectors(accel);
  959. auto gtype = Geometry::MTY_INSTANCE_ARRAY;
  960. Builder* builder = BVH8InstanceArrayMBSceneBuilderSAH(accel,scene,gtype);
  961. return new AccelInstance(accel,builder,intersectors);
  962. }
  963. Accel::Intersectors BVH8Factory::BVH8GridIntersectors(BVH8* bvh, IntersectVariant ivariant)
  964. {
  965. Accel::Intersectors intersectors;
  966. intersectors.ptr = bvh;
  967. if (ivariant == IntersectVariant::FAST)
  968. {
  969. intersectors.intersector1 = BVH8GridIntersector1Moeller();
  970. #if defined (EMBREE_RAY_PACKETS)
  971. intersectors.intersector4 = BVH8GridIntersector4HybridMoeller();
  972. intersectors.intersector8 = BVH8GridIntersector8HybridMoeller();
  973. intersectors.intersector16 = BVH8GridIntersector16HybridMoeller();
  974. #endif
  975. }
  976. else /* if (ivariant == IntersectVariant::ROBUST) */
  977. {
  978. intersectors.intersector1 = BVH8GridIntersector1Pluecker();
  979. #if defined (EMBREE_RAY_PACKETS)
  980. intersectors.intersector4 = BVH8GridIntersector4HybridPluecker();
  981. intersectors.intersector8 = BVH8GridIntersector8HybridPluecker();
  982. intersectors.intersector16 = BVH8GridIntersector16HybridPluecker();
  983. #endif
  984. }
  985. return intersectors;
  986. }
  987. Accel::Intersectors BVH8Factory::BVH8GridMBIntersectors(BVH8* bvh, IntersectVariant ivariant)
  988. {
  989. Accel::Intersectors intersectors;
  990. intersectors.ptr = bvh;
  991. intersectors.intersector1 = BVH8GridMBIntersector1Moeller();
  992. #if defined (EMBREE_RAY_PACKETS)
  993. intersectors.intersector4 = nullptr;
  994. intersectors.intersector8 = nullptr;
  995. intersectors.intersector16 = nullptr;
  996. #endif
  997. return intersectors;
  998. }
  999. Accel* BVH8Factory::BVH8Grid(Scene* scene, BuildVariant bvariant, IntersectVariant ivariant)
  1000. {
  1001. BVH8* accel = new BVH8(SubGridQBVH8::type,scene);
  1002. Accel::Intersectors intersectors = BVH8GridIntersectors(accel,ivariant);
  1003. Builder* builder = nullptr;
  1004. if (scene->device->grid_builder == "default") {
  1005. builder = BVH8GridSceneBuilderSAH(accel,scene,0);
  1006. }
  1007. else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->object_builder+" for BVH4<GridMesh>");
  1008. return new AccelInstance(accel,builder,intersectors);
  1009. }
  1010. Accel* BVH8Factory::BVH8GridMB(Scene* scene, BuildVariant bvariant, IntersectVariant ivariant)
  1011. {
  1012. BVH8* accel = new BVH8(SubGridQBVH8::type,scene);
  1013. Accel::Intersectors intersectors = BVH8GridMBIntersectors(accel,ivariant);
  1014. Builder* builder = nullptr;
  1015. if (scene->device->grid_builder_mb == "default") {
  1016. builder = BVH8GridMBSceneBuilderSAH(accel,scene,0);
  1017. }
  1018. else throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"unknown builder "+scene->device->object_builder+" for BVH8MB<GridMesh>");
  1019. return new AccelInstance(accel,builder,intersectors);
  1020. }
  1021. }
  1022. #endif