Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
godotengine
GitHub Repository: godotengine/godot
Path: blob/master/thirdparty/embree/kernels/common/default.h
9905 views
1
// Copyright 2009-2021 Intel Corporation
2
// SPDX-License-Identifier: Apache-2.0
3
4
#pragma once
5
6
#include "../../common/sys/platform.h"
7
#include "../../common/sys/sysinfo.h"
8
#include "../../common/sys/thread.h"
9
#include "../../common/sys/alloc.h"
10
#include "../../common/sys/ref.h"
11
#include "../../common/sys/intrinsics.h"
12
#include "../../common/sys/atomic.h"
13
#include "../../common/sys/mutex.h"
14
#include "../../common/sys/vector.h"
15
#include "../../common/sys/array.h"
16
#include "../../common/sys/estring.h"
17
#include "../../common/sys/regression.h"
18
#include "../../common/sys/vector.h"
19
20
#include "../../common/math/emath.h"
21
#include "../../common/math/transcendental.h"
22
#include "../../common/simd/simd.h"
23
#include "../../common/math/vec2.h"
24
#include "../../common/math/vec3.h"
25
#include "../../common/math/vec4.h"
26
#include "../../common/math/vec2fa.h"
27
#include "../../common/math/vec3fa.h"
28
#include "../../common/math/interval.h"
29
#include "../../common/math/bbox.h"
30
#include "../../common/math/obbox.h"
31
#include "../../common/math/lbbox.h"
32
#include "../../common/math/linearspace2.h"
33
#include "../../common/math/linearspace3.h"
34
#include "../../common/math/affinespace.h"
35
#include "../../common/math/range.h"
36
#include "../../common/lexers/tokenstream.h"
37
38
#define COMMA ,
39
40
#include "../config.h"
41
#include "isa.h"
42
#include "stat.h"
43
#include "profile.h"
44
#include "rtcore.h"
45
#include "vector.h"
46
#include "state.h"
47
#include "instance_stack.h"
48
49
#include <vector>
50
#include <map>
51
#include <algorithm>
52
#include <functional>
53
#include <utility>
54
#include <sstream>
55
56
namespace embree
57
{
58
////////////////////////////////////////////////////////////////////////////////
59
/// Vec2 shortcuts
60
////////////////////////////////////////////////////////////////////////////////
61
62
template<int N> using Vec2vf = Vec2<vfloat<N>>;
63
template<int N> using Vec2vd = Vec2<vdouble<N>>;
64
template<int N> using Vec2vr = Vec2<vreal<N>>;
65
template<int N> using Vec2vi = Vec2<vint<N>>;
66
template<int N> using Vec2vl = Vec2<vllong<N>>;
67
template<int N> using Vec2vb = Vec2<vbool<N>>;
68
template<int N> using Vec2vbf = Vec2<vboolf<N>>;
69
template<int N> using Vec2vbd = Vec2<vboold<N>>;
70
71
typedef Vec2<vfloat4> Vec2vf4;
72
typedef Vec2<vdouble4> Vec2vd4;
73
typedef Vec2<vreal4> Vec2vr4;
74
typedef Vec2<vint4> Vec2vi4;
75
typedef Vec2<vllong4> Vec2vl4;
76
typedef Vec2<vbool4> Vec2vb4;
77
typedef Vec2<vboolf4> Vec2vbf4;
78
typedef Vec2<vboold4> Vec2vbd4;
79
80
typedef Vec2<vfloat8> Vec2vf8;
81
typedef Vec2<vdouble8> Vec2vd8;
82
typedef Vec2<vreal8> Vec2vr8;
83
typedef Vec2<vint8> Vec2vi8;
84
typedef Vec2<vllong8> Vec2vl8;
85
typedef Vec2<vbool8> Vec2vb8;
86
typedef Vec2<vboolf8> Vec2vbf8;
87
typedef Vec2<vboold8> Vec2vbd8;
88
89
typedef Vec2<vfloat16> Vec2vf16;
90
typedef Vec2<vdouble16> Vec2vd16;
91
typedef Vec2<vreal16> Vec2vr16;
92
typedef Vec2<vint16> Vec2vi16;
93
typedef Vec2<vllong16> Vec2vl16;
94
typedef Vec2<vbool16> Vec2vb16;
95
typedef Vec2<vboolf16> Vec2vbf16;
96
typedef Vec2<vboold16> Vec2vbd16;
97
98
typedef Vec2<vfloatx> Vec2vfx;
99
typedef Vec2<vdoublex> Vec2vdx;
100
typedef Vec2<vrealx> Vec2vrx;
101
typedef Vec2<vintx> Vec2vix;
102
typedef Vec2<vllongx> Vec2vlx;
103
typedef Vec2<vboolx> Vec2vbx;
104
typedef Vec2<vboolfx> Vec2vbfx;
105
typedef Vec2<vbooldx> Vec2vbdx;
106
107
////////////////////////////////////////////////////////////////////////////////
108
/// Vec3 shortcuts
109
////////////////////////////////////////////////////////////////////////////////
110
111
template<int N> using Vec3vf = Vec3<vfloat<N>>;
112
template<int N> using Vec3vd = Vec3<vdouble<N>>;
113
template<int N> using Vec3vr = Vec3<vreal<N>>;
114
template<int N> using Vec3vi = Vec3<vint<N>>;
115
template<int N> using Vec3vl = Vec3<vllong<N>>;
116
template<int N> using Vec3vb = Vec3<vbool<N>>;
117
template<int N> using Vec3vbf = Vec3<vboolf<N>>;
118
template<int N> using Vec3vbd = Vec3<vboold<N>>;
119
120
typedef Vec3<vfloat4> Vec3vf4;
121
typedef Vec3<vdouble4> Vec3vd4;
122
typedef Vec3<vreal4> Vec3vr4;
123
typedef Vec3<vint4> Vec3vi4;
124
typedef Vec3<vllong4> Vec3vl4;
125
typedef Vec3<vbool4> Vec3vb4;
126
typedef Vec3<vboolf4> Vec3vbf4;
127
typedef Vec3<vboold4> Vec3vbd4;
128
129
typedef Vec3<vfloat8> Vec3vf8;
130
typedef Vec3<vdouble8> Vec3vd8;
131
typedef Vec3<vreal8> Vec3vr8;
132
typedef Vec3<vint8> Vec3vi8;
133
typedef Vec3<vllong8> Vec3vl8;
134
typedef Vec3<vbool8> Vec3vb8;
135
typedef Vec3<vboolf8> Vec3vbf8;
136
typedef Vec3<vboold8> Vec3vbd8;
137
138
typedef Vec3<vfloat16> Vec3vf16;
139
typedef Vec3<vdouble16> Vec3vd16;
140
typedef Vec3<vreal16> Vec3vr16;
141
typedef Vec3<vint16> Vec3vi16;
142
typedef Vec3<vllong16> Vec3vl16;
143
typedef Vec3<vbool16> Vec3vb16;
144
typedef Vec3<vboolf16> Vec3vbf16;
145
typedef Vec3<vboold16> Vec3vbd16;
146
147
typedef Vec3<vfloatx> Vec3vfx;
148
typedef Vec3<vdoublex> Vec3vdx;
149
typedef Vec3<vrealx> Vec3vrx;
150
typedef Vec3<vintx> Vec3vix;
151
typedef Vec3<vllongx> Vec3vlx;
152
typedef Vec3<vboolx> Vec3vbx;
153
typedef Vec3<vboolfx> Vec3vbfx;
154
typedef Vec3<vbooldx> Vec3vbdx;
155
156
////////////////////////////////////////////////////////////////////////////////
157
/// Vec4 shortcuts
158
////////////////////////////////////////////////////////////////////////////////
159
160
template<int N> using Vec4vf = Vec4<vfloat<N>>;
161
template<int N> using Vec4vd = Vec4<vdouble<N>>;
162
template<int N> using Vec4vr = Vec4<vreal<N>>;
163
template<int N> using Vec4vi = Vec4<vint<N>>;
164
template<int N> using Vec4vl = Vec4<vllong<N>>;
165
template<int N> using Vec4vb = Vec4<vbool<N>>;
166
template<int N> using Vec4vbf = Vec4<vboolf<N>>;
167
template<int N> using Vec4vbd = Vec4<vboold<N>>;
168
169
typedef Vec4<vfloat4> Vec4vf4;
170
typedef Vec4<vdouble4> Vec4vd4;
171
typedef Vec4<vreal4> Vec4vr4;
172
typedef Vec4<vint4> Vec4vi4;
173
typedef Vec4<vllong4> Vec4vl4;
174
typedef Vec4<vbool4> Vec4vb4;
175
typedef Vec4<vboolf4> Vec4vbf4;
176
typedef Vec4<vboold4> Vec4vbd4;
177
178
typedef Vec4<vfloat8> Vec4vf8;
179
typedef Vec4<vdouble8> Vec4vd8;
180
typedef Vec4<vreal8> Vec4vr8;
181
typedef Vec4<vint8> Vec4vi8;
182
typedef Vec4<vllong8> Vec4vl8;
183
typedef Vec4<vbool8> Vec4vb8;
184
typedef Vec4<vboolf8> Vec4vbf8;
185
typedef Vec4<vboold8> Vec4vbd8;
186
187
typedef Vec4<vfloat16> Vec4vf16;
188
typedef Vec4<vdouble16> Vec4vd16;
189
typedef Vec4<vreal16> Vec4vr16;
190
typedef Vec4<vint16> Vec4vi16;
191
typedef Vec4<vllong16> Vec4vl16;
192
typedef Vec4<vbool16> Vec4vb16;
193
typedef Vec4<vboolf16> Vec4vbf16;
194
typedef Vec4<vboold16> Vec4vbd16;
195
196
typedef Vec4<vfloatx> Vec4vfx;
197
typedef Vec4<vdoublex> Vec4vdx;
198
typedef Vec4<vrealx> Vec4vrx;
199
typedef Vec4<vintx> Vec4vix;
200
typedef Vec4<vllongx> Vec4vlx;
201
typedef Vec4<vboolx> Vec4vbx;
202
typedef Vec4<vboolfx> Vec4vbfx;
203
typedef Vec4<vbooldx> Vec4vbdx;
204
205
////////////////////////////////////////////////////////////////////////////////
206
/// Other shortcuts
207
////////////////////////////////////////////////////////////////////////////////
208
209
template<int N> using BBox3vf = BBox<Vec3vf<N>>;
210
typedef BBox<Vec3vf4> BBox3vf4;
211
typedef BBox<Vec3vf8> BBox3vf8;
212
typedef BBox<Vec3vf16> BBox3vf16;
213
214
/* calculate time segment itime and fractional time ftime */
215
__forceinline int getTimeSegment(float time, float numTimeSegments, float& ftime)
216
{
217
const float timeScaled = time * numTimeSegments;
218
const float itimef = clamp(floor(timeScaled), 0.0f, numTimeSegments-1.0f);
219
ftime = timeScaled - itimef;
220
return int(itimef);
221
}
222
223
__forceinline int getTimeSegment(float time, float start_time, float end_time, float numTimeSegments, float& ftime)
224
{
225
const float timeScaled = (time-start_time)/(end_time-start_time) * numTimeSegments;
226
const float itimef = clamp(floor(timeScaled), 0.0f, numTimeSegments-1.0f);
227
ftime = timeScaled - itimef;
228
return int(itimef);
229
}
230
231
template<int N>
232
__forceinline vint<N> getTimeSegment(const vfloat<N>& time, const vfloat<N>& numTimeSegments, vfloat<N>& ftime)
233
{
234
const vfloat<N> timeScaled = time * numTimeSegments;
235
const vfloat<N> itimef = clamp(floor(timeScaled), vfloat<N>(zero), numTimeSegments-1.0f);
236
ftime = timeScaled - itimef;
237
return vint<N>(itimef);
238
}
239
240
template<int N>
241
__forceinline vint<N> getTimeSegment(const vfloat<N>& time, const vfloat<N>& start_time, const vfloat<N>& end_time, const vfloat<N>& numTimeSegments, vfloat<N>& ftime)
242
{
243
const vfloat<N> timeScaled = (time-start_time)/(end_time-start_time) * numTimeSegments;
244
const vfloat<N> itimef = clamp(floor(timeScaled), vfloat<N>(zero), numTimeSegments-1.0f);
245
ftime = timeScaled - itimef;
246
return vint<N>(itimef);
247
}
248
249
/* calculate overlapping time segment range */
250
__forceinline range<int> getTimeSegmentRange(const BBox1f& time_range, float numTimeSegments)
251
{
252
const float round_up = 1.0f+2.0f*float(ulp); // corrects inaccuracies to precisely match time step
253
const float round_down = 1.0f-2.0f*float(ulp);
254
const int itime_lower = (int)max(floor(round_up *time_range.lower*numTimeSegments), 0.0f);
255
const int itime_upper = (int)min(ceil (round_down*time_range.upper*numTimeSegments), numTimeSegments);
256
return make_range(itime_lower, itime_upper);
257
}
258
259
/* calculate overlapping time segment range */
260
__forceinline range<int> getTimeSegmentRange(const BBox1f& range, BBox1f time_range, float numTimeSegments)
261
{
262
const float lower = (range.lower-time_range.lower)/time_range.size();
263
const float upper = (range.upper-time_range.lower)/time_range.size();
264
return getTimeSegmentRange(BBox1f(lower,upper),numTimeSegments);
265
}
266
}
267
268