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