18a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/* 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2006 The Android Open Source Project 38a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 68a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */ 78a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 8d3ebb48320cf1b7e969974673e4bd7743816985ebungeman// IWYU pragma: private, include "SkTypes.h" 9d3ebb48320cf1b7e969974673e4bd7743816985ebungeman 108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef SkPreConfig_DEFINED 118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SkPreConfig_DEFINED 128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 134469938e92d779dff05e745559e67907bbf21e78reed@google.com// Allows embedders that want to disable macros that take arguments to just 144469938e92d779dff05e745559e67907bbf21e78reed@google.com// define that symbol to be one of these 154469938e92d779dff05e745559e67907bbf21e78reed@google.com#define SK_NOTHING_ARG1(arg1) 164469938e92d779dff05e745559e67907bbf21e78reed@google.com#define SK_NOTHING_ARG2(arg1, arg2) 174469938e92d779dff05e745559e67907bbf21e78reed@google.com#define SK_NOTHING_ARG3(arg1, arg2, arg3) 184469938e92d779dff05e745559e67907bbf21e78reed@google.com 198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com////////////////////////////////////////////////////////////////////// 208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 213ac6b7551dc7aa182018f96b32f6e516305333eebungeman#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) 22f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com 23f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com #ifdef __APPLE__ 24f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com #include "TargetConditionals.h" 25f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com #endif 268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2762e1a1a4ba9926c9b515eb603173ea4202ac28aemtklein #if defined(_WIN32) || defined(__SYMBIAN32__) 288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #define SK_BUILD_FOR_WIN32 29f419781d378fd78a332fdf9dd5dda0ff65d3c07dmtklein #elif defined(ANDROID) || defined(__ANDROID__) 3060abb078e5597c9c6ceaba1ef495c4916ff4df0ddjsollen@google.com #define SK_BUILD_FOR_ANDROID 310cbe7ee765cf72f15e6ca10b308676aa077fb3e2halcanary #elif defined(linux) || defined(__linux) || defined(__FreeBSD__) || \ 320cbe7ee765cf72f15e6ca10b308676aa077fb3e2halcanary defined(__OpenBSD__) || defined(__sun) || defined(__NetBSD__) || \ 336fc8ff024bd823f350400a86e7b9daa1c25f618eabarth defined(__DragonFly__) || defined(__Fuchsia__) || \ 346fc8ff024bd823f350400a86e7b9daa1c25f618eabarth defined(__GLIBC__) || defined(__GNU__) || defined(__unix__) 358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #define SK_BUILD_FOR_UNIX 36f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com #elif TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR 37f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com #define SK_BUILD_FOR_IOS 388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #else 398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #define SK_BUILD_FOR_MAC 408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #endif 418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 44059a4c70d7eb6556c123e529259aaffe7214164dcommit-bot@chromium.org/* Even if the user only defined the framework variant we still need to build 45059a4c70d7eb6556c123e529259aaffe7214164dcommit-bot@chromium.org * the default (NDK-compliant) Android code. Therefore, when attempting to 46059a4c70d7eb6556c123e529259aaffe7214164dcommit-bot@chromium.org * include/exclude something from the framework variant check first that we are 47059a4c70d7eb6556c123e529259aaffe7214164dcommit-bot@chromium.org * building for Android then check the status of the framework define. 4858629291bc145edca8fb303e465c8537bed65314djsollen@google.com */ 49530efc808544e9ff79814f61678bd919b168cb21bsalomon@google.com#if defined(SK_BUILD_FOR_ANDROID_FRAMEWORK) && !defined(SK_BUILD_FOR_ANDROID) 5058629291bc145edca8fb303e465c8537bed65314djsollen@google.com #define SK_BUILD_FOR_ANDROID 5158629291bc145edca8fb303e465c8537bed65314djsollen@google.com#endif 5258629291bc145edca8fb303e465c8537bed65314djsollen@google.com 538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com////////////////////////////////////////////////////////////////////// 548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 5563debae4c1020fa1e0ccd92ef3cbfdc8735acf8ereed@android.com#ifdef SK_BUILD_FOR_WIN32 56333d6cb2448d0febcbeb7c8c7310c0ff2d1a6104tomhudson@google.com #if !defined(SK_RESTRICT) 57333d6cb2448d0febcbeb7c8c7310c0ff2d1a6104tomhudson@google.com #define SK_RESTRICT __restrict 58333d6cb2448d0febcbeb7c8c7310c0ff2d1a6104tomhudson@google.com #endif 59363a4c22af71b8afedc00050ee5cc97fe4bd6f76bungeman@google.com #if !defined(SK_WARN_UNUSED_RESULT) 60363a4c22af71b8afedc00050ee5cc97fe4bd6f76bungeman@google.com #define SK_WARN_UNUSED_RESULT 61363a4c22af71b8afedc00050ee5cc97fe4bd6f76bungeman@google.com #endif 6263debae4c1020fa1e0ccd92ef3cbfdc8735acf8ereed@android.com#endif 6363debae4c1020fa1e0ccd92ef3cbfdc8735acf8ereed@android.com 645c80ea17d4e4a795bfaeb260fc27e952ba471f1dreed@android.com#if !defined(SK_RESTRICT) 655c80ea17d4e4a795bfaeb260fc27e952ba471f1dreed@android.com #define SK_RESTRICT __restrict__ 665c80ea17d4e4a795bfaeb260fc27e952ba471f1dreed@android.com#endif 678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 68363a4c22af71b8afedc00050ee5cc97fe4bd6f76bungeman@google.com#if !defined(SK_WARN_UNUSED_RESULT) 69363a4c22af71b8afedc00050ee5cc97fe4bd6f76bungeman@google.com #define SK_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) 70363a4c22af71b8afedc00050ee5cc97fe4bd6f76bungeman@google.com#endif 71363a4c22af71b8afedc00050ee5cc97fe4bd6f76bungeman@google.com 728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com////////////////////////////////////////////////////////////////////// 738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if !defined(SK_CPU_BENDIAN) && !defined(SK_CPU_LENDIAN) 753c1072d02776352e5c7c810bdb49eb3da3c639c0Lee Salzman #if defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) 763c1072d02776352e5c7c810bdb49eb3da3c639c0Lee Salzman #define SK_CPU_BENDIAN 773c1072d02776352e5c7c810bdb49eb3da3c639c0Lee Salzman #elif defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) 783c1072d02776352e5c7c810bdb49eb3da3c639c0Lee Salzman #define SK_CPU_LENDIAN 793c1072d02776352e5c7c810bdb49eb3da3c639c0Lee Salzman #elif defined(__sparc) || defined(__sparc__) || \ 808ec45cede94aded3599621cad6b3e724d667d6f0commit-bot@chromium.org defined(_POWER) || defined(__powerpc__) || \ 818ec45cede94aded3599621cad6b3e724d667d6f0commit-bot@chromium.org defined(__ppc__) || defined(__hppa) || \ 828ec45cede94aded3599621cad6b3e724d667d6f0commit-bot@chromium.org defined(__PPC__) || defined(__PPC64__) || \ 838ec45cede94aded3599621cad6b3e724d667d6f0commit-bot@chromium.org defined(_MIPSEB) || defined(__ARMEB__) || \ 848ec45cede94aded3599621cad6b3e724d667d6f0commit-bot@chromium.org defined(__s390__) || \ 858ec45cede94aded3599621cad6b3e724d667d6f0commit-bot@chromium.org (defined(__sh__) && defined(__BIG_ENDIAN__)) || \ 868ec45cede94aded3599621cad6b3e724d667d6f0commit-bot@chromium.org (defined(__ia64) && defined(__BIG_ENDIAN__)) 878ec45cede94aded3599621cad6b3e724d667d6f0commit-bot@chromium.org #define SK_CPU_BENDIAN 888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #else 898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #define SK_CPU_LENDIAN 908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #endif 918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com////////////////////////////////////////////////////////////////////// 948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 954460e75bc7e8c13e0e44ee9330ae8f556d8b0094commit-bot@chromium.org#if defined(__i386) || defined(_M_IX86) || defined(__x86_64__) || defined(_M_X64) 964460e75bc7e8c13e0e44ee9330ae8f556d8b0094commit-bot@chromium.org #define SK_CPU_X86 1 974460e75bc7e8c13e0e44ee9330ae8f556d8b0094commit-bot@chromium.org#endif 984460e75bc7e8c13e0e44ee9330ae8f556d8b0094commit-bot@chromium.org 994a2cb30accbd5f9b0b60904a55e0bfecf706255areed@google.com/** 100126b4362be3bb43ef8f7a10df710b40e8bba869dreed@google.com * SK_CPU_SSE_LEVEL 101126b4362be3bb43ef8f7a10df710b40e8bba869dreed@google.com * 102ab69788571ed968dc0bcc934b9979195c6a28310reed@google.com * If defined, SK_CPU_SSE_LEVEL should be set to the highest supported level. 103ab69788571ed968dc0bcc934b9979195c6a28310reed@google.com * On non-intel CPU this should be undefined. 1044a2cb30accbd5f9b0b60904a55e0bfecf706255areed@google.com */ 105126b4362be3bb43ef8f7a10df710b40e8bba869dreed@google.com 10600aad94f01a9078d26363db3116f8005d84440f2reed@google.com#define SK_CPU_SSE_LEVEL_SSE1 10 1078dbd5725c0a6681425c7a019c58c4cacdad2a238reed@google.com#define SK_CPU_SSE_LEVEL_SSE2 20 1088dbd5725c0a6681425c7a019c58c4cacdad2a238reed@google.com#define SK_CPU_SSE_LEVEL_SSE3 30 1098dbd5725c0a6681425c7a019c58c4cacdad2a238reed@google.com#define SK_CPU_SSE_LEVEL_SSSE3 31 110ce4402c2fbae8a2bc73b79dc28e0fb9ea9d82c88commit-bot@chromium.org#define SK_CPU_SSE_LEVEL_SSE41 41 111ce4402c2fbae8a2bc73b79dc28e0fb9ea9d82c88commit-bot@chromium.org#define SK_CPU_SSE_LEVEL_SSE42 42 1125141d90796034a932a48738cf76091957314c9a1mtklein#define SK_CPU_SSE_LEVEL_AVX 51 1135141d90796034a932a48738cf76091957314c9a1mtklein#define SK_CPU_SSE_LEVEL_AVX2 52 114ab69788571ed968dc0bcc934b9979195c6a28310reed@google.com 115e3fa811657ecf4ab694d026752a81080c6b10611sdefresne// When targetting iOS and using gyp to generate the build files, it is not 116e3fa811657ecf4ab694d026752a81080c6b10611sdefresne// possible to select files to build depending on the architecture (i.e. it 117e3fa811657ecf4ab694d026752a81080c6b10611sdefresne// is not possible to use hand optimized assembly implementation). In that 118e3fa811657ecf4ab694d026752a81080c6b10611sdefresne// configuration SK_BUILD_NO_OPTS is defined. Remove optimisation then. 119e3fa811657ecf4ab694d026752a81080c6b10611sdefresne#ifdef SK_BUILD_NO_OPTS 120e3fa811657ecf4ab694d026752a81080c6b10611sdefresne #define SK_CPU_SSE_LEVEL 0 121c60bfbb1b58ceea872f12bc8b62f2654bb47fbaamtklein#endif 122c60bfbb1b58ceea872f12bc8b62f2654bb47fbaamtklein 123126b4362be3bb43ef8f7a10df710b40e8bba869dreed@google.com// Are we in GCC? 1244a2cb30accbd5f9b0b60904a55e0bfecf706255areed@google.com#ifndef SK_CPU_SSE_LEVEL 12588a954335acc3e4737e7e08c86233a6b246299f3commit-bot@chromium.org // These checks must be done in descending order to ensure we set the highest 12688a954335acc3e4737e7e08c86233a6b246299f3commit-bot@chromium.org // available SSE level. 1275141d90796034a932a48738cf76091957314c9a1mtklein #if defined(__AVX2__) 1285141d90796034a932a48738cf76091957314c9a1mtklein #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_AVX2 1295141d90796034a932a48738cf76091957314c9a1mtklein #elif defined(__AVX__) 1305141d90796034a932a48738cf76091957314c9a1mtklein #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_AVX 1315141d90796034a932a48738cf76091957314c9a1mtklein #elif defined(__SSE4_2__) 132ce4402c2fbae8a2bc73b79dc28e0fb9ea9d82c88commit-bot@chromium.org #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_SSE42 133ce4402c2fbae8a2bc73b79dc28e0fb9ea9d82c88commit-bot@chromium.org #elif defined(__SSE4_1__) 134ce4402c2fbae8a2bc73b79dc28e0fb9ea9d82c88commit-bot@chromium.org #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_SSE41 135ce4402c2fbae8a2bc73b79dc28e0fb9ea9d82c88commit-bot@chromium.org #elif defined(__SSSE3__) 13688a954335acc3e4737e7e08c86233a6b246299f3commit-bot@chromium.org #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_SSSE3 137ab69788571ed968dc0bcc934b9979195c6a28310reed@google.com #elif defined(__SSE3__) 1388dbd5725c0a6681425c7a019c58c4cacdad2a238reed@google.com #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_SSE3 13988a954335acc3e4737e7e08c86233a6b246299f3commit-bot@chromium.org #elif defined(__SSE2__) 14088a954335acc3e4737e7e08c86233a6b246299f3commit-bot@chromium.org #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_SSE2 1414a2cb30accbd5f9b0b60904a55e0bfecf706255areed@google.com #endif 1424a2cb30accbd5f9b0b60904a55e0bfecf706255areed@google.com#endif 1434a2cb30accbd5f9b0b60904a55e0bfecf706255areed@google.com 144126b4362be3bb43ef8f7a10df710b40e8bba869dreed@google.com// Are we in VisualStudio? 145126b4362be3bb43ef8f7a10df710b40e8bba869dreed@google.com#ifndef SK_CPU_SSE_LEVEL 14688a954335acc3e4737e7e08c86233a6b246299f3commit-bot@chromium.org // These checks must be done in descending order to ensure we set the highest 147ce4402c2fbae8a2bc73b79dc28e0fb9ea9d82c88commit-bot@chromium.org // available SSE level. 64-bit intel guarantees at least SSE2 support. 1485141d90796034a932a48738cf76091957314c9a1mtklein #if defined(__AVX2__) 1495141d90796034a932a48738cf76091957314c9a1mtklein #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_AVX2 1505141d90796034a932a48738cf76091957314c9a1mtklein #elif defined(__AVX__) 1515141d90796034a932a48738cf76091957314c9a1mtklein #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_AVX 1525141d90796034a932a48738cf76091957314c9a1mtklein #elif defined(_M_X64) || defined(_M_AMD64) 1535141d90796034a932a48738cf76091957314c9a1mtklein #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_SSE2 1545141d90796034a932a48738cf76091957314c9a1mtklein #elif defined(_M_IX86_FP) 15588a954335acc3e4737e7e08c86233a6b246299f3commit-bot@chromium.org #if _M_IX86_FP >= 2 1564736ed1a0a7e252e169685e3c7572f08dfca0a2ccommit-bot@chromium.org #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_SSE2 15788a954335acc3e4737e7e08c86233a6b246299f3commit-bot@chromium.org #elif _M_IX86_FP == 1 15888a954335acc3e4737e7e08c86233a6b246299f3commit-bot@chromium.org #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_SSE1 1594736ed1a0a7e252e169685e3c7572f08dfca0a2ccommit-bot@chromium.org #endif 16000aad94f01a9078d26363db3116f8005d84440f2reed@google.com #endif 16100aad94f01a9078d26363db3116f8005d84440f2reed@google.com#endif 16200aad94f01a9078d26363db3116f8005d84440f2reed@google.com 163867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com////////////////////////////////////////////////////////////////////// 164867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com// ARM defines 165867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com 166d01ec71f9c350ab73e24808a5d4da22a3c8fc515commit-bot@chromium.org#if defined(__arm__) && (!defined(__APPLE__) || !TARGET_IPHONE_SIMULATOR) 1673a2682a77f996f649de7699c9f7bee046c6d4f17mtklein #define SK_CPU_ARM32 168867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com 169867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com #if defined(__GNUC__) 170867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com #if defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) \ 171867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) \ 172867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com || defined(__ARM_ARCH_7EM__) || defined(_ARM_ARCH_7) 173867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com #define SK_ARM_ARCH 7 174867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com #elif defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) \ 175867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) \ 176867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__) \ 177867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com || defined(__ARM_ARCH_6M__) || defined(_ARM_ARCH_6) 178867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com #define SK_ARM_ARCH 6 179867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com #elif defined(__ARM_ARCH_5__) || defined(__ARM_ARCH_5T__) \ 180867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com || defined(__ARM_ARCH_5E__) || defined(__ARM_ARCH_5TE__) \ 181867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com || defined(__ARM_ARCH_5TEJ__) || defined(_ARM_ARCH_5) 182867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com #define SK_ARM_ARCH 5 183867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com #elif defined(__ARM_ARCH_4__) || defined(__ARM_ARCH_4T__) || defined(_ARM_ARCH_4) 184867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com #define SK_ARM_ARCH 4 185867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com #else 186867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com #define SK_ARM_ARCH 3 187867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com #endif 188867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com #endif 189126b4362be3bb43ef8f7a10df710b40e8bba869dreed@google.com#endif 190126b4362be3bb43ef8f7a10df710b40e8bba869dreed@google.com 191e3fa811657ecf4ab694d026752a81080c6b10611sdefresne#if defined(__aarch64__) && !defined(SK_BUILD_NO_OPTS) 1926f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org #define SK_CPU_ARM64 1936f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org#endif 1946f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org 195b79ff56de23fef680ae7187040f2d6a9516b553dmtklein// All 64-bit ARM chips have NEON. Many 32-bit ARM chips do too. 196e3fa811657ecf4ab694d026752a81080c6b10611sdefresne#if !defined(SK_ARM_HAS_NEON) && !defined(SK_BUILD_NO_OPTS) && (defined(__ARM_NEON__) || defined(__ARM_NEON)) 197b79ff56de23fef680ae7187040f2d6a9516b553dmtklein #define SK_ARM_HAS_NEON 198b79ff56de23fef680ae7187040f2d6a9516b553dmtklein#endif 199b79ff56de23fef680ae7187040f2d6a9516b553dmtklein 2009441af52aafd59553ab1a2ea52c390400f93e0bbmtklein// Really this __APPLE__ check shouldn't be necessary, but it seems that Apple's Clang defines 2019441af52aafd59553ab1a2ea52c390400f93e0bbmtklein// __ARM_FEATURE_CRC32 for -arch arm64, even though their chips don't support those instructions! 2029441af52aafd59553ab1a2ea52c390400f93e0bbmtklein#if defined(__ARM_FEATURE_CRC32) && !defined(__APPLE__) 2039441af52aafd59553ab1a2ea52c390400f93e0bbmtklein #define SK_ARM_HAS_CRC32 2049441af52aafd59553ab1a2ea52c390400f93e0bbmtklein#endif 2059441af52aafd59553ab1a2ea52c390400f93e0bbmtklein 2064a2cb30accbd5f9b0b60904a55e0bfecf706255areed@google.com////////////////////////////////////////////////////////////////////// 2074a2cb30accbd5f9b0b60904a55e0bfecf706255areed@google.com 2087ffb1b21abcc7bbed5a0fc711f6dd7b9dbb4f577ctguil@chromium.org#if !defined(SKIA_IMPLEMENTATION) 2097ffb1b21abcc7bbed5a0fc711f6dd7b9dbb4f577ctguil@chromium.org #define SKIA_IMPLEMENTATION 0 2107ffb1b21abcc7bbed5a0fc711f6dd7b9dbb4f577ctguil@chromium.org#endif 211c0091114461339c7e6a78a0f1669cecad1e22146reed@google.com 212fa84d94bb0b226f81b7eaa411aabbbaec3d180cbmtklein#if !defined(SK_API) 213fa84d94bb0b226f81b7eaa411aabbbaec3d180cbmtklein #if defined(SKIA_DLL) 2147a1f45f9e584fef625e764bd5d180a9c4943dcd5mtklein #if defined(_MSC_VER) 215fa84d94bb0b226f81b7eaa411aabbbaec3d180cbmtklein #if SKIA_IMPLEMENTATION 216fa84d94bb0b226f81b7eaa411aabbbaec3d180cbmtklein #define SK_API __declspec(dllexport) 217fa84d94bb0b226f81b7eaa411aabbbaec3d180cbmtklein #else 218fa84d94bb0b226f81b7eaa411aabbbaec3d180cbmtklein #define SK_API __declspec(dllimport) 219fa84d94bb0b226f81b7eaa411aabbbaec3d180cbmtklein #endif 220c0091114461339c7e6a78a0f1669cecad1e22146reed@google.com #else 221fa84d94bb0b226f81b7eaa411aabbbaec3d180cbmtklein #define SK_API __attribute__((visibility("default"))) 222c0091114461339c7e6a78a0f1669cecad1e22146reed@google.com #endif 2237ffb1b21abcc7bbed5a0fc711f6dd7b9dbb4f577ctguil@chromium.org #else 224fa84d94bb0b226f81b7eaa411aabbbaec3d180cbmtklein #define SK_API 2257ffb1b21abcc7bbed5a0fc711f6dd7b9dbb4f577ctguil@chromium.org #endif 2267ffb1b21abcc7bbed5a0fc711f6dd7b9dbb4f577ctguil@chromium.org#endif 2277ffb1b21abcc7bbed5a0fc711f6dd7b9dbb4f577ctguil@chromium.org 228157d94465a47a57e30e5cf49cd57dccd903e27e2digit@google.com////////////////////////////////////////////////////////////////////// 229157d94465a47a57e30e5cf49cd57dccd903e27e2digit@google.com 230157d94465a47a57e30e5cf49cd57dccd903e27e2digit@google.com/** 231157d94465a47a57e30e5cf49cd57dccd903e27e2digit@google.com * Use SK_PURE_FUNC as an attribute to indicate that a function's 232157d94465a47a57e30e5cf49cd57dccd903e27e2digit@google.com * return value only depends on the value of its parameters. This 233157d94465a47a57e30e5cf49cd57dccd903e27e2digit@google.com * can help the compiler optimize out successive calls. 234157d94465a47a57e30e5cf49cd57dccd903e27e2digit@google.com * 235157d94465a47a57e30e5cf49cd57dccd903e27e2digit@google.com * Usage: 236157d94465a47a57e30e5cf49cd57dccd903e27e2digit@google.com * void function(int params) SK_PURE_FUNC; 237157d94465a47a57e30e5cf49cd57dccd903e27e2digit@google.com */ 238157d94465a47a57e30e5cf49cd57dccd903e27e2digit@google.com#if defined(__GNUC__) 239157d94465a47a57e30e5cf49cd57dccd903e27e2digit@google.com# define SK_PURE_FUNC __attribute__((pure)) 240157d94465a47a57e30e5cf49cd57dccd903e27e2digit@google.com#else 241157d94465a47a57e30e5cf49cd57dccd903e27e2digit@google.com# define SK_PURE_FUNC /* nothing */ 242157d94465a47a57e30e5cf49cd57dccd903e27e2digit@google.com#endif 243157d94465a47a57e30e5cf49cd57dccd903e27e2digit@google.com 244536079b2099e986853c82c874059a6bcd7602742digit@google.com////////////////////////////////////////////////////////////////////// 245536079b2099e986853c82c874059a6bcd7602742digit@google.com 246536079b2099e986853c82c874059a6bcd7602742digit@google.com/** 247536079b2099e986853c82c874059a6bcd7602742digit@google.com * SK_HAS_ATTRIBUTE(<name>) should return true iff the compiler 248536079b2099e986853c82c874059a6bcd7602742digit@google.com * supports __attribute__((<name>)). Mostly important because 249536079b2099e986853c82c874059a6bcd7602742digit@google.com * Clang doesn't support all of GCC attributes. 250536079b2099e986853c82c874059a6bcd7602742digit@google.com */ 251536079b2099e986853c82c874059a6bcd7602742digit@google.com#if defined(__has_attribute) 252536079b2099e986853c82c874059a6bcd7602742digit@google.com# define SK_HAS_ATTRIBUTE(x) __has_attribute(x) 253536079b2099e986853c82c874059a6bcd7602742digit@google.com#elif defined(__GNUC__) 254536079b2099e986853c82c874059a6bcd7602742digit@google.com# define SK_HAS_ATTRIBUTE(x) 1 255536079b2099e986853c82c874059a6bcd7602742digit@google.com#else 256536079b2099e986853c82c874059a6bcd7602742digit@google.com# define SK_HAS_ATTRIBUTE(x) 0 257536079b2099e986853c82c874059a6bcd7602742digit@google.com#endif 258536079b2099e986853c82c874059a6bcd7602742digit@google.com 259536079b2099e986853c82c874059a6bcd7602742digit@google.com/** 260536079b2099e986853c82c874059a6bcd7602742digit@google.com * SK_ATTRIBUTE_OPTIMIZE_O1 can be used as a function attribute 261536079b2099e986853c82c874059a6bcd7602742digit@google.com * to specify individual optimization level of -O1, if the compiler 262536079b2099e986853c82c874059a6bcd7602742digit@google.com * supports it. 263536079b2099e986853c82c874059a6bcd7602742digit@google.com * 264536079b2099e986853c82c874059a6bcd7602742digit@google.com * NOTE: Clang/ARM (r161757) does not support the 'optimize' attribute. 265536079b2099e986853c82c874059a6bcd7602742digit@google.com */ 266536079b2099e986853c82c874059a6bcd7602742digit@google.com#if SK_HAS_ATTRIBUTE(optimize) 267536079b2099e986853c82c874059a6bcd7602742digit@google.com# define SK_ATTRIBUTE_OPTIMIZE_O1 __attribute__((optimize("O1"))) 268536079b2099e986853c82c874059a6bcd7602742digit@google.com#else 269536079b2099e986853c82c874059a6bcd7602742digit@google.com# define SK_ATTRIBUTE_OPTIMIZE_O1 /* nothing */ 2708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 2718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 272536079b2099e986853c82c874059a6bcd7602742digit@google.com#endif 273