blob: 3daae6139c1f8603b81c489d34629774348c355c [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001
reed@google.comac10a2d2010-12-22 21:39:39 +00002/*
epoger@google.comec3ed6a2011-07-28 14:26:00 +00003 * 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.
reed@google.comac10a2d2010-12-22 21:39:39 +00007 */
8
9
epoger@google.comec3ed6a2011-07-28 14:26:00 +000010
reed@google.comac10a2d2010-12-22 21:39:39 +000011#ifndef GrConfig_DEFINED
12#define GrConfig_DEFINED
13
Mike Kleinc0bd9f92019-04-23 12:05:21 -050014#include "include/core/SkTypes.h"
robertphillips@google.com59552022012-08-31 13:07:37 +000015
reed@google.comac10a2d2010-12-22 21:39:39 +000016///////////////////////////////////////////////////////////////////////////////
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
robertphillips@google.com59552022012-08-31 13:07:37 +000035#if !defined(GR_CACHE_STATS)
djsollenefe46d22016-04-29 06:41:35 -070036 #if defined(SK_DEBUG) || defined(SK_DUMP_STATS)
bsalomon24234fe2014-10-24 09:34:41 -070037 #define GR_CACHE_STATS 1
38 #else
39 #define GR_CACHE_STATS 0
40 #endif
robertphillips@google.com59552022012-08-31 13:07:37 +000041#endif
reed@google.comac10a2d2010-12-22 21:39:39 +000042
robertphillips754f4e92014-09-18 13:52:08 -070043#if !defined(GR_GPU_STATS)
Greg Danield2073452018-12-07 11:20:33 -050044 #if defined(SK_DEBUG) || defined(SK_DUMP_STATS) || defined(GR_TEST_UTILS)
bsalomon24234fe2014-10-24 09:34:41 -070045 #define GR_GPU_STATS 1
46 #else
47 #define GR_GPU_STATS 0
48 #endif
robertphillips754f4e92014-09-18 13:52:08 -070049#endif
50
reed@google.comac10a2d2010-12-22 21:39:39 +000051///////////////////////////////////////////////////////////////////////////////
52///////////////////////////////////////////////////////////////////////////////
53
54/*
bsalomon@google.com91826102011-03-21 19:51:57 +000055 * Include stdint.h with defines that trigger declaration of C99 limit/const
rmistry@google.comfbfcd562012-08-23 18:09:54 +000056 * macros here before anyone else has a chance to include stdint.h without
bsalomon@google.com91826102011-03-21 19:51:57 +000057 * these.
reed@google.comac10a2d2010-12-22 21:39:39 +000058 */
senorblanco@chromium.orgf9a14552012-11-06 18:36:33 +000059#ifndef __STDC_LIMIT_MACROS
reed@google.comac10a2d2010-12-22 21:39:39 +000060#define __STDC_LIMIT_MACROS
senorblanco@chromium.orgf9a14552012-11-06 18:36:33 +000061#endif
62#ifndef __STDC_CONSTANT_MACROS
reed@google.comac10a2d2010-12-22 21:39:39 +000063#define __STDC_CONSTANT_MACROS
senorblanco@chromium.orgf9a14552012-11-06 18:36:33 +000064#endif
reed@google.comac10a2d2010-12-22 21:39:39 +000065#include <stdint.h>
66
reed@google.comac10a2d2010-12-22 21:39:39 +000067///////////////////////////////////////////////////////////////////////////////
68///////////////////////////////////////////////////////////////////////////////
69// postconfig section:
70//
bsalomon@google.com91826102011-03-21 19:51:57 +000071
reed@google.comac10a2d2010-12-22 21:39:39 +000072/**
73 * GR_STRING makes a string of X where X is expanded before conversion to a string
74 * if X itself contains macros.
75 */
76#define GR_STRING(X) GR_STRING_IMPL(X)
77#define GR_STRING_IMPL(X) #X
78
79/**
bsalomon@google.com1c13c962011-02-14 16:51:21 +000080 * GR_CONCAT concatenates X and Y where each is expanded before
reed@google.comac10a2d2010-12-22 21:39:39 +000081 * contanenation if either contains macros.
82 */
83#define GR_CONCAT(X,Y) GR_CONCAT_IMPL(X,Y)
84#define GR_CONCAT_IMPL(X,Y) X##Y
85
86/**
87 * Creates a string of the form "<filename>(<linenumber>) : "
88 */
89#define GR_FILE_AND_LINE_STR __FILE__ "(" GR_STRING(__LINE__) ") : "
90
91/**
bsalomon@google.com1c13c962011-02-14 16:51:21 +000092 * Compilers have different ways of issuing warnings. This macro
93 * attempts to abstract them, but may need to be specialized for your
reed@google.comac10a2d2010-12-22 21:39:39 +000094 * particular compiler.
95 * To insert compiler warnings use "#pragma message GR_WARN(<string>)"
96 */
bungemand7dc76f2016-03-10 11:14:40 -080097#if defined(_MSC_VER)
reed@google.comac10a2d2010-12-22 21:39:39 +000098 #define GR_WARN(MSG) (GR_FILE_AND_LINE_STR "WARNING: " MSG)
99#else//__GNUC__ - may need other defines for different compilers
100 #define GR_WARN(MSG) ("WARNING: " MSG)
101#endif
102
103/**
104 * GR_ALWAYSBREAK is an unconditional break in all builds.
105 */
106#if !defined(GR_ALWAYSBREAK)
Mike Klein8f11d4d2018-01-24 12:42:55 -0500107 #if defined(SK_BUILD_FOR_WIN)
bsalomon@google.com04423802011-11-23 21:25:35 +0000108 #define GR_ALWAYSBREAK SkNO_RETURN_HINT(); __debugbreak()
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000109 #else
reed@google.comac10a2d2010-12-22 21:39:39 +0000110 // TODO: do other platforms really not have continuable breakpoints?
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000111 // sign extend for 64bit architectures to be sure this is
reed@google.comac10a2d2010-12-22 21:39:39 +0000112 // in the high address range
bsalomon@google.com04423802011-11-23 21:25:35 +0000113 #define GR_ALWAYSBREAK SkNO_RETURN_HINT(); *((int*)(int64_t)(int32_t)0xbeefcafe) = 0;
reed@google.comac10a2d2010-12-22 21:39:39 +0000114 #endif
115#endif
116
117/**
118 * GR_DEBUGBREAK is an unconditional break in debug builds.
119 */
120#if !defined(GR_DEBUGBREAK)
commit-bot@chromium.org515dcd32013-08-28 14:17:03 +0000121 #ifdef SK_DEBUG
reed@google.comac10a2d2010-12-22 21:39:39 +0000122 #define GR_DEBUGBREAK GR_ALWAYSBREAK
123 #else
124 #define GR_DEBUGBREAK
125 #endif
126#endif
127
128/**
129 * GR_ALWAYSASSERT is an assertion in all builds.
130 */
131#if !defined(GR_ALWAYSASSERT)
132 #define GR_ALWAYSASSERT(COND) \
133 do { \
134 if (!(COND)) { \
tfarina38406c82014-10-31 07:11:12 -0700135 SkDebugf("%s %s failed\n", GR_FILE_AND_LINE_STR, #COND); \
reed@google.comac10a2d2010-12-22 21:39:39 +0000136 GR_ALWAYSBREAK; \
137 } \
138 } while (false)
139#endif
140
141/**
142 * GR_DEBUGASSERT is an assertion in debug builds only.
143 */
144#if !defined(GR_DEBUGASSERT)
commit-bot@chromium.org515dcd32013-08-28 14:17:03 +0000145 #ifdef SK_DEBUG
reed@google.comac10a2d2010-12-22 21:39:39 +0000146 #define GR_DEBUGASSERT(COND) GR_ALWAYSASSERT(COND)
147 #else
148 #define GR_DEBUGASSERT(COND)
149 #endif
150#endif
151
152/**
153 * Prettier forms of the above macros.
154 */
reed@google.comac10a2d2010-12-22 21:39:39 +0000155#define GrAlwaysAssert(COND) GR_ALWAYSASSERT(COND)
156
157/**
reed@google.comac10a2d2010-12-22 21:39:39 +0000158 * GR_STATIC_ASSERT is a compile time assertion. Depending on the platform
159 * it may print the message in the compiler log. Obviously, the condition must
160 * be evaluatable at compile time.
161 */
bungemand7dc76f2016-03-10 11:14:40 -0800162#define GR_STATIC_ASSERT(CONDITION) static_assert(CONDITION, "bug")
reed@google.comac10a2d2010-12-22 21:39:39 +0000163
reed@google.comac10a2d2010-12-22 21:39:39 +0000164#endif