blob: 0715fc9ac6749d3c0c9094608d974ca3fafeb8ca [file] [log] [blame]
reed@android.com8a1c16f2008-12-17 15:59:43 +00001/*
epoger@google.comec3ed6a2011-07-28 14:26:00 +00002 * Copyright 2006 The Android Open Source Project
reed@android.com8a1c16f2008-12-17 15:59:43 +00003 *
epoger@google.comec3ed6a2011-07-28 14:26:00 +00004 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
reed@android.com8a1c16f2008-12-17 15:59:43 +00006 */
7
bungemand3ebb482015-08-05 13:57:49 -07008// IWYU pragma: private, include "SkTypes.h"
9
reed@android.com8a1c16f2008-12-17 15:59:43 +000010#ifndef SkPreConfig_DEFINED
11#define SkPreConfig_DEFINED
12
reed@google.com44699382013-10-31 17:28:30 +000013// Allows embedders that want to disable macros that take arguments to just
14// define that symbol to be one of these
reed@google.com44699382013-10-31 17:28:30 +000015#define SK_NOTHING_ARG1(arg1)
16#define SK_NOTHING_ARG2(arg1, arg2)
17#define SK_NOTHING_ARG3(arg1, arg2, arg3)
18
reed@android.com8a1c16f2008-12-17 15:59:43 +000019//////////////////////////////////////////////////////////////////////
20
bungeman3ac6b752015-07-29 13:37:27 -070021#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)
reed@android.comf2b98d62010-12-20 18:26:13 +000022
23 #ifdef __APPLE__
24 #include "TargetConditionals.h"
25 #endif
reed@android.com8a1c16f2008-12-17 15:59:43 +000026
bungeman3ac6b752015-07-29 13:37:27 -070027 #if defined(WIN32) || defined(__SYMBIAN32__)
reed@android.com8a1c16f2008-12-17 15:59:43 +000028 #define SK_BUILD_FOR_WIN32
djsollen@google.com60abb072012-02-15 18:49:15 +000029 #elif defined(ANDROID)
30 #define SK_BUILD_FOR_ANDROID
reed@google.comea6805d2011-11-30 20:44:25 +000031 #elif defined(linux) || defined(__FreeBSD__) || defined(__OpenBSD__) || \
george@mozilla.com79c865a2012-07-25 18:52:56 +000032 defined(__sun) || defined(__NetBSD__) || defined(__DragonFly__) || \
33 defined(__GLIBC__) || defined(__GNU__)
reed@android.com8a1c16f2008-12-17 15:59:43 +000034 #define SK_BUILD_FOR_UNIX
reed@android.comf2b98d62010-12-20 18:26:13 +000035 #elif TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR
36 #define SK_BUILD_FOR_IOS
reed@android.com8a1c16f2008-12-17 15:59:43 +000037 #else
38 #define SK_BUILD_FOR_MAC
39 #endif
40
41#endif
42
commit-bot@chromium.org059a4c72013-03-13 12:48:26 +000043/* 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.
djsollen@google.com58629292011-11-03 13:08:29 +000047 */
bsalomon@google.com530efc82013-03-13 13:38:30 +000048#if defined(SK_BUILD_FOR_ANDROID_FRAMEWORK) && !defined(SK_BUILD_FOR_ANDROID)
djsollen@google.com58629292011-11-03 13:08:29 +000049 #define SK_BUILD_FOR_ANDROID
50#endif
51
reed@android.com8a1c16f2008-12-17 15:59:43 +000052//////////////////////////////////////////////////////////////////////
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
reed@android.com63debae2009-12-16 17:25:43 +000062#ifdef SK_BUILD_FOR_WIN32
tomhudson@google.com333d6cb2011-07-12 19:19:03 +000063 #if !defined(SK_RESTRICT)
64 #define SK_RESTRICT __restrict
65 #endif
bungeman@google.com363a4c22012-04-09 22:33:11 +000066 #if !defined(SK_WARN_UNUSED_RESULT)
67 #define SK_WARN_UNUSED_RESULT
68 #endif
reed@android.com63debae2009-12-16 17:25:43 +000069#endif
70
reed@android.com8a1c16f2008-12-17 15:59:43 +000071//////////////////////////////////////////////////////////////////////
72
reed@android.com5c80ea12009-01-08 17:49:50 +000073#if !defined(SK_RESTRICT)
74 #define SK_RESTRICT __restrict__
75#endif
reed@android.com8a1c16f2008-12-17 15:59:43 +000076
bungeman@google.com363a4c22012-04-09 22:33:11 +000077#if !defined(SK_WARN_UNUSED_RESULT)
78 #define SK_WARN_UNUSED_RESULT __attribute__((warn_unused_result))
79#endif
80
reed@android.com8a1c16f2008-12-17 15:59:43 +000081//////////////////////////////////////////////////////////////////////
82
reed@android.com8a1c16f2008-12-17 15:59:43 +000083#if !defined(SK_CPU_BENDIAN) && !defined(SK_CPU_LENDIAN)
commit-bot@chromium.org8ec45ce2014-04-03 16:38:01 +000084 #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
reed@android.com8a1c16f2008-12-17 15:59:43 +000093 #else
94 #define SK_CPU_LENDIAN
95 #endif
96#endif
97
98//////////////////////////////////////////////////////////////////////
99
commit-bot@chromium.org4460e752014-04-09 16:50:55 +0000100#if defined(__i386) || defined(_M_IX86) || defined(__x86_64__) || defined(_M_X64)
101 #define SK_CPU_X86 1
102#endif
103
reed@google.com4a2cb302012-07-02 14:36:37 +0000104/**
reed@google.com126b4362012-07-02 19:00:27 +0000105 * SK_CPU_SSE_LEVEL
106 *
reed@google.comab697882012-07-02 17:27:51 +0000107 * If defined, SK_CPU_SSE_LEVEL should be set to the highest supported level.
108 * On non-intel CPU this should be undefined.
reed@google.com4a2cb302012-07-02 14:36:37 +0000109 */
reed@google.com126b4362012-07-02 19:00:27 +0000110
reed@google.com00aad942012-07-09 13:02:35 +0000111#define SK_CPU_SSE_LEVEL_SSE1 10
reed@google.com8dbd5722012-07-03 12:08:39 +0000112#define SK_CPU_SSE_LEVEL_SSE2 20
113#define SK_CPU_SSE_LEVEL_SSE3 30
114#define SK_CPU_SSE_LEVEL_SSSE3 31
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000115#define SK_CPU_SSE_LEVEL_SSE41 41
116#define SK_CPU_SSE_LEVEL_SSE42 42
reed@google.comab697882012-07-02 17:27:51 +0000117
reed@google.com126b4362012-07-02 19:00:27 +0000118// Are we in GCC?
reed@google.com4a2cb302012-07-02 14:36:37 +0000119#ifndef SK_CPU_SSE_LEVEL
commit-bot@chromium.org88a95432014-02-25 18:14:08 +0000120 // These checks must be done in descending order to ensure we set the highest
121 // available SSE level.
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000122 #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__)
commit-bot@chromium.org88a95432014-02-25 18:14:08 +0000127 #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_SSSE3
reed@google.comab697882012-07-02 17:27:51 +0000128 #elif defined(__SSE3__)
reed@google.com8dbd5722012-07-03 12:08:39 +0000129 #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_SSE3
commit-bot@chromium.org88a95432014-02-25 18:14:08 +0000130 #elif defined(__SSE2__)
131 #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_SSE2
reed@google.com4a2cb302012-07-02 14:36:37 +0000132 #endif
133#endif
134
reed@google.com126b4362012-07-02 19:00:27 +0000135// Are we in VisualStudio?
136#ifndef SK_CPU_SSE_LEVEL
commit-bot@chromium.org88a95432014-02-25 18:14:08 +0000137 // These checks must be done in descending order to ensure we set the highest
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000138 // 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)
commit-bot@chromium.org88a95432014-02-25 18:14:08 +0000142 #if _M_IX86_FP >= 2
commit-bot@chromium.org4736ed12014-02-06 16:26:08 +0000143 #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_SSE2
commit-bot@chromium.org88a95432014-02-25 18:14:08 +0000144 #elif _M_IX86_FP == 1
145 #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_SSE1
commit-bot@chromium.org4736ed12014-02-06 16:26:08 +0000146 #endif
reed@google.com00aad942012-07-09 13:02:35 +0000147 #endif
148#endif
149
reed@google.com4a2cb302012-07-02 14:36:37 +0000150//////////////////////////////////////////////////////////////////////
caryclark@google.com867cbd82012-09-20 15:45:41 +0000151// ARM defines
152
commit-bot@chromium.orgd01ec712014-04-03 23:39:46 +0000153#if defined(__arm__) && (!defined(__APPLE__) || !TARGET_IPHONE_SIMULATOR)
mtklein3a2682a2014-06-03 12:07:31 -0700154 #define SK_CPU_ARM32
caryclark@google.com867cbd82012-09-20 15:45:41 +0000155
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
commit-bot@chromium.orgd01ec712014-04-03 23:39:46 +0000184// Disable ARM64 optimizations for iOS due to complications regarding gyp and iOS.
185#if defined(__aarch64__) && !defined(SK_BUILD_FOR_IOS)
commit-bot@chromium.org6f2d4d42014-04-02 15:03:56 +0000186 #define SK_CPU_ARM64
187#endif
188
mtkleinb79ff562015-03-20 09:25:26 -0700189// All 64-bit ARM chips have NEON. Many 32-bit ARM chips do too.
mtkleinf3f94402015-04-17 14:02:40 -0700190// TODO: Why don't we want NEON on iOS?
191#if !defined(SK_ARM_HAS_NEON) && !defined(SK_BUILD_FOR_IOS) && \
192 (defined(SK_CPU_ARM64) || defined(__ARM_NEON__))
mtkleinb79ff562015-03-20 09:25:26 -0700193 #define SK_ARM_HAS_NEON
194#endif
195
caryclark@google.com867cbd82012-09-20 15:45:41 +0000196//////////////////////////////////////////////////////////////////////
reed@google.com4a2cb302012-07-02 14:36:37 +0000197
ctguil@chromium.org7ffb1b22011-03-15 21:27:08 +0000198#if !defined(SKIA_IMPLEMENTATION)
199 #define SKIA_IMPLEMENTATION 0
200#endif
reed@google.comc0091112011-04-26 20:04:16 +0000201
202#if defined(SKIA_DLL)
203 #if defined(WIN32)
robertphillips@google.com866ff872012-11-20 01:40:45 +0000204 #if SKIA_IMPLEMENTATION
reed@google.comc0091112011-04-26 20:04:16 +0000205 #define SK_API __declspec(dllexport)
206 #else
207 #define SK_API __declspec(dllimport)
208 #endif
ctguil@chromium.org7ffb1b22011-03-15 21:27:08 +0000209 #else
robertphillips@google.com866ff872012-11-20 01:40:45 +0000210 #define SK_API __attribute__((visibility("default")))
ctguil@chromium.org7ffb1b22011-03-15 21:27:08 +0000211 #endif
212#else
213 #define SK_API
214#endif
215
digit@google.com157d9442012-08-06 14:53:32 +0000216//////////////////////////////////////////////////////////////////////
217
218/**
219 * Use SK_PURE_FUNC as an attribute to indicate that a function's
220 * return value only depends on the value of its parameters. This
221 * can help the compiler optimize out successive calls.
222 *
223 * Usage:
224 * void function(int params) SK_PURE_FUNC;
225 */
226#if defined(__GNUC__)
227# define SK_PURE_FUNC __attribute__((pure))
228#else
229# define SK_PURE_FUNC /* nothing */
230#endif
231
digit@google.com536079b2012-08-28 15:22:37 +0000232//////////////////////////////////////////////////////////////////////
233
234/**
235 * SK_HAS_ATTRIBUTE(<name>) should return true iff the compiler
236 * supports __attribute__((<name>)). Mostly important because
237 * Clang doesn't support all of GCC attributes.
238 */
239#if defined(__has_attribute)
240# define SK_HAS_ATTRIBUTE(x) __has_attribute(x)
241#elif defined(__GNUC__)
242# define SK_HAS_ATTRIBUTE(x) 1
243#else
244# define SK_HAS_ATTRIBUTE(x) 0
reed@android.com8a1c16f2008-12-17 15:59:43 +0000245#endif
246
digit@google.com536079b2012-08-28 15:22:37 +0000247/**
248 * SK_ATTRIBUTE_OPTIMIZE_O1 can be used as a function attribute
249 * to specify individual optimization level of -O1, if the compiler
250 * supports it.
251 *
252 * NOTE: Clang/ARM (r161757) does not support the 'optimize' attribute.
253 */
254#if SK_HAS_ATTRIBUTE(optimize)
255# define SK_ATTRIBUTE_OPTIMIZE_O1 __attribute__((optimize("O1")))
256#else
257# define SK_ATTRIBUTE_OPTIMIZE_O1 /* nothing */
258#endif
259
260#endif