GrConfig.h revision 85983288ba8f4abc1fba4c54da827d2b089472e0
1
2/*
3 * Copyright 2010 Google Inc.
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
11#ifndef GrConfig_DEFINED
12#define GrConfig_DEFINED
13
14#include "SkTypes.h"
15
16///////////////////////////////////////////////////////////////////////////////
17// preconfig section:
18//
19// All the work before including GrUserConfig.h should center around guessing
20// what platform we're on, and defining low-level symbols based on that.
21//
22// A build environment may have already defined symbols, so we first check
23// for that
24//
25
26// hack to ensure we know what sort of Apple platform we're on
27#if defined(__APPLE_CPP__) || defined(__APPLE_CC__)
28    #include <TargetConditionals.h>
29#endif
30
31/**
32 *  Gr defines are set to 0 or 1, rather than being undefined or defined
33 */
34
35#if !defined(GR_ANDROID_BUILD)
36    #define GR_ANDROID_BUILD    0
37#endif
38#if !defined(GR_IOS_BUILD)
39    #define GR_IOS_BUILD        0
40#endif
41#if !defined(GR_LINUX_BUILD)
42    #define GR_LINUX_BUILD      0
43#endif
44#if !defined(GR_MAC_BUILD)
45    #define GR_MAC_BUILD        0
46#endif
47#if !defined(GR_WIN32_BUILD)
48    #define GR_WIN32_BUILD      0
49#endif
50#if !defined(GR_QNX_BUILD)
51    #define GR_QNX_BUILD        0
52#endif
53#if !defined(GR_CACHE_STATS)
54    #define GR_CACHE_STATS      0
55#endif
56
57/**
58 *  If no build target has been defined, attempt to infer.
59 */
60#if !GR_ANDROID_BUILD && !GR_IOS_BUILD && !GR_LINUX_BUILD && !GR_MAC_BUILD && !GR_WIN32_BUILD && !GR_QNX_BUILD
61    #if defined(_WIN32)
62        #undef GR_WIN32_BUILD
63        #define GR_WIN32_BUILD      1
64//      #error "WIN"
65    #elif TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR
66        #undef GR_IOS_BUILD
67        #define GR_IOS_BUILD        1
68//      #error "IOS"
69    #elif defined(SK_BUILD_FOR_ANDROID)
70        #undef GR_ANDROID_BUILD
71        #define GR_ANDROID_BUILD    1
72//      #error "ANDROID"
73    #elif TARGET_OS_MAC
74        #undef GR_MAC_BUILD
75        #define GR_MAC_BUILD        1
76//      #error "MAC"
77    #elif TARGET_OS_QNX || defined(__QNXNTO__)
78        #undef GR_QNX_BUILD
79        #define GR_QNX_BUILD        1
80//      #error "QNX"
81    #else
82        #undef GR_LINUX_BUILD
83        #define GR_LINUX_BUILD      1
84//      #error "LINUX"
85    #endif
86#endif
87
88// we need both GR_DEBUG and GR_RELEASE to be defined as 0 or 1
89//
90#ifndef GR_DEBUG
91    #ifdef GR_RELEASE
92        #define GR_DEBUG !GR_RELEASE
93    #else
94        #ifdef NDEBUG
95            #define GR_DEBUG    0
96        #else
97            #define GR_DEBUG    1
98        #endif
99    #endif
100#endif
101
102#ifndef GR_RELEASE
103    #define GR_RELEASE  !GR_DEBUG
104#endif
105
106#if GR_DEBUG == GR_RELEASE
107    #error "GR_DEBUG and GR_RELEASE must not be the same"
108#endif
109
110///////////////////////////////////////////////////////////////////////////////
111///////////////////////////////////////////////////////////////////////////////
112
113#if GR_WIN32_BUILD
114// VC8 doesn't support stdint.h, so we define those types here.
115typedef signed char int8_t;
116typedef unsigned char uint8_t;
117typedef short int16_t;
118typedef unsigned short uint16_t;
119typedef int int32_t;
120typedef unsigned uint32_t;
121typedef __int64 int64_t;
122typedef unsigned __int64 uint64_t;
123#else
124/*
125 *  Include stdint.h with defines that trigger declaration of C99 limit/const
126 *  macros here before anyone else has a chance to include stdint.h without
127 *  these.
128 */
129#ifndef __STDC_LIMIT_MACROS
130#define __STDC_LIMIT_MACROS
131#endif
132#ifndef __STDC_CONSTANT_MACROS
133#define __STDC_CONSTANT_MACROS
134#endif
135#include <stdint.h>
136#endif
137
138/*
139 *  The "user config" file can be empty, and everything should work. It is
140 *  meant to store a given platform/client's overrides of our guess-work.
141 *
142 *  A alternate user config file can be specified by defining
143 *  GR_USER_CONFIG_FILE. It should be defined relative to GrConfig.h
144 *
145 *  e.g. it can specify GR_DEBUG/GR_RELEASE as it please, change the BUILD
146 *  target, or supply its own defines for anything else (e.g. GR_DEFAULT_TEXTURE_CACHE_MB_LIMIT)
147 */
148#if !defined(GR_USER_CONFIG_FILE)
149    #include "GrUserConfig.h"
150#else
151    #include GR_USER_CONFIG_FILE
152#endif
153
154
155///////////////////////////////////////////////////////////////////////////////
156///////////////////////////////////////////////////////////////////////////////
157// postconfig section:
158//
159
160// GR_IMPLEMENTATION should be define to 1 when building Gr and 0 when including
161// it in another dependent build. The Gr makefile/ide-project should define this
162// to 1.
163#if !defined(GR_IMPLEMENTATION)
164    #define GR_IMPLEMENTATION 0
165#endif
166
167// If Gr is built as a shared library then GR_DLL should be defined to 1 (both
168// when building Gr and when including its headers in dependent builds). Only
169// currently supported minimally for Chrome's Win32 Multi-DLL build (TODO:
170// correctly exort all of the public API correctly and support shared lib on
171// other platforms).
172#if !defined(GR_DLL)
173    #define GR_DLL 0
174#endif
175
176#if GR_DLL
177    #if GR_WIN32_BUILD
178        #if GR_IMPLEMENTATION
179            #define GR_API __declspec(dllexport)
180        #else
181            #define GR_API __declspec(dllimport)
182        #endif
183    #else
184        #define GR_API __attribute__((visibility("default")))
185    #endif
186#else
187    #define GR_API
188#endif
189
190// By now we must have a GR_..._BUILD symbol set to 1, and a decision about
191// debug -vs- release
192//
193
194#define GrPrintf SkDebugf
195
196/**
197 *  GR_STRING makes a string of X where X is expanded before conversion to a string
198 *  if X itself contains macros.
199 */
200#define GR_STRING(X) GR_STRING_IMPL(X)
201#define GR_STRING_IMPL(X) #X
202
203/**
204 *  GR_CONCAT concatenates X and Y  where each is expanded before
205 *  contanenation if either contains macros.
206 */
207#define GR_CONCAT(X,Y) GR_CONCAT_IMPL(X,Y)
208#define GR_CONCAT_IMPL(X,Y) X##Y
209
210/**
211 *  Creates a string of the form "<filename>(<linenumber>) : "
212 */
213#define GR_FILE_AND_LINE_STR __FILE__ "(" GR_STRING(__LINE__) ") : "
214
215/**
216 *  Compilers have different ways of issuing warnings. This macro
217 *  attempts to abstract them, but may need to be specialized for your
218 *  particular compiler.
219 *  To insert compiler warnings use "#pragma message GR_WARN(<string>)"
220 */
221#if defined(_MSC_VER) && _MSC_VER
222    #define GR_WARN(MSG) (GR_FILE_AND_LINE_STR "WARNING: " MSG)
223#else//__GNUC__ - may need other defines for different compilers
224    #define GR_WARN(MSG) ("WARNING: " MSG)
225#endif
226
227/**
228 *  GR_ALWAYSBREAK is an unconditional break in all builds.
229 */
230#if !defined(GR_ALWAYSBREAK)
231    #if     GR_WIN32_BUILD
232        #define GR_ALWAYSBREAK SkNO_RETURN_HINT(); __debugbreak()
233    #else
234        // TODO: do other platforms really not have continuable breakpoints?
235        // sign extend for 64bit architectures to be sure this is
236        // in the high address range
237        #define GR_ALWAYSBREAK SkNO_RETURN_HINT(); *((int*)(int64_t)(int32_t)0xbeefcafe) = 0;
238    #endif
239#endif
240
241/**
242 *  GR_DEBUGBREAK is an unconditional break in debug builds.
243 */
244#if !defined(GR_DEBUGBREAK)
245    #if GR_DEBUG
246        #define GR_DEBUGBREAK GR_ALWAYSBREAK
247    #else
248        #define GR_DEBUGBREAK
249    #endif
250#endif
251
252/**
253 *  GR_ALWAYSASSERT is an assertion in all builds.
254 */
255#if !defined(GR_ALWAYSASSERT)
256    #define GR_ALWAYSASSERT(COND)                                        \
257        do {                                                             \
258            if (!(COND)) {                                               \
259                GrPrintf("%s %s failed\n", GR_FILE_AND_LINE_STR, #COND); \
260                GR_ALWAYSBREAK;                                          \
261            }                                                            \
262        } while (false)
263#endif
264
265/**
266 *  GR_DEBUGASSERT is an assertion in debug builds only.
267 */
268#if !defined(GR_DEBUGASSERT)
269    #if GR_DEBUG
270        #define GR_DEBUGASSERT(COND) GR_ALWAYSASSERT(COND)
271    #else
272        #define GR_DEBUGASSERT(COND)
273    #endif
274#endif
275
276/**
277 *  Prettier forms of the above macros.
278 */
279#define GrAssert(COND) GR_DEBUGASSERT(COND)
280#define GrAlwaysAssert(COND) GR_ALWAYSASSERT(COND)
281
282/**
283 * Crash from unrecoverable condition, optionally with a message.
284 */
285inline void GrCrash() { GrAlwaysAssert(false); }
286inline void GrCrash(const char* msg) { GrPrintf(msg); GrAlwaysAssert(false); }
287
288/**
289 *  GR_DEBUGCODE compiles the code X in debug builds only
290 */
291#if !defined(GR_DEBUGCODE)
292    #if GR_DEBUG
293        #define GR_DEBUGCODE(X) X
294    #else
295        #define GR_DEBUGCODE(X)
296    #endif
297#endif
298
299/**
300 *  GR_STATIC_ASSERT is a compile time assertion. Depending on the platform
301 *  it may print the message in the compiler log. Obviously, the condition must
302 *  be evaluatable at compile time.
303 */
304// VS 2010 and GCC compiled with c++0x or gnu++0x support the new
305// static_assert.
306#if !defined(GR_STATIC_ASSERT)
307    #if (defined(_MSC_VER) && _MSC_VER >= 1600) || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)
308        #define GR_STATIC_ASSERT(CONDITION) static_assert(CONDITION, "bug")
309    #else
310        template <bool> class GR_STATIC_ASSERT_FAILURE;
311        template <> class GR_STATIC_ASSERT_FAILURE<true> {};
312        #define GR_STATIC_ASSERT(CONDITION) \
313            enum {GR_CONCAT(X,__LINE__) = \
314            sizeof(GR_STATIC_ASSERT_FAILURE<CONDITION>)}
315    #endif
316#endif
317
318/**
319 * GR_GEOM_BUFFER_LOCK_THRESHOLD gives a threshold (in bytes) for when Gr should
320 * lock a GrGeometryBuffer to update its contents. It will use lock() if the
321 * size of the updated region is greater than the threshold. Otherwise it will
322 * use updateData().
323 */
324#if !defined(GR_GEOM_BUFFER_LOCK_THRESHOLD)
325    #define GR_GEOM_BUFFER_LOCK_THRESHOLD (1 << 15)
326#endif
327
328/**
329 * GR_DEFAULT_TEXTURE_CACHE_MB_LIMIT gives a threshold (in megabytes) for the
330 * maximum size of the texture cache in vram. The value is only a default and
331 * can be overridden at runtime.
332 */
333#if !defined(GR_DEFAULT_TEXTURE_CACHE_MB_LIMIT)
334    #define GR_DEFAULT_TEXTURE_CACHE_MB_LIMIT 96
335#endif
336
337/**
338 * GR_USE_NEW_GL_SHADER_SOURCE_SIGNATURE is for compatibility with the new version
339 * of the OpenGLES2.0 headers from Khronos.  glShaderSource now takes a const char * const *,
340 * instead of a const char **.
341 */
342#if !defined(GR_USE_NEW_GL_SHADER_SOURCE_SIGNATURE)
343    #define GR_USE_NEW_GL_SHADER_SOURCE_SIGNATURE 0
344#endif
345
346/**
347 * GR_STROKE_PATH_RENDERING controls whether or not the GrStrokePathRenderer can be selected
348 * as a path renderer. GrStrokePathRenderer is currently an experimental path renderer.
349 */
350#if !defined(GR_STROKE_PATH_RENDERING)
351    #define GR_STROKE_PATH_RENDERING                 0
352#endif
353
354///////////////////////////////////////////////////////////////////////////////
355// tail section:
356//
357// Now we just assert if we are missing some required define, or if we detect
358// and inconsistent combination of defines
359//
360
361
362/**
363 *  Only one build target macro should be 1 and the rest should be 0.
364 */
365#define GR_BUILD_SUM    (GR_WIN32_BUILD + GR_MAC_BUILD + GR_IOS_BUILD + GR_ANDROID_BUILD + GR_LINUX_BUILD + GR_QNX_BUILD)
366#if 0 == GR_BUILD_SUM
367    #error "Missing a GR_BUILD define"
368#elif 1 != GR_BUILD_SUM
369    #error "More than one GR_BUILD defined"
370#endif
371
372#if 0
373#if GR_WIN32_BUILD
374//    #pragma message GR_WARN("GR_WIN32_BUILD")
375#endif
376#if GR_MAC_BUILD
377//    #pragma message GR_WARN("GR_MAC_BUILD")
378#endif
379#if GR_IOS_BUILD
380//    #pragma message GR_WARN("GR_IOS_BUILD")
381#endif
382#if GR_ANDROID_BUILD
383//    #pragma message GR_WARN("GR_ANDROID_BUILD")
384#endif
385#if GR_LINUX_BUILD
386//    #pragma message GR_WARN("GR_LINUX_BUILD")
387#endif
388#if GR_QNX_BUILD
389//    #pragma message GR_WARN("GR_QNX_BUILD")
390#endif
391#endif
392
393#endif
394