1 | // |
2 | // Redistribution and use in source and binary forms, with or without |
3 | // modification, are permitted provided that the following conditions |
4 | // are met: |
5 | // * Redistributions of source code must retain the above copyright |
6 | // notice, this list of conditions and the following disclaimer. |
7 | // * Redistributions in binary form must reproduce the above copyright |
8 | // notice, this list of conditions and the following disclaimer in the |
9 | // documentation and/or other materials provided with the distribution. |
10 | // * Neither the name of NVIDIA CORPORATION nor the names of its |
11 | // contributors may be used to endorse or promote products derived |
12 | // from this software without specific prior written permission. |
13 | // |
14 | // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY |
15 | // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
16 | // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
17 | // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
18 | // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
19 | // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
20 | // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
21 | // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY |
22 | // OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
23 | // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
24 | // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
25 | // |
26 | // Copyright (c) 2008-2021 NVIDIA Corporation. All rights reserved. |
27 | // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. |
28 | // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. |
29 | |
30 | #ifndef PXFOUNDATION_PXPREPROCESSOR_H |
31 | #define PXFOUNDATION_PXPREPROCESSOR_H |
32 | |
33 | #include <stddef.h> |
34 | #if !defined(PX_GENERATE_META_DATA) |
35 | #include <ciso646> |
36 | #endif |
37 | /** \addtogroup foundation |
38 | @{ |
39 | */ |
40 | |
41 | #define PX_STRINGIZE_HELPER(X) #X |
42 | #define PX_STRINGIZE(X) PX_STRINGIZE_HELPER(X) |
43 | |
44 | #define PX_CONCAT_HELPER(X, Y) X##Y |
45 | #define PX_CONCAT(X, Y) PX_CONCAT_HELPER(X, Y) |
46 | |
47 | /* |
48 | The following preprocessor identifiers specify compiler, OS, and architecture. |
49 | All definitions have a value of 1 or 0, use '#if' instead of '#ifdef'. |
50 | */ |
51 | |
52 | /** |
53 | Compiler defines, see http://sourceforge.net/p/predef/wiki/Compilers/ |
54 | */ |
55 | #if defined(_MSC_VER) |
56 | #if _MSC_VER >= 1910 |
57 | #define PX_VC 15 |
58 | #elif _MSC_VER >= 1900 |
59 | #define PX_VC 14 |
60 | #elif _MSC_VER >= 1800 |
61 | #define PX_VC 12 |
62 | #elif _MSC_VER >= 1700 |
63 | #define PX_VC 11 |
64 | #elif _MSC_VER >= 1600 |
65 | #define PX_VC 10 |
66 | #elif _MSC_VER >= 1500 |
67 | #define PX_VC 9 |
68 | #else |
69 | #error "Unknown VC version" |
70 | #endif |
71 | #elif defined(__clang__) |
72 | #define PX_CLANG 1 |
73 | #if defined (__clang_major__) |
74 | #define PX_CLANG_MAJOR __clang_major__ |
75 | #elif defined (_clang_major) |
76 | #define PX_CLANG_MAJOR _clang_major |
77 | #else |
78 | #define PX_CLANG_MAJOR 0 |
79 | #endif |
80 | #elif defined(__GNUC__) // note: __clang__ implies __GNUC__ |
81 | #define PX_GCC 1 |
82 | #else |
83 | #error "Unknown compiler" |
84 | #endif |
85 | |
86 | /** |
87 | Operating system defines, see http://sourceforge.net/p/predef/wiki/OperatingSystems/ |
88 | */ |
89 | #if defined(_XBOX_ONE) |
90 | #define PX_XBOXONE 1 |
91 | #elif defined(_GAMING_XBOX) || defined (_GAMING_XBOX_SCARLETT) |
92 | #define PX_XBOX_SERIES_X 1 |
93 | #elif defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_APP |
94 | #define PX_UWP 1 |
95 | #elif defined(_WIN64) // note: _XBOX_ONE implies _WIN64 |
96 | #define PX_WIN64 1 |
97 | #elif defined(_WIN32) // note: _M_PPC implies _WIN32 |
98 | #define PX_WIN32 1 |
99 | #elif defined(__ANDROID__) |
100 | #define PX_ANDROID 1 |
101 | #elif defined(__linux__) || defined (__EMSCRIPTEN__) // note: __ANDROID__ implies __linux__ |
102 | #define PX_LINUX 1 |
103 | #elif defined(TARGET_OS_IOS) && TARGET_OS_IOS && defined(__APPLE__) && (defined(__arm__) || defined(__arm64__)) |
104 | #define PX_IOS 1 |
105 | #elif defined(__APPLE__) |
106 | #define PX_OSX 1 |
107 | #elif defined(__ORBIS__) |
108 | #define PX_PS4 1 |
109 | #elif defined(__NX__) |
110 | #define PX_SWITCH 1 |
111 | #else |
112 | #error "Unknown operating system" |
113 | #endif |
114 | |
115 | /** |
116 | Architecture defines, see http://sourceforge.net/p/predef/wiki/Architectures/ |
117 | */ |
118 | #if defined(__x86_64__) || defined(_M_X64) // ps4 compiler defines _M_X64 without value |
119 | #define PX_X64 1 |
120 | #elif defined(__i386__) || defined(_M_IX86) |
121 | #define PX_X86 1 |
122 | #elif defined(__arm64__) || defined(__aarch64__) || defined(_M_ARM64) |
123 | #define PX_A64 1 |
124 | #elif defined(__arm__) || defined(_M_ARM) |
125 | #define PX_ARM 1 |
126 | #elif defined(__ppc__) || defined(_M_PPC) || defined(__CELLOS_LV2__) |
127 | #define PX_PPC 1 |
128 | #elif defined(__mips__) |
129 | #define PX_X64 1 |
130 | #elif defined(__EMSCRIPTEN__) |
131 | #define PX_WASM |
132 | #if defined(__LP64__) |
133 | #define PX_WASM_64 1 |
134 | #else |
135 | #define PX_WASM_32 1 |
136 | #endif |
137 | #else |
138 | #error "Unknown architecture" |
139 | #endif |
140 | |
141 | /** |
142 | SIMD defines |
143 | */ |
144 | #if !defined(PX_SIMD_DISABLED) |
145 | #if defined(__i386__) || defined(_M_IX86) || defined(__x86_64__) || defined(_M_X64) || (defined (__EMSCRIPTEN__) && defined(__SSE2__)) |
146 | #define PX_SSE2 1 |
147 | #endif |
148 | #if defined(_M_ARM) || defined(__ARM_NEON__) || defined(__ARM_NEON) |
149 | #define PX_NEON 1 |
150 | #endif |
151 | #if defined(_M_PPC) || defined(__CELLOS_LV2__) |
152 | #define PX_VMX 1 |
153 | #endif |
154 | #endif |
155 | |
156 | /** Disable SIMD for webassembly, mips and arm64 */ |
157 | #if defined(__EMSCRIPTEN__) || defined(__mips__) || defined(_M_ARM64) || defined(_M_ARM) |
158 | #define PX_SIMD_DISABLED 1 |
159 | #endif |
160 | |
161 | /** |
162 | define anything not defined on this platform to 0 |
163 | */ |
164 | #ifndef PX_VC |
165 | #define PX_VC 0 |
166 | #endif |
167 | #ifndef PX_CLANG |
168 | #define PX_CLANG 0 |
169 | #endif |
170 | #ifndef PX_GCC |
171 | #define PX_GCC 0 |
172 | #endif |
173 | #ifndef PX_XBOXONE |
174 | #define PX_XBOXONE 0 |
175 | #endif |
176 | #ifndef PX_XBOX_SERIES_X |
177 | #define PX_XBOX_SERIES_X 0 |
178 | #endif |
179 | #ifndef PX_WIN64 |
180 | #define PX_WIN64 0 |
181 | #endif |
182 | #ifndef PX_WIN32 |
183 | #define PX_WIN32 0 |
184 | #endif |
185 | #ifndef PX_ANDROID |
186 | #define PX_ANDROID 0 |
187 | #endif |
188 | #ifndef PX_LINUX |
189 | #define PX_LINUX 0 |
190 | #endif |
191 | #ifndef PX_IOS |
192 | #define PX_IOS 0 |
193 | #endif |
194 | #ifndef PX_OSX |
195 | #define PX_OSX 0 |
196 | #endif |
197 | #ifndef PX_PS4 |
198 | #define PX_PS4 0 |
199 | #endif |
200 | #ifndef PX_SWITCH |
201 | #define PX_SWITCH 0 |
202 | #endif |
203 | #ifndef PX_UWP |
204 | #define PX_UWP 0 |
205 | #endif |
206 | #ifndef PX_X64 |
207 | #define PX_X64 0 |
208 | #endif |
209 | #ifndef PX_X86 |
210 | #define PX_X86 0 |
211 | #endif |
212 | #ifndef PX_A64 |
213 | #define PX_A64 0 |
214 | #endif |
215 | #ifndef PX_ARM |
216 | #define PX_ARM 0 |
217 | #endif |
218 | #ifndef PX_WASM |
219 | #define PX_WASM 0 |
220 | #endif |
221 | #ifndef PX_WASM_64 |
222 | #define PX_WASM_64 0 |
223 | #endif |
224 | #ifndef PX_WASM_32 |
225 | #define PX_WASM_32 0 |
226 | #endif |
227 | #ifndef PX_PPC |
228 | #define PX_PPC 0 |
229 | #endif |
230 | #ifndef PX_SSE2 |
231 | #define PX_SSE2 0 |
232 | #endif |
233 | #ifndef PX_NEON |
234 | #define PX_NEON 0 |
235 | #endif |
236 | #ifndef PX_VMX |
237 | #define PX_VMX 0 |
238 | #endif |
239 | |
240 | /* |
241 | define anything not defined through the command line to 0 |
242 | */ |
243 | #ifndef PX_DEBUG |
244 | #define PX_DEBUG 0 |
245 | #endif |
246 | #ifndef PX_CHECKED |
247 | #define PX_CHECKED 0 |
248 | #endif |
249 | #ifndef PX_PROFILE |
250 | #define PX_PROFILE 0 |
251 | #endif |
252 | #ifndef PX_DEBUG_CRT |
253 | #define PX_DEBUG_CRT 0 |
254 | #endif |
255 | #ifndef PX_NVTX |
256 | #define PX_NVTX 0 |
257 | #endif |
258 | #ifndef PX_DOXYGEN |
259 | #define PX_DOXYGEN 0 |
260 | #endif |
261 | |
262 | /** |
263 | family shortcuts |
264 | */ |
265 | // compiler |
266 | #define PX_GCC_FAMILY (PX_CLANG || PX_GCC) |
267 | // os |
268 | #define PX_WINDOWS_FAMILY (PX_WIN32 || PX_WIN64 || PX_UWP) |
269 | #define PX_MICROSOFT_FAMILY (PX_XBOXONE || PX_WINDOWS_FAMILY || PX_XBOX_SERIES_X) |
270 | #define PX_LINUX_FAMILY (PX_LINUX || PX_ANDROID) |
271 | #define PX_APPLE_FAMILY (PX_IOS || PX_OSX) // equivalent to #if __APPLE__ |
272 | #define PX_UNIX_FAMILY (PX_LINUX_FAMILY || PX_APPLE_FAMILY) // shortcut for unix/posix platforms |
273 | #if defined(__EMSCRIPTEN__) |
274 | #define PX_EMSCRIPTEN 1 |
275 | #else |
276 | #define PX_EMSCRIPTEN 0 |
277 | #endif |
278 | // architecture |
279 | #define PX_INTEL_FAMILY (PX_X64 || PX_X86) |
280 | #define PX_ARM_FAMILY (PX_ARM || PX_A64) |
281 | #define PX_P64_FAMILY (PX_X64 || PX_A64 || PX_WASM_64) // shortcut for 64-bit architectures |
282 | |
283 | /** |
284 | C++ standard library defines |
285 | */ |
286 | #if defined(_LIBCPP_VERSION) || PX_WIN64 || PX_WIN32 || PX_PS4 || PX_XBOXONE || PX_UWP || PX_EMSCRIPTEN || PX_XBOX_SERIES_X |
287 | #define PX_LIBCPP 1 |
288 | #else |
289 | #define PX_LIBCPP 0 |
290 | #endif |
291 | |
292 | // legacy define for PhysX |
293 | #define PX_WINDOWS (PX_WINDOWS_FAMILY && !PX_ARM_FAMILY) |
294 | |
295 | /** |
296 | Assert macro |
297 | */ |
298 | #ifndef PX_ENABLE_ASSERTS |
299 | #if PX_DEBUG && !defined(__CUDACC__) |
300 | #define PX_ENABLE_ASSERTS 1 |
301 | #else |
302 | #define PX_ENABLE_ASSERTS 0 |
303 | #endif |
304 | #endif |
305 | |
306 | /** |
307 | DLL export macros |
308 | */ |
309 | #ifndef PX_C_EXPORT |
310 | #if PX_WINDOWS_FAMILY || PX_LINUX |
311 | #define PX_C_EXPORT extern "C" |
312 | #else |
313 | #define PX_C_EXPORT |
314 | #endif |
315 | #endif |
316 | |
317 | #if PX_UNIX_FAMILY&& __GNUC__ >= 4 |
318 | #define PX_UNIX_EXPORT __attribute__((visibility("default"))) |
319 | #else |
320 | #define PX_UNIX_EXPORT |
321 | #endif |
322 | |
323 | #if (PX_WINDOWS_FAMILY || PX_XBOXONE || PX_PS4 || PX_XBOX_SERIES_X) |
324 | #define PX_DLL_EXPORT __declspec(dllexport) |
325 | #define PX_DLL_IMPORT __declspec(dllimport) |
326 | #else |
327 | #define PX_DLL_EXPORT PX_UNIX_EXPORT |
328 | #define PX_DLL_IMPORT |
329 | #endif |
330 | |
331 | /** |
332 | Calling convention |
333 | */ |
334 | #ifndef PX_CALL_CONV |
335 | #if PX_MICROSOFT_FAMILY |
336 | #define PX_CALL_CONV __cdecl |
337 | #else |
338 | #define PX_CALL_CONV |
339 | #endif |
340 | #endif |
341 | |
342 | /** |
343 | Pack macros - disabled on SPU because they are not supported |
344 | */ |
345 | #if PX_VC |
346 | #define PX_PUSH_PACK_DEFAULT __pragma(pack(push, 8)) |
347 | #define PX_POP_PACK __pragma(pack(pop)) |
348 | #elif PX_GCC_FAMILY |
349 | #define PX_PUSH_PACK_DEFAULT _Pragma("pack(push, 8)") |
350 | #define PX_POP_PACK _Pragma("pack(pop)") |
351 | #else |
352 | #define PX_PUSH_PACK_DEFAULT |
353 | #define PX_POP_PACK |
354 | #endif |
355 | |
356 | /** |
357 | Inline macro |
358 | */ |
359 | #define PX_INLINE inline |
360 | #if PX_MICROSOFT_FAMILY |
361 | #pragma inline_depth(255) |
362 | #endif |
363 | |
364 | /** |
365 | Force inline macro |
366 | */ |
367 | #if PX_VC |
368 | #define PX_FORCE_INLINE __forceinline |
369 | #elif PX_LINUX // Workaround; Fedora Core 3 do not agree with force inline and PxcPool |
370 | #define PX_FORCE_INLINE inline |
371 | #elif PX_GCC_FAMILY |
372 | #define PX_FORCE_INLINE inline __attribute__((always_inline)) |
373 | #else |
374 | #define PX_FORCE_INLINE inline |
375 | #endif |
376 | |
377 | /** |
378 | Noinline macro |
379 | */ |
380 | #if PX_MICROSOFT_FAMILY |
381 | #define PX_NOINLINE __declspec(noinline) |
382 | #elif PX_GCC_FAMILY |
383 | #define PX_NOINLINE __attribute__((noinline)) |
384 | #else |
385 | #define PX_NOINLINE |
386 | #endif |
387 | |
388 | /** |
389 | Restrict macro |
390 | */ |
391 | #if defined(__CUDACC__) |
392 | #define PX_RESTRICT __restrict__ |
393 | #else |
394 | #define PX_RESTRICT __restrict |
395 | #endif |
396 | |
397 | /** |
398 | Noalias macro |
399 | */ |
400 | #if PX_MICROSOFT_FAMILY |
401 | #define PX_NOALIAS __declspec(noalias) |
402 | #else |
403 | #define PX_NOALIAS |
404 | #endif |
405 | |
406 | /** |
407 | Alignment macros |
408 | |
409 | PX_ALIGN_PREFIX and PX_ALIGN_SUFFIX can be used for type alignment instead of aligning individual variables as follows: |
410 | PX_ALIGN_PREFIX(16) |
411 | struct A { |
412 | ... |
413 | } PX_ALIGN_SUFFIX(16); |
414 | This declaration style is parsed correctly by Visual Assist. |
415 | |
416 | */ |
417 | #ifndef PX_ALIGN |
418 | #if PX_MICROSOFT_FAMILY |
419 | #define PX_ALIGN(alignment, decl) __declspec(align(alignment)) decl |
420 | #define PX_ALIGN_PREFIX(alignment) __declspec(align(alignment)) |
421 | #define PX_ALIGN_SUFFIX(alignment) |
422 | #elif PX_GCC_FAMILY |
423 | #define PX_ALIGN(alignment, decl) decl __attribute__((aligned(alignment))) |
424 | #define PX_ALIGN_PREFIX(alignment) |
425 | #define PX_ALIGN_SUFFIX(alignment) __attribute__((aligned(alignment))) |
426 | #elif defined __CUDACC__ |
427 | #define PX_ALIGN(alignment, decl) __align__(alignment) decl |
428 | #define PX_ALIGN_PREFIX(alignment) |
429 | #define PX_ALIGN_SUFFIX(alignment) __align__(alignment)) |
430 | #else |
431 | #define PX_ALIGN(alignment, decl) |
432 | #define PX_ALIGN_PREFIX(alignment) |
433 | #define PX_ALIGN_SUFFIX(alignment) |
434 | #endif |
435 | #endif |
436 | |
437 | /** |
438 | Deprecated macro |
439 | - To deprecate a function: Place PX_DEPRECATED at the start of the function header (leftmost word). |
440 | - To deprecate a 'typedef', a 'struct' or a 'class': Place PX_DEPRECATED directly after the keywords ('typdef', |
441 | 'struct', 'class'). |
442 | |
443 | Use these macro definitions to create warnings for deprecated functions |
444 | \#define PX_DEPRECATED __declspec(deprecated) // Microsoft |
445 | \#define PX_DEPRECATED __attribute__((deprecated())) // GCC |
446 | */ |
447 | #define PX_DEPRECATED |
448 | |
449 | /** |
450 | General defines |
451 | */ |
452 | |
453 | // static assert |
454 | #if(defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7))) || (PX_PS4) || (PX_APPLE_FAMILY) || (PX_SWITCH) || (PX_CLANG && PX_ARM) |
455 | #define PX_COMPILE_TIME_ASSERT(exp) typedef char PX_CONCAT(PxCompileTimeAssert_Dummy, __COUNTER__)[(exp) ? 1 : -1] __attribute__((unused)) |
456 | #else |
457 | #define PX_COMPILE_TIME_ASSERT(exp) typedef char PxCompileTimeAssert_Dummy[(exp) ? 1 : -1] |
458 | #endif |
459 | |
460 | #if PX_GCC_FAMILY |
461 | #define PX_OFFSET_OF(X, Y) __builtin_offsetof(X, Y) |
462 | #else |
463 | #define PX_OFFSET_OF(X, Y) offsetof(X, Y) |
464 | #endif |
465 | |
466 | #define PX_OFFSETOF_BASE 0x100 // casting the null ptr takes a special-case code path, which we don't want |
467 | #define PX_OFFSET_OF_RT(Class, Member) \ |
468 | (reinterpret_cast<size_t>(&reinterpret_cast<Class*>(PX_OFFSETOF_BASE)->Member) - size_t(PX_OFFSETOF_BASE)) |
469 | |
470 | // check that exactly one of NDEBUG and _DEBUG is defined |
471 | #if !defined(NDEBUG) ^ defined(_DEBUG) |
472 | #error Exactly one of NDEBUG and _DEBUG needs to be defined! |
473 | #endif |
474 | |
475 | // make sure PX_CHECKED is defined in all _DEBUG configurations as well |
476 | #if !PX_CHECKED && PX_DEBUG |
477 | #error PX_CHECKED must be defined when PX_DEBUG is defined |
478 | #endif |
479 | |
480 | #ifdef __CUDACC__ |
481 | #define PX_CUDA_CALLABLE __host__ __device__ |
482 | #else |
483 | #define PX_CUDA_CALLABLE |
484 | #endif |
485 | |
486 | // avoid unreferenced parameter warning |
487 | // preferred solution: omit the parameter's name from the declaration |
488 | template <class T> |
489 | PX_CUDA_CALLABLE PX_INLINE void PX_UNUSED(T const&) |
490 | { |
491 | } |
492 | |
493 | // use in a cpp file to suppress LNK4221 |
494 | #if PX_VC |
495 | #define PX_DUMMY_SYMBOL \ |
496 | namespace \ |
497 | { \ |
498 | char PxDummySymbol; \ |
499 | } |
500 | #else |
501 | #define PX_DUMMY_SYMBOL |
502 | #endif |
503 | |
504 | #if PX_GCC_FAMILY |
505 | #define PX_WEAK_SYMBOL __attribute__((weak)) // this is to support SIMD constant merging in template specialization |
506 | #else |
507 | #define PX_WEAK_SYMBOL |
508 | #endif |
509 | |
510 | // Macro for avoiding default assignment and copy, because doing this by inheritance can increase class size on some |
511 | // platforms. |
512 | #define PX_NOCOPY(Class) \ |
513 | \ |
514 | protected: \ |
515 | Class(const Class&); \ |
516 | Class& operator=(const Class&); |
517 | |
518 | #ifndef DISABLE_CUDA_PHYSX |
519 | //CUDA is currently supported only on windows |
520 | #define PX_SUPPORT_GPU_PHYSX ((PX_WINDOWS_FAMILY) || (PX_LINUX && PX_X64)) |
521 | #else |
522 | #define PX_SUPPORT_GPU_PHYSX 0 |
523 | #endif |
524 | |
525 | #define PX_SUPPORT_COMPUTE_PHYSX 0 |
526 | |
527 | #ifndef PX_SUPPORT_EXTERN_TEMPLATE |
528 | #define PX_SUPPORT_EXTERN_TEMPLATE ((!PX_ANDROID) && (PX_VC != 11)) |
529 | #else |
530 | #define PX_SUPPORT_EXTERN_TEMPLATE 0 |
531 | #endif |
532 | |
533 | /** @} */ |
534 | #endif // #ifndef PXFOUNDATION_PXPREPROCESSOR_H |
535 | |