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