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