SkPreConfig.h revision 765d6ad975b56253c4b6aadd8721bff1fac2d827
1/* 2 * Copyright 2006 The Android Open Source Project 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8// IWYU pragma: private, include "SkTypes.h" 9 10#ifndef SkPreConfig_DEFINED 11#define SkPreConfig_DEFINED 12 13// Allows embedders that want to disable macros that take arguments to just 14// define that symbol to be one of these 15#define SK_NOTHING_ARG1(arg1) 16#define SK_NOTHING_ARG2(arg1, arg2) 17#define SK_NOTHING_ARG3(arg1, arg2, arg3) 18 19////////////////////////////////////////////////////////////////////// 20 21#if !defined(SK_BUILD_FOR_ANDROID) && !defined(SK_BUILD_FOR_IOS) && !defined(SK_BUILD_FOR_WIN32) && !defined(SK_BUILD_FOR_UNIX) && !defined(SK_BUILD_FOR_MAC) 22 23 #ifdef __APPLE__ 24 #include "TargetConditionals.h" 25 #endif 26 27 #if defined(WIN32) || defined(__SYMBIAN32__) 28 #define SK_BUILD_FOR_WIN32 29 #elif defined(ANDROID) 30 #define SK_BUILD_FOR_ANDROID 31 #elif defined(linux) || defined(__FreeBSD__) || defined(__OpenBSD__) || \ 32 defined(__sun) || defined(__NetBSD__) || defined(__DragonFly__) || \ 33 defined(__GLIBC__) || defined(__GNU__) 34 #define SK_BUILD_FOR_UNIX 35 #elif TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR 36 #define SK_BUILD_FOR_IOS 37 #else 38 #define SK_BUILD_FOR_MAC 39 #endif 40 41#endif 42 43/* Even if the user only defined the framework variant we still need to build 44 * the default (NDK-compliant) Android code. Therefore, when attempting to 45 * include/exclude something from the framework variant check first that we are 46 * building for Android then check the status of the framework define. 47 */ 48#if defined(SK_BUILD_FOR_ANDROID_FRAMEWORK) && !defined(SK_BUILD_FOR_ANDROID) 49 #define SK_BUILD_FOR_ANDROID 50#endif 51 52////////////////////////////////////////////////////////////////////// 53 54#if !defined(SK_DEBUG) && !defined(SK_RELEASE) 55 #ifdef NDEBUG 56 #define SK_RELEASE 57 #else 58 #define SK_DEBUG 59 #endif 60#endif 61 62#ifdef SK_BUILD_FOR_WIN32 63 #if !defined(SK_RESTRICT) 64 #define SK_RESTRICT __restrict 65 #endif 66 #if !defined(SK_WARN_UNUSED_RESULT) 67 #define SK_WARN_UNUSED_RESULT 68 #endif 69#endif 70 71////////////////////////////////////////////////////////////////////// 72 73#if !defined(SK_RESTRICT) 74 #define SK_RESTRICT __restrict__ 75#endif 76 77#if !defined(SK_WARN_UNUSED_RESULT) 78 #define SK_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) 79#endif 80 81////////////////////////////////////////////////////////////////////// 82 83#if !defined(SK_CPU_BENDIAN) && !defined(SK_CPU_LENDIAN) 84 #if defined(__sparc) || defined(__sparc__) || \ 85 defined(_POWER) || defined(__powerpc__) || \ 86 defined(__ppc__) || defined(__hppa) || \ 87 defined(__PPC__) || defined(__PPC64__) || \ 88 defined(_MIPSEB) || defined(__ARMEB__) || \ 89 defined(__s390__) || \ 90 (defined(__sh__) && defined(__BIG_ENDIAN__)) || \ 91 (defined(__ia64) && defined(__BIG_ENDIAN__)) 92 #define SK_CPU_BENDIAN 93 #else 94 #define SK_CPU_LENDIAN 95 #endif 96#endif 97 98////////////////////////////////////////////////////////////////////// 99 100#if defined(__i386) || defined(_M_IX86) || defined(__x86_64__) || defined(_M_X64) 101 #define SK_CPU_X86 1 102#endif 103 104/** 105 * SK_CPU_SSE_LEVEL 106 * 107 * If defined, SK_CPU_SSE_LEVEL should be set to the highest supported level. 108 * On non-intel CPU this should be undefined. 109 */ 110 111#define SK_CPU_SSE_LEVEL_SSE1 10 112#define SK_CPU_SSE_LEVEL_SSE2 20 113#define SK_CPU_SSE_LEVEL_SSE3 30 114#define SK_CPU_SSE_LEVEL_SSSE3 31 115#define SK_CPU_SSE_LEVEL_SSE41 41 116#define SK_CPU_SSE_LEVEL_SSE42 42 117 118// Are we in GCC? 119#ifndef SK_CPU_SSE_LEVEL 120 // These checks must be done in descending order to ensure we set the highest 121 // available SSE level. 122 #if defined(__SSE4_2__) 123 #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_SSE42 124 #elif defined(__SSE4_1__) 125 #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_SSE41 126 #elif defined(__SSSE3__) 127 #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_SSSE3 128 #elif defined(__SSE3__) 129 #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_SSE3 130 #elif defined(__SSE2__) 131 #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_SSE2 132 #endif 133#endif 134 135// Are we in VisualStudio? 136#ifndef SK_CPU_SSE_LEVEL 137 // These checks must be done in descending order to ensure we set the highest 138 // available SSE level. 64-bit intel guarantees at least SSE2 support. 139 #if defined(_M_X64) || defined(_M_AMD64) 140 #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_SSE2 141 #elif defined (_M_IX86_FP) 142 #if _M_IX86_FP >= 2 143 #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_SSE2 144 #elif _M_IX86_FP == 1 145 #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_SSE1 146 #endif 147 #endif 148#endif 149 150////////////////////////////////////////////////////////////////////// 151// ARM defines 152 153#if defined(__arm__) && (!defined(__APPLE__) || !TARGET_IPHONE_SIMULATOR) 154 #define SK_CPU_ARM32 155 156 #if defined(__GNUC__) 157 #if defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) \ 158 || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) \ 159 || defined(__ARM_ARCH_7EM__) || defined(_ARM_ARCH_7) 160 #define SK_ARM_ARCH 7 161 #elif defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) \ 162 || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) \ 163 || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__) \ 164 || defined(__ARM_ARCH_6M__) || defined(_ARM_ARCH_6) 165 #define SK_ARM_ARCH 6 166 #elif defined(__ARM_ARCH_5__) || defined(__ARM_ARCH_5T__) \ 167 || defined(__ARM_ARCH_5E__) || defined(__ARM_ARCH_5TE__) \ 168 || defined(__ARM_ARCH_5TEJ__) || defined(_ARM_ARCH_5) 169 #define SK_ARM_ARCH 5 170 #elif defined(__ARM_ARCH_4__) || defined(__ARM_ARCH_4T__) || defined(_ARM_ARCH_4) 171 #define SK_ARM_ARCH 4 172 #else 173 #define SK_ARM_ARCH 3 174 #endif 175 176 #if defined(__thumb2__) && (SK_ARM_ARCH >= 6) \ 177 || !defined(__thumb__) && ((SK_ARM_ARCH > 5) || defined(__ARM_ARCH_5E__) \ 178 || defined(__ARM_ARCH_5TE__) || defined(__ARM_ARCH_5TEJ__)) 179 #define SK_ARM_HAS_EDSP 180 #endif 181 #endif 182#endif 183 184// Disable ARM64 optimizations for iOS due to complications regarding gyp and iOS. 185#if defined(__aarch64__) && !defined(SK_BUILD_FOR_IOS) 186 #define SK_CPU_ARM64 187#endif 188 189// All 64-bit ARM chips have NEON. Many 32-bit ARM chips do too. 190// TODO: Why don't we want NEON on iOS? 191#if !defined(SK_ARM_HAS_NEON) && !defined(SK_BUILD_FOR_IOS) && defined(__ARM_NEON) 192 #define SK_ARM_HAS_NEON 193#endif 194 195////////////////////////////////////////////////////////////////////// 196 197#if !defined(SKIA_IMPLEMENTATION) 198 #define SKIA_IMPLEMENTATION 0 199#endif 200 201#if defined(SKIA_DLL) 202 #if defined(WIN32) 203 #if SKIA_IMPLEMENTATION 204 #define SK_API __declspec(dllexport) 205 #else 206 #define SK_API __declspec(dllimport) 207 #endif 208 #else 209 #define SK_API __attribute__((visibility("default"))) 210 #endif 211#else 212 #define SK_API 213#endif 214 215////////////////////////////////////////////////////////////////////// 216 217/** 218 * Use SK_PURE_FUNC as an attribute to indicate that a function's 219 * return value only depends on the value of its parameters. This 220 * can help the compiler optimize out successive calls. 221 * 222 * Usage: 223 * void function(int params) SK_PURE_FUNC; 224 */ 225#if defined(__GNUC__) 226# define SK_PURE_FUNC __attribute__((pure)) 227#else 228# define SK_PURE_FUNC /* nothing */ 229#endif 230 231////////////////////////////////////////////////////////////////////// 232 233/** 234 * SK_HAS_ATTRIBUTE(<name>) should return true iff the compiler 235 * supports __attribute__((<name>)). Mostly important because 236 * Clang doesn't support all of GCC attributes. 237 */ 238#if defined(__has_attribute) 239# define SK_HAS_ATTRIBUTE(x) __has_attribute(x) 240#elif defined(__GNUC__) 241# define SK_HAS_ATTRIBUTE(x) 1 242#else 243# define SK_HAS_ATTRIBUTE(x) 0 244#endif 245 246/** 247 * SK_ATTRIBUTE_OPTIMIZE_O1 can be used as a function attribute 248 * to specify individual optimization level of -O1, if the compiler 249 * supports it. 250 * 251 * NOTE: Clang/ARM (r161757) does not support the 'optimize' attribute. 252 */ 253#if SK_HAS_ATTRIBUTE(optimize) 254# define SK_ATTRIBUTE_OPTIMIZE_O1 __attribute__((optimize("O1"))) 255#else 256# define SK_ATTRIBUTE_OPTIMIZE_O1 /* nothing */ 257#endif 258 259#endif 260