Skia
2DGraphicsLibrary
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
SkPreConfig.h
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 
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 
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 
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 
90 
91 #if defined(__i386) || defined(_M_IX86) || defined(__x86_64__) || defined(_M_X64)
92  #define SK_CPU_X86 1
93 #endif
94 
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 
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 
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 
219 
228 #if defined(__GNUC__)
229 # define SK_PURE_FUNC __attribute__((pure))
230 #else
231 # define SK_PURE_FUNC /* nothing */
232 #endif
233 
235 
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 
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