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