28 #ifndef __PlatformInformation_H__
29 #define __PlatformInformation_H__
40 #define OGRE_CPU_UNKNOWN 0
41 #define OGRE_CPU_X86 1
42 #define OGRE_CPU_PPC 2
43 #define OGRE_CPU_ARM 3
47 #if (defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64))) || \
48 (defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)))
49 # define OGRE_CPU OGRE_CPU_X86
51 #elif OGRE_PLATFORM == OGRE_PLATFORM_APPLE && defined(__BIG_ENDIAN__)
52 # define OGRE_CPU OGRE_CPU_PPC
53 #elif OGRE_PLATFORM == OGRE_PLATFORM_APPLE
54 # define OGRE_CPU OGRE_CPU_X86
55 #elif OGRE_PLATFORM == OGRE_PLATFORM_APPLE_IOS && (defined(__i386__) || defined(__x86_64__))
56 # define OGRE_CPU OGRE_CPU_X86
57 #elif defined(__arm__) || defined(_M_ARM)
58 # define OGRE_CPU OGRE_CPU_ARM
60 # define OGRE_CPU OGRE_CPU_UNKNOWN
65 #if OGRE_COMPILER == OGRE_COMPILER_MSVC
66 # define OGRE_ALIGNED_DECL(type, var, alignment) __declspec(align(alignment)) type var
68 #elif (OGRE_COMPILER == OGRE_COMPILER_GNUC) || (OGRE_COMPILER == OGRE_COMPILER_CLANG)
69 # define OGRE_ALIGNED_DECL(type, var, alignment) type var __attribute__((__aligned__(alignment)))
72 # define OGRE_ALIGNED_DECL(type, var, alignment) type var
77 #if OGRE_CPU == OGRE_CPU_X86
78 # define OGRE_SIMD_ALIGNMENT 16
81 # define OGRE_SIMD_ALIGNMENT 16
86 #define OGRE_SIMD_ALIGNED_DECL(type, var) OGRE_ALIGNED_DECL(type, var, OGRE_SIMD_ALIGNMENT)
90 #if OGRE_DOUBLE_PRECISION == 0 && OGRE_CPU == OGRE_CPU_X86 && OGRE_COMPILER == OGRE_COMPILER_MSVC && \
91 OGRE_PLATFORM != OGRE_PLATFORM_NACL
92 # define __OGRE_HAVE_SSE 1
93 #elif OGRE_DOUBLE_PRECISION == 0 && OGRE_CPU == OGRE_CPU_X86 && (OGRE_COMPILER == OGRE_COMPILER_GNUC || OGRE_COMPILER == OGRE_COMPILER_CLANG) && \
94 OGRE_PLATFORM != OGRE_PLATFORM_APPLE_IOS && OGRE_PLATFORM != OGRE_PLATFORM_NACL
95 # define __OGRE_HAVE_SSE 1
100 #if OGRE_DOUBLE_PRECISION == 0 && OGRE_CPU == OGRE_CPU_ARM && (OGRE_COMPILER == OGRE_COMPILER_GNUC || OGRE_COMPILER == OGRE_COMPILER_CLANG) && defined(__ARM_ARCH_6K__) && defined(__VFP_FP__)
101 # define __OGRE_HAVE_VFP 1
106 #if OGRE_DOUBLE_PRECISION == 0 && OGRE_CPU == OGRE_CPU_ARM && (OGRE_COMPILER == OGRE_COMPILER_GNUC || OGRE_COMPILER == OGRE_COMPILER_CLANG) && defined(__ARM_ARCH_7A__) && defined(__ARM_NEON__)
107 # define __OGRE_HAVE_NEON 1
110 #ifndef __OGRE_HAVE_SSE
111 # define __OGRE_HAVE_SSE 0
114 #ifndef __OGRE_HAVE_VFP
115 # define __OGRE_HAVE_VFP 0
118 #ifndef __OGRE_HAVE_NEON
119 # define __OGRE_HAVE_NEON 0
150 #if OGRE_CPU == OGRE_CPU_X86
151 CPU_FEATURE_SSE = 1 << 0,
152 CPU_FEATURE_SSE2 = 1 << 1,
153 CPU_FEATURE_SSE3 = 1 << 2,
154 CPU_FEATURE_MMX = 1 << 3,
155 CPU_FEATURE_MMXEXT = 1 << 4,
156 CPU_FEATURE_3DNOW = 1 << 5,
157 CPU_FEATURE_3DNOWEXT = 1 << 6,
158 CPU_FEATURE_CMOV = 1 << 7,
159 CPU_FEATURE_TSC = 1 << 8,
160 CPU_FEATURE_FPU = 1 << 9,
161 CPU_FEATURE_PRO = 1 << 10,
162 CPU_FEATURE_HTT = 1 << 11,
163 #elif OGRE_CPU == OGRE_CPU_ARM
164 CPU_FEATURE_VFP = 1 << 12,
165 CPU_FEATURE_NEON = 1 << 13,
176 static const String& getCpuIdentifier(
void);
183 static uint getCpuFeatures(
void);
190 static bool hasCpuFeature(CpuFeatures feature);
194 static void log(
Log* pLog);
202 #endif // __PlatformInformation_H__