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