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