353 lines
9.2 KiB
C
353 lines
9.2 KiB
C
|
// This code contains NVIDIA Confidential Information and is disclosed to you
|
||
|
// under a form of NVIDIA software license agreement provided separately to you.
|
||
|
//
|
||
|
// Notice
|
||
|
// NVIDIA Corporation and its licensors retain all intellectual property and
|
||
|
// proprietary rights in and to this software and related documentation and
|
||
|
// any modifications thereto. Any use, reproduction, disclosure, or
|
||
|
// distribution of this software and related documentation without an express
|
||
|
// license agreement from NVIDIA Corporation is strictly prohibited.
|
||
|
//
|
||
|
// ALL NVIDIA DESIGN SPECIFICATIONS, CODE ARE PROVIDED "AS IS.". NVIDIA MAKES
|
||
|
// NO WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO
|
||
|
// THE MATERIALS, AND EXPRESSLY DISCLAIMS ALL IMPLIED WARRANTIES OF NONINFRINGEMENT,
|
||
|
// MERCHANTABILITY, AND FITNESS FOR A PARTICULAR PURPOSE.
|
||
|
//
|
||
|
// Information and code furnished is believed to be accurate and reliable.
|
||
|
// However, NVIDIA Corporation assumes no responsibility for the consequences of use of such
|
||
|
// information or for any infringement of patents or other rights of third parties that may
|
||
|
// result from its use. No license is granted by implication or otherwise under any patent
|
||
|
// or patent rights of NVIDIA Corporation. Details are subject to change without notice.
|
||
|
// This code supersedes and replaces all information previously supplied.
|
||
|
// NVIDIA Corporation products are not authorized for use as critical
|
||
|
// components in life support devices or systems without express written approval of
|
||
|
// NVIDIA Corporation.
|
||
|
//
|
||
|
// Copyright (c) 2008-2013 NVIDIA Corporation. All rights reserved.
|
||
|
// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved.
|
||
|
// Copyright (c) 2001-2004 NovodeX AG. All rights reserved.
|
||
|
|
||
|
|
||
|
#ifndef PX_FOUNDATION_PX_PREPROCESSOR_H
|
||
|
#define PX_FOUNDATION_PX_PREPROCESSOR_H
|
||
|
|
||
|
#include <stddef.h>
|
||
|
/** \addtogroup foundation
|
||
|
@{
|
||
|
*/
|
||
|
|
||
|
|
||
|
/**
|
||
|
List of preprocessor defines used to configure the SDK
|
||
|
- NDEBUG/_DEBUG: enable asserts (exactly one needs to be defined)
|
||
|
- PX_CHECKED: enable run time checks, mostly unused or equiv. to _DEBUG
|
||
|
- PX_SUPPORT_VISUAL_DEBUGGER: ...
|
||
|
- AG_PERFMON: ...
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
Compiler define
|
||
|
*/
|
||
|
#ifdef _MSC_VER
|
||
|
# define PX_VC
|
||
|
# if _MSC_VER >= 1600
|
||
|
# define PX_VC10
|
||
|
# elif _MSC_VER >= 1500
|
||
|
# define PX_VC9
|
||
|
# elif _MSC_VER >= 1400
|
||
|
# define PX_VC8
|
||
|
# elif _MSC_VER >= 1300
|
||
|
# define PX_VC7
|
||
|
# else
|
||
|
# define PX_VC6
|
||
|
# endif
|
||
|
#elif __GNUC__ || __SNC__
|
||
|
# define PX_GNUC
|
||
|
#elif defined(__MWERKS__)
|
||
|
# define PX_CW
|
||
|
#else
|
||
|
# error "Unknown compiler"
|
||
|
#endif
|
||
|
|
||
|
|
||
|
/**
|
||
|
Platform define
|
||
|
*/
|
||
|
#ifdef PX_VC
|
||
|
# ifdef _M_IX86
|
||
|
# define PX_X86
|
||
|
# define PX_WINDOWS
|
||
|
# elif defined(_M_X64)
|
||
|
# define PX_X64
|
||
|
# define PX_WINDOWS
|
||
|
# elif defined(_M_PPC)
|
||
|
# define PX_PPC
|
||
|
# define PX_X360
|
||
|
# define PX_VMX
|
||
|
# elif defined(_M_ARM)
|
||
|
# define PX_ARM
|
||
|
# else
|
||
|
# error "Unknown platform"
|
||
|
# endif
|
||
|
# if defined(WINAPI_FAMILY) && ((WINAPI_FAMILY & WINAPI_PARTITION_APP) == WINAPI_PARTITION_APP)
|
||
|
# define PX_WINMODERN
|
||
|
# endif
|
||
|
#elif defined PX_GNUC
|
||
|
# ifdef __CELLOS_LV2__
|
||
|
# define PX_PS3
|
||
|
# define PX_VMX
|
||
|
# elif defined(__arm__)
|
||
|
# define PX_ARM
|
||
|
# if defined(__SNC__)
|
||
|
# define PX_PSP2
|
||
|
# endif
|
||
|
# elif defined(__i386__)
|
||
|
# define PX_X86
|
||
|
# define PX_VMX
|
||
|
# elif defined(__x86_64__)
|
||
|
# define PX_X64
|
||
|
# elif defined(__ppc__)
|
||
|
# define PX_PPC
|
||
|
# elif defined(__ppc64__)
|
||
|
# define PX_PPC
|
||
|
# define PX_PPC64
|
||
|
# else
|
||
|
# error "Unknown platform"
|
||
|
# endif
|
||
|
# if defined(ANDROID)
|
||
|
# define PX_ANDROID
|
||
|
# elif defined(__linux__)
|
||
|
# define PX_LINUX
|
||
|
# elif defined(__APPLE__)
|
||
|
# define PX_APPLE
|
||
|
# if defined(__arm__)
|
||
|
# define PX_APPLE_IOS
|
||
|
# endif
|
||
|
# elif defined(__CYGWIN__)
|
||
|
# define PX_CYGWIN
|
||
|
# define PX_LINUX
|
||
|
# endif
|
||
|
#elif defined PX_CW
|
||
|
# if defined(__PPCGEKKO__)
|
||
|
# if defined(RVL)
|
||
|
# define PX_WII
|
||
|
# else
|
||
|
# define PX_GC
|
||
|
# endif
|
||
|
# else
|
||
|
# error "Unknown platform"
|
||
|
# endif
|
||
|
#endif
|
||
|
|
||
|
|
||
|
/**
|
||
|
DLL export macros
|
||
|
*/
|
||
|
#if !defined(PX_C_EXPORT)
|
||
|
# if defined(PX_WINDOWS) || defined(PX_WIN8ARM)
|
||
|
# define PX_C_EXPORT extern "C"
|
||
|
# else
|
||
|
# define PX_C_EXPORT
|
||
|
# endif
|
||
|
#endif
|
||
|
|
||
|
/**
|
||
|
Define API function declaration
|
||
|
|
||
|
PX_FOUNDATION_EXPORTS - used by the DLL library (PhysXCommon) to export the API
|
||
|
PX_FOUNDATION_NO_EXPORTS - exists because there are windows configurations where
|
||
|
the PX_FOUNDATION_API is linked through standard static linking
|
||
|
no definition - this will allow DLLs and libraries to use the exported API from PhysXCommon
|
||
|
|
||
|
*/
|
||
|
#if (defined(PX_WINDOWS) || defined(PX_WINMODERN) ) && !defined(__CUDACC__)
|
||
|
#if defined PX_FOUNDATION_EXPORTS
|
||
|
#define PX_FOUNDATION_API __declspec(dllexport)
|
||
|
#elif defined PX_FOUNDATION_NO_EXPORTS
|
||
|
#define PX_FOUNDATION_API
|
||
|
#else
|
||
|
#define PX_FOUNDATION_API __declspec(dllimport)
|
||
|
#endif
|
||
|
#else
|
||
|
#define PX_FOUNDATION_API
|
||
|
#endif
|
||
|
|
||
|
/**
|
||
|
Calling convention
|
||
|
*/
|
||
|
#ifndef PX_CALL_CONV
|
||
|
# if defined PX_WINDOWS
|
||
|
# define PX_CALL_CONV __cdecl
|
||
|
# else
|
||
|
# define PX_CALL_CONV
|
||
|
# endif
|
||
|
#endif
|
||
|
|
||
|
/**
|
||
|
Pack macros - disabled on SPU because they are not supported
|
||
|
*/
|
||
|
#if defined(PX_VC)
|
||
|
# define PX_PUSH_PACK_DEFAULT __pragma( pack(push, 8) )
|
||
|
# define PX_POP_PACK __pragma( pack(pop) )
|
||
|
#elif defined(PX_GNUC) && !defined(__SPU__)
|
||
|
# define PX_PUSH_PACK_DEFAULT _Pragma("pack(push, 8)")
|
||
|
# define PX_POP_PACK _Pragma("pack(pop)")
|
||
|
#else
|
||
|
# define PX_PUSH_PACK_DEFAULT
|
||
|
# define PX_POP_PACK
|
||
|
#endif
|
||
|
|
||
|
/**
|
||
|
Inline macro
|
||
|
*/
|
||
|
#if defined(PX_WINDOWS) || defined(PX_WINMODERN) || defined(PX_X360)
|
||
|
# define PX_INLINE inline
|
||
|
# pragma inline_depth( 255 )
|
||
|
#else
|
||
|
# define PX_INLINE inline
|
||
|
#endif
|
||
|
|
||
|
/**
|
||
|
Force inline macro
|
||
|
*/
|
||
|
#if defined(PX_VC)
|
||
|
#define PX_FORCE_INLINE __forceinline
|
||
|
#elif defined(PX_LINUX) // Workaround; Fedora Core 3 do not agree with force inline and PxcPool
|
||
|
#define PX_FORCE_INLINE inline
|
||
|
#elif defined(PX_GNUC)
|
||
|
#define PX_FORCE_INLINE inline __attribute__((always_inline))
|
||
|
#else
|
||
|
#define PX_FORCE_INLINE inline
|
||
|
#endif
|
||
|
|
||
|
/**
|
||
|
Noinline macro
|
||
|
*/
|
||
|
#if defined PX_WINDOWS
|
||
|
# define PX_NOINLINE __declspec(noinline)
|
||
|
#elif defined(PX_GNUC)
|
||
|
# define PX_NOINLINE __attribute__ ((noinline))
|
||
|
#else
|
||
|
# define PX_NOINLINE
|
||
|
#endif
|
||
|
|
||
|
|
||
|
/*! restrict macro */
|
||
|
#if __CUDACC__
|
||
|
# define PX_RESTRICT __restrict__
|
||
|
#elif defined(PX_GNUC) || defined(PX_VC)
|
||
|
# define PX_RESTRICT __restrict
|
||
|
#elif defined(PX_CW) && __STDC_VERSION__ >= 199901L
|
||
|
# define PX_RESTRICT restrict
|
||
|
#else
|
||
|
# define PX_RESTRICT
|
||
|
#endif
|
||
|
|
||
|
#if defined(PX_WINDOWS) || defined(PX_WINMODERN) || defined(PX_X360)
|
||
|
#define PX_NOALIAS __declspec(noalias)
|
||
|
#else
|
||
|
#define PX_NOALIAS
|
||
|
#endif
|
||
|
|
||
|
|
||
|
/**
|
||
|
Alignment macros
|
||
|
|
||
|
PX_ALIGN_PREFIX and PX_ALIGN_SUFFIX can be used for type alignment instead of aligning individual variables as follows:
|
||
|
PX_ALIGN_PREFIX(16)
|
||
|
struct A {
|
||
|
...
|
||
|
} PX_ALIGN_SUFFIX(16);
|
||
|
This declaration style is parsed correctly by Visual Assist.
|
||
|
|
||
|
*/
|
||
|
#ifndef PX_ALIGN
|
||
|
#if defined(PX_VC)
|
||
|
#define PX_ALIGN(alignment, decl) __declspec(align(alignment)) decl
|
||
|
#define PX_ALIGN_PREFIX(alignment) __declspec(align(alignment))
|
||
|
#define PX_ALIGN_SUFFIX(alignment)
|
||
|
#elif defined(PX_GNUC)
|
||
|
#define PX_ALIGN(alignment, decl) decl __attribute__ ((aligned(alignment)))
|
||
|
#define PX_ALIGN_PREFIX(alignment)
|
||
|
#define PX_ALIGN_SUFFIX(alignment) __attribute__ ((aligned(alignment)))
|
||
|
#elif defined(PX_CW)
|
||
|
#define PX_ALIGN(alignment, decl) decl __attribute__ ((aligned(alignment)))
|
||
|
#define PX_ALIGN_PREFIX(alignment)
|
||
|
#define PX_ALIGN_SUFFIX(alignment) __attribute__ ((aligned(alignment)))
|
||
|
#else
|
||
|
#define PX_ALIGN(alignment, decl)
|
||
|
#define PX_ALIGN_PREFIX(alignment)
|
||
|
#define PX_ALIGN_SUFFIX(alignment)
|
||
|
#endif
|
||
|
#endif
|
||
|
|
||
|
/**
|
||
|
Deprecated marco
|
||
|
*/
|
||
|
#if 0 // set to 1 to create warnings for deprecated functions
|
||
|
# define PX_DEPRECATED __declspec(deprecated)
|
||
|
#else
|
||
|
# define PX_DEPRECATED
|
||
|
#endif
|
||
|
|
||
|
// VC6 no '__FUNCTION__' workaround
|
||
|
#if defined PX_VC6 && !defined __FUNCTION__
|
||
|
# define __FUNCTION__ "Undefined"
|
||
|
#endif
|
||
|
|
||
|
/**
|
||
|
General defines
|
||
|
*/
|
||
|
|
||
|
// static assert
|
||
|
#define PX_COMPILE_TIME_ASSERT(exp) typedef char PxCompileTimeAssert_Dummy[(exp) ? 1 : -1]
|
||
|
|
||
|
#ifdef PX_GNUC
|
||
|
#define PX_OFFSET_OF(X, Y) __builtin_offsetof(X, Y)
|
||
|
#else
|
||
|
#define PX_OFFSET_OF(X, Y) offsetof(X, Y)
|
||
|
#endif
|
||
|
|
||
|
// avoid unreferenced parameter warning (why not just disable it?)
|
||
|
// PT: or why not just omit the parameter's name from the declaration????
|
||
|
#define PX_FORCE_PARAMETER_REFERENCE(_P) (void)(_P);
|
||
|
#define PX_UNUSED(_P) PX_FORCE_PARAMETER_REFERENCE(_P)
|
||
|
|
||
|
// check that exactly one of NDEBUG and _DEBUG is defined
|
||
|
#if !(defined NDEBUG ^ defined _DEBUG)
|
||
|
#error Exactly one of NDEBUG and _DEBUG needs to be defined by preprocessor
|
||
|
#endif
|
||
|
|
||
|
// make sure PX_CHECKED is defined in all _DEBUG configurations as well
|
||
|
#if !defined(PX_CHECKED) && _DEBUG
|
||
|
#define PX_CHECKED
|
||
|
#endif
|
||
|
|
||
|
#ifdef __CUDACC__
|
||
|
#define PX_CUDA_CALLABLE __host__ __device__
|
||
|
#else
|
||
|
#define PX_CUDA_CALLABLE
|
||
|
#endif
|
||
|
|
||
|
// Ensure that the application hasn't tweaked the pack value to less than 8, which would break
|
||
|
// matching between the API headers and the binaries
|
||
|
// This assert works on win32/win64/360/ps3, but may need further specialization on other platforms.
|
||
|
// Some GCC compilers need the compiler flag -malign-double to be set.
|
||
|
// Apparently the apple-clang-llvm compiler doesn't support malign-double.
|
||
|
|
||
|
struct PxPackValidation { char _; long long a; };
|
||
|
|
||
|
#if !defined(PX_APPLE)
|
||
|
PX_COMPILE_TIME_ASSERT(PX_OFFSET_OF(PxPackValidation, a) == 8);
|
||
|
#endif
|
||
|
|
||
|
// use in a cpp file to suppress LNK4221
|
||
|
#if defined(PX_VC)
|
||
|
#define PX_DUMMY_SYMBOL namespace { char PxDummySymbol; }
|
||
|
#else
|
||
|
#define PX_DUMMY_SYMBOL
|
||
|
#endif
|
||
|
|
||
|
/** @} */
|
||
|
#endif // PX_FOUNDATION_PX_PREPROCESSOR_H
|