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