nuclear@3: /************************************************************************************ nuclear@3: nuclear@3: PublicHeader: OVR.h nuclear@3: Filename : OVR_Types.h nuclear@3: Content : Standard library defines and simple types nuclear@3: Created : September 19, 2012 nuclear@3: Notes : nuclear@3: nuclear@3: Copyright : Copyright 2012 Oculus VR, Inc. All Rights reserved. nuclear@3: nuclear@3: Use of this software is subject to the terms of the Oculus license nuclear@3: agreement provided at the time of installation or download, or which nuclear@3: otherwise accompanies this software in either electronic or hard copy form. nuclear@3: nuclear@3: ************************************************************************************/ nuclear@3: nuclear@3: #ifndef OVR_Types_H nuclear@3: #define OVR_Types_H nuclear@3: nuclear@3: //----------------------------------------------------------------------------------- nuclear@3: // ****** Operating System nuclear@3: // nuclear@3: // Type definitions exist for the following operating systems: (OVR_OS_x) nuclear@3: // nuclear@3: // WIN32 - Win32 (Windows 95/98/ME and Windows NT/2000/XP) nuclear@3: // DARWIN - Darwin OS (Mac OS X) nuclear@3: // LINUX - Linux nuclear@3: // ANDROID - Android nuclear@3: // IPHONE - iPhone nuclear@3: nuclear@3: #if (defined(__APPLE__) && (defined(__GNUC__) ||\ nuclear@3: defined(__xlC__) || defined(__xlc__))) || defined(__MACOS__) nuclear@3: # if (defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) || defined(__IPHONE_OS_VERSION_MIN_REQUIRED)) nuclear@3: # define OVR_OS_IPHONE nuclear@3: # else nuclear@3: # define OVR_OS_DARWIN nuclear@3: # define OVR_OS_MAC nuclear@3: # endif nuclear@3: #elif (defined(WIN64) || defined(_WIN64) || defined(__WIN64__)) nuclear@3: # define OVR_OS_WIN32 nuclear@3: #elif (defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__)) nuclear@3: # define OVR_OS_WIN32 nuclear@3: #elif defined(__linux__) || defined(__linux) nuclear@3: # define OVR_OS_LINUX nuclear@3: #else nuclear@3: # define OVR_OS_OTHER nuclear@3: #endif nuclear@3: nuclear@3: #if defined(ANDROID) nuclear@3: # define OVR_OS_ANDROID nuclear@3: #endif nuclear@3: nuclear@3: nuclear@3: //----------------------------------------------------------------------------------- nuclear@3: // ***** CPU Architecture nuclear@3: // nuclear@3: // The following CPUs are defined: (OVR_CPU_x) nuclear@3: // nuclear@3: // X86 - x86 (IA-32) nuclear@3: // X86_64 - x86_64 (amd64) nuclear@3: // PPC - PowerPC nuclear@3: // PPC64 - PowerPC64 nuclear@3: // MIPS - MIPS nuclear@3: // OTHER - CPU for which no special support is present or needed nuclear@3: nuclear@3: nuclear@3: #if defined(__x86_64__) || defined(WIN64) || defined(_WIN64) || defined(__WIN64__) nuclear@3: # define OVR_CPU_X86_64 nuclear@3: # define OVR_64BIT_POINTERS nuclear@3: #elif defined(__i386__) || defined(OVR_OS_WIN32) nuclear@3: # define OVR_CPU_X86 nuclear@3: #elif defined(__powerpc64__) nuclear@3: # define OVR_CPU_PPC64 nuclear@3: #elif defined(__ppc__) nuclear@3: # define OVR_CPU_PPC nuclear@3: #elif defined(__mips__) || defined(__MIPSEL__) nuclear@3: # define OVR_CPU_MIPS nuclear@3: #elif defined(__arm__) nuclear@3: # define OVR_CPU_ARM nuclear@3: #else nuclear@3: # define OVR_CPU_OTHER nuclear@3: #endif nuclear@3: nuclear@3: //----------------------------------------------------------------------------------- nuclear@3: // ***** Co-Processor Architecture nuclear@3: // nuclear@3: // The following co-processors are defined: (OVR_CPU_x) nuclear@3: // nuclear@3: // SSE - Available on all modern x86 processors. nuclear@3: // Altivec - Available on all modern ppc processors. nuclear@3: // Neon - Available on some armv7+ processors. nuclear@3: nuclear@3: #if defined(__SSE__) || defined(OVR_OS_WIN32) nuclear@3: # define OVR_CPU_SSE nuclear@3: #endif // __SSE__ nuclear@3: nuclear@3: #if defined( __ALTIVEC__ ) nuclear@3: # define OVR_CPU_ALTIVEC nuclear@3: #endif // __ALTIVEC__ nuclear@3: nuclear@3: #if defined(__ARM_NEON__) nuclear@3: # define OVR_CPU_ARM_NEON nuclear@3: #endif // __ARM_NEON__ nuclear@3: nuclear@3: nuclear@3: //----------------------------------------------------------------------------------- nuclear@3: // ***** Compiler nuclear@3: // nuclear@3: // The following compilers are defined: (OVR_CC_x) nuclear@3: // nuclear@3: // MSVC - Microsoft Visual C/C++ nuclear@3: // INTEL - Intel C++ for Linux / Windows nuclear@3: // GNU - GNU C++ nuclear@3: // ARM - ARM C/C++ nuclear@3: nuclear@3: #if defined(__INTEL_COMPILER) nuclear@3: // Intel 4.0 = 400 nuclear@3: // Intel 5.0 = 500 nuclear@3: // Intel 6.0 = 600 nuclear@3: // Intel 8.0 = 800 nuclear@3: // Intel 9.0 = 900 nuclear@3: # define OVR_CC_INTEL __INTEL_COMPILER nuclear@3: nuclear@3: #elif defined(_MSC_VER) nuclear@3: // MSVC 5.0 = 1100 nuclear@3: // MSVC 6.0 = 1200 nuclear@3: // MSVC 7.0 (VC2002) = 1300 nuclear@3: // MSVC 7.1 (VC2003) = 1310 nuclear@3: // MSVC 8.0 (VC2005) = 1400 nuclear@3: // MSVC 9.0 (VC2008) = 1500 nuclear@3: // MSVC 10.0 (VC2010) = 1600 nuclear@3: # define OVR_CC_MSVC _MSC_VER nuclear@3: nuclear@3: #elif defined(__GNUC__) nuclear@3: # define OVR_CC_GNU nuclear@3: nuclear@3: #elif defined(__CC_ARM) nuclear@3: # define OVR_CC_ARM nuclear@3: nuclear@3: #else nuclear@3: # error "Oculus does not support this Compiler" nuclear@3: #endif nuclear@3: nuclear@3: nuclear@3: //----------------------------------------------------------------------------------- nuclear@3: // ***** Compiler Warnings nuclear@3: nuclear@3: // Disable MSVC warnings nuclear@3: #if defined(OVR_CC_MSVC) nuclear@3: # pragma warning(disable : 4127) // Inconsistent dll linkage nuclear@3: # pragma warning(disable : 4530) // Exception handling nuclear@3: # if (OVR_CC_MSVC<1300) nuclear@3: # pragma warning(disable : 4514) // Unreferenced inline function has been removed nuclear@3: # pragma warning(disable : 4710) // Function not inlined nuclear@3: # pragma warning(disable : 4714) // _force_inline not inlined nuclear@3: # pragma warning(disable : 4786) // Debug variable name longer than 255 chars nuclear@3: # endif // (OVR_CC_MSVC<1300) nuclear@3: #endif // (OVR_CC_MSVC) nuclear@3: nuclear@3: nuclear@3: nuclear@3: // *** Linux Unicode - must come before Standard Includes nuclear@3: nuclear@3: #ifdef OVR_OS_LINUX nuclear@3: // Use glibc unicode functions on linux. nuclear@3: # ifndef _GNU_SOURCE nuclear@3: # define _GNU_SOURCE nuclear@3: # endif nuclear@3: #endif nuclear@3: nuclear@3: //----------------------------------------------------------------------------------- nuclear@3: // ***** Standard Includes nuclear@3: // nuclear@3: #include nuclear@3: #include nuclear@3: #include nuclear@3: nuclear@3: nuclear@3: // MSVC Based Memory Leak checking - for now nuclear@3: #if defined(OVR_CC_MSVC) && defined(OVR_BUILD_DEBUG) nuclear@3: # define _CRTDBG_MAP_ALLOC nuclear@3: # include nuclear@3: # include nuclear@3: nuclear@3: // Uncomment this to help debug memory leaks under Visual Studio in OVR apps only. nuclear@3: // This shouldn't be defined in customer releases. nuclear@3: # ifndef OVR_DEFINE_NEW nuclear@3: # define OVR_DEFINE_NEW new(__FILE__, __LINE__) nuclear@3: # define new OVR_DEFINE_NEW nuclear@3: # endif nuclear@3: nuclear@3: #endif nuclear@3: nuclear@3: nuclear@3: //----------------------------------------------------------------------------------- nuclear@3: // ***** Type definitions for Common Systems nuclear@3: nuclear@3: namespace OVR { nuclear@3: nuclear@3: typedef char Char; nuclear@3: nuclear@3: // Pointer-sized integer nuclear@3: typedef size_t UPInt; nuclear@3: typedef ptrdiff_t SPInt; nuclear@3: nuclear@3: nuclear@3: #if defined(OVR_OS_WIN32) nuclear@3: nuclear@3: typedef char SByte; // 8 bit Integer (Byte) nuclear@3: typedef unsigned char UByte; nuclear@3: typedef short SInt16; // 16 bit Integer (Word) nuclear@3: typedef unsigned short UInt16; nuclear@3: typedef long SInt32; // 32 bit Integer nuclear@3: typedef unsigned long UInt32; nuclear@3: typedef __int64 SInt64; // 64 bit Integer (QWord) nuclear@3: typedef unsigned __int64 UInt64; nuclear@3: nuclear@3: nuclear@3: #elif defined(OVR_OS_MAC) || defined(OVR_OS_IPHONE) || defined(OVR_CC_GNU) nuclear@3: nuclear@3: typedef int SByte __attribute__((__mode__ (__QI__))); nuclear@3: typedef unsigned int UByte __attribute__((__mode__ (__QI__))); nuclear@3: typedef int SInt16 __attribute__((__mode__ (__HI__))); nuclear@3: typedef unsigned int UInt16 __attribute__((__mode__ (__HI__))); nuclear@3: typedef int SInt32 __attribute__((__mode__ (__SI__))); nuclear@3: typedef unsigned int UInt32 __attribute__((__mode__ (__SI__))); nuclear@3: typedef int SInt64 __attribute__((__mode__ (__DI__))); nuclear@3: typedef unsigned int UInt64 __attribute__((__mode__ (__DI__))); nuclear@3: nuclear@3: #else nuclear@3: nuclear@3: #include nuclear@3: typedef int8_t SByte; nuclear@3: typedef uint8_t UByte; nuclear@3: typedef int16_t SInt16; nuclear@3: typedef uint16_t UInt16; nuclear@3: typedef int32_t SInt32; nuclear@3: typedef uint32_t UInt32; nuclear@3: typedef int64_t SInt64; nuclear@3: typedef uint64_t UInt64; nuclear@3: nuclear@3: #endif nuclear@3: nuclear@3: nuclear@3: // ***** BaseTypes Namespace nuclear@3: nuclear@3: // BaseTypes namespace is explicitly declared to allow base types to be used nuclear@3: // by customers directly without other contents of OVR namespace. nuclear@3: // nuclear@3: // Its is expected that GFx samples will declare 'using namespace OVR::BaseTypes' nuclear@3: // to allow using these directly without polluting the target scope with other nuclear@3: // OVR declarations, such as Ptr<>, String or Mutex. nuclear@3: namespace BaseTypes nuclear@3: { nuclear@3: using OVR::UPInt; nuclear@3: using OVR::SPInt; nuclear@3: using OVR::UByte; nuclear@3: using OVR::SByte; nuclear@3: using OVR::UInt16; nuclear@3: using OVR::SInt16; nuclear@3: using OVR::UInt32; nuclear@3: using OVR::SInt32; nuclear@3: using OVR::UInt64; nuclear@3: using OVR::SInt64; nuclear@3: } // OVR::BaseTypes nuclear@3: nuclear@3: } // OVR nuclear@3: nuclear@3: nuclear@3: //----------------------------------------------------------------------------------- nuclear@3: // ***** Macro Definitions nuclear@3: // nuclear@3: // We define the following: nuclear@3: // nuclear@3: // OVR_BYTE_ORDER - Defined to either OVR_LITTLE_ENDIAN or OVR_BIG_ENDIAN nuclear@3: // OVR_FORCE_INLINE - Forces inline expansion of function nuclear@3: // OVR_ASM - Assembly language prefix nuclear@3: // OVR_STR - Prefixes string with L"" if building unicode nuclear@3: // nuclear@3: // OVR_STDCALL - Use stdcall calling convention (Pascal arg order) nuclear@3: // OVR_CDECL - Use cdecl calling convention (C argument order) nuclear@3: // OVR_FASTCALL - Use fastcall calling convention (registers) nuclear@3: // nuclear@3: nuclear@3: // Byte order constants, OVR_BYTE_ORDER is defined to be one of these. nuclear@3: #define OVR_LITTLE_ENDIAN 1 nuclear@3: #define OVR_BIG_ENDIAN 2 nuclear@3: nuclear@3: nuclear@3: // Force inline substitute - goes before function declaration nuclear@3: #if defined(OVR_CC_MSVC) nuclear@3: # define OVR_FORCE_INLINE __forceinline nuclear@3: #elif defined(OVR_CC_GNU) nuclear@3: # define OVR_FORCE_INLINE __attribute__((always_inline)) inline nuclear@3: #else nuclear@3: # define OVR_FORCE_INLINE inline nuclear@3: #endif // OVR_CC_MSVC nuclear@3: nuclear@3: nuclear@3: #if defined(OVR_OS_WIN32) nuclear@3: nuclear@3: // ***** Win32 nuclear@3: nuclear@3: // Byte order nuclear@3: #define OVR_BYTE_ORDER OVR_LITTLE_ENDIAN nuclear@3: nuclear@3: // Calling convention - goes after function return type but before function name nuclear@3: #ifdef __cplusplus_cli nuclear@3: # define OVR_FASTCALL __stdcall nuclear@3: #else nuclear@3: # define OVR_FASTCALL __fastcall nuclear@3: #endif nuclear@3: nuclear@3: #define OVR_STDCALL __stdcall nuclear@3: #define OVR_CDECL __cdecl nuclear@3: nuclear@3: nuclear@3: // Assembly macros nuclear@3: #if defined(OVR_CC_MSVC) nuclear@3: # define OVR_ASM _asm nuclear@3: #else nuclear@3: # define OVR_ASM asm nuclear@3: #endif // (OVR_CC_MSVC) nuclear@3: nuclear@3: #ifdef UNICODE nuclear@3: # define OVR_STR(str) L##str nuclear@3: #else nuclear@3: # define OVR_STR(str) str nuclear@3: #endif // UNICODE nuclear@3: nuclear@3: #else nuclear@3: nuclear@3: // **** Standard systems nuclear@3: nuclear@3: #if (defined(BYTE_ORDER) && (BYTE_ORDER == BIG_ENDIAN))|| \ nuclear@3: (defined(_BYTE_ORDER) && (_BYTE_ORDER == _BIG_ENDIAN)) nuclear@3: # define OVR_BYTE_ORDER OVR_BIG_ENDIAN nuclear@3: #elif (defined(__ARMEB__) || defined(OVR_CPU_PPC) || defined(OVR_CPU_PPC64)) nuclear@3: # define OVR_BYTE_ORDER OVR_BIG_ENDIAN nuclear@3: #else nuclear@3: # define OVR_BYTE_ORDER OVR_LITTLE_ENDIAN nuclear@3: #endif nuclear@3: nuclear@3: // Assembly macros nuclear@3: #define OVR_ASM __asm__ nuclear@3: #define OVR_ASM_PROC(procname) OVR_ASM nuclear@3: #define OVR_ASM_END OVR_ASM nuclear@3: nuclear@3: // Calling convention - goes after function return type but before function name nuclear@3: #define OVR_FASTCALL nuclear@3: #define OVR_STDCALL nuclear@3: #define OVR_CDECL nuclear@3: nuclear@3: #endif // defined(OVR_OS_WIN32) nuclear@3: nuclear@3: nuclear@3: nuclear@3: //----------------------------------------------------------------------------------- nuclear@3: // ***** OVR_DEBUG_BREAK, OVR_ASSERT nuclear@3: // nuclear@3: // If not in debug build, macros do nothing nuclear@3: #ifndef OVR_BUILD_DEBUG nuclear@3: nuclear@3: # define OVR_DEBUG_BREAK ((void)0) nuclear@3: # define OVR_ASSERT(p) ((void)0) nuclear@3: nuclear@3: #else nuclear@3: nuclear@3: // Microsoft Win32 specific debugging support nuclear@3: #if defined(OVR_OS_WIN32) nuclear@3: # ifdef OVR_CPU_X86 nuclear@3: # if defined(__cplusplus_cli) nuclear@3: # define OVR_DEBUG_BREAK do { __debugbreak(); } while(0) nuclear@3: # elif defined(OVR_CC_GNU) nuclear@3: # define OVR_DEBUG_BREAK do { OVR_ASM("int $3\n\t"); } while(0) nuclear@3: # else nuclear@3: # define OVR_DEBUG_BREAK do { OVR_ASM int 3 } while (0) nuclear@3: # endif nuclear@3: # else nuclear@3: # define OVR_DEBUG_BREAK do { __debugbreak(); } while(0) nuclear@3: # endif nuclear@3: // Unix specific debugging support nuclear@3: #elif defined(OVR_CPU_X86) || defined(OVR_CPU_X86_64) nuclear@3: # define OVR_DEBUG_BREAK do { OVR_ASM("int $3\n\t"); } while(0) nuclear@3: #else nuclear@3: # define OVR_DEBUG_BREAK do { *((int *) 0) = 1; } while(0) nuclear@3: #endif nuclear@3: nuclear@3: // This will cause compiler breakpoint nuclear@3: #define OVR_ASSERT(p) do { if (!(p)) { OVR_DEBUG_BREAK; } } while(0) nuclear@3: nuclear@3: #endif // OVR_BUILD_DEBUG nuclear@3: nuclear@3: nuclear@3: // Compile-time assert; produces compiler error if condition is false nuclear@3: #define OVR_COMPILER_ASSERT(x) { int zero = 0; switch(zero) {case 0: case x:;} } nuclear@3: nuclear@3: nuclear@3: nuclear@3: //----------------------------------------------------------------------------------- nuclear@3: // ***** OVR_UNUSED - Unused Argument handling nuclear@3: nuclear@3: // Macro to quiet compiler warnings about unused parameters/variables. nuclear@3: #if defined(OVR_CC_GNU) nuclear@3: # define OVR_UNUSED(a) do {__typeof__ (&a) __attribute__ ((unused)) __tmp = &a; } while(0) nuclear@3: #else nuclear@3: # define OVR_UNUSED(a) (a) nuclear@3: #endif nuclear@3: nuclear@3: #define OVR_UNUSED1(a1) OVR_UNUSED(a1) nuclear@3: #define OVR_UNUSED2(a1,a2) OVR_UNUSED(a1); OVR_UNUSED(a2) nuclear@3: #define OVR_UNUSED3(a1,a2,a3) OVR_UNUSED2(a1,a2); OVR_UNUSED(a3) nuclear@3: #define OVR_UNUSED4(a1,a2,a3,a4) OVR_UNUSED3(a1,a2,a3); OVR_UNUSED(a4) nuclear@3: #define OVR_UNUSED5(a1,a2,a3,a4,a5) OVR_UNUSED4(a1,a2,a3,a4); OVR_UNUSED(a5) nuclear@3: #define OVR_UNUSED6(a1,a2,a3,a4,a5,a6) OVR_UNUSED4(a1,a2,a3,a4); OVR_UNUSED2(a5,a6) nuclear@3: #define OVR_UNUSED7(a1,a2,a3,a4,a5,a6,a7) OVR_UNUSED4(a1,a2,a3,a4); OVR_UNUSED3(a5,a6,a7) nuclear@3: #define OVR_UNUSED8(a1,a2,a3,a4,a5,a6,a7,a8) OVR_UNUSED4(a1,a2,a3,a4); OVR_UNUSED4(a5,a6,a7,a8) nuclear@3: #define OVR_UNUSED9(a1,a2,a3,a4,a5,a6,a7,a8,a9) OVR_UNUSED4(a1,a2,a3,a4); OVR_UNUSED5(a5,a6,a7,a8,a9) nuclear@3: nuclear@3: nuclear@3: //----------------------------------------------------------------------------------- nuclear@3: // ***** Configuration Macros nuclear@3: nuclear@3: // SF Build type nuclear@3: #ifdef OVR_BUILD_DEBUG nuclear@3: # define OVR_BUILD_STRING "Debug" nuclear@3: #else nuclear@3: # define OVR_BUILD_STRING "Release" nuclear@3: #endif nuclear@3: nuclear@3: nuclear@3: //// Enables SF Debugging information nuclear@3: //# define OVR_BUILD_DEBUG nuclear@3: nuclear@3: // OVR_DEBUG_STATEMENT injects a statement only in debug builds. nuclear@3: // OVR_DEBUG_SELECT injects first argument in debug builds, second argument otherwise. nuclear@3: #ifdef OVR_BUILD_DEBUG nuclear@3: #define OVR_DEBUG_STATEMENT(s) s nuclear@3: #define OVR_DEBUG_SELECT(d, nd) d nuclear@3: #else nuclear@3: #define OVR_DEBUG_STATEMENT(s) nuclear@3: #define OVR_DEBUG_SELECT(d, nd) nd nuclear@3: #endif nuclear@3: nuclear@3: nuclear@3: #define OVR_ENABLE_THREADS nuclear@3: // nuclear@3: // Prevents OVR from defining new within nuclear@3: // type macros, so developers can override nuclear@3: // new using the #define new new(...) trick nuclear@3: // - used with OVR_DEFINE_NEW macro nuclear@3: //# define OVR_BUILD_DEFINE_NEW nuclear@3: // nuclear@3: nuclear@3: nuclear@3: #endif // OVR_Types_h