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