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_CACHE_STATS) 36 #define GR_CACHE_STATS 0 37 #endif 38 39 #if !defined(GR_GPU_STATS) 40 #define GR_GPU_STATS 0 41 #endif 42 43 /////////////////////////////////////////////////////////////////////////////// 44 /////////////////////////////////////////////////////////////////////////////// 45 46 #if defined(SK_BUILD_FOR_WIN32) 47 // VC8 doesn't support stdint.h, so we define those types here. 48 typedef signed char int8_t; 49 typedef unsigned char uint8_t; 50 typedef short int16_t; 51 typedef unsigned short uint16_t; 52 typedef int int32_t; 53 typedef unsigned uint32_t; 54 typedef __int64 int64_t; 55 typedef unsigned __int64 uint64_t; 56 #else 57 /* 58 * Include stdint.h with defines that trigger declaration of C99 limit/const 59 * macros here before anyone else has a chance to include stdint.h without 60 * these. 61 */ 62 #ifndef __STDC_LIMIT_MACROS 63 #define __STDC_LIMIT_MACROS 64 #endif 65 #ifndef __STDC_CONSTANT_MACROS 66 #define __STDC_CONSTANT_MACROS 67 #endif 68 #include <stdint.h> 69 #endif 70 71 /* 72 * The "user config" file can be empty, and everything should work. It is 73 * meant to store a given platform/client's overrides of our guess-work. 74 * 75 * A alternate user config file can be specified by defining 76 * GR_USER_CONFIG_FILE. It should be defined relative to GrConfig.h 77 * 78 * e.g. it can change the BUILD target or supply its own defines for anything 79 * else (e.g. GR_DEFAULT_RESOURCE_CACHE_MB_LIMIT) 80 */ 81 #if !defined(GR_USER_CONFIG_FILE) 82 #include "GrUserConfig.h" 83 #else 84 #include GR_USER_CONFIG_FILE 85 #endif 86 87 88 /////////////////////////////////////////////////////////////////////////////// 89 /////////////////////////////////////////////////////////////////////////////// 90 // postconfig section: 91 // 92 93 // By now we must have a GR_..._BUILD symbol set to 1, and a decision about 94 // debug -vs- release 95 // 96 97 #define GrPrintf SkDebugf 98 99 /** 100 * GR_STRING makes a string of X where X is expanded before conversion to a string 101 * if X itself contains macros. 102 */ 103 #define GR_STRING(X) GR_STRING_IMPL(X) 104 #define GR_STRING_IMPL(X) #X 105 106 /** 107 * GR_CONCAT concatenates X and Y where each is expanded before 108 * contanenation if either contains macros. 109 */ 110 #define GR_CONCAT(X,Y) GR_CONCAT_IMPL(X,Y) 111 #define GR_CONCAT_IMPL(X,Y) X##Y 112 113 /** 114 * Creates a string of the form "<filename>(<linenumber>) : " 115 */ 116 #define GR_FILE_AND_LINE_STR __FILE__ "(" GR_STRING(__LINE__) ") : " 117 118 /** 119 * Compilers have different ways of issuing warnings. This macro 120 * attempts to abstract them, but may need to be specialized for your 121 * particular compiler. 122 * To insert compiler warnings use "#pragma message GR_WARN(<string>)" 123 */ 124 #if defined(_MSC_VER) && _MSC_VER 125 #define GR_WARN(MSG) (GR_FILE_AND_LINE_STR "WARNING: " MSG) 126 #else//__GNUC__ - may need other defines for different compilers 127 #define GR_WARN(MSG) ("WARNING: " MSG) 128 #endif 129 130 /** 131 * GR_ALWAYSBREAK is an unconditional break in all builds. 132 */ 133 #if !defined(GR_ALWAYSBREAK) 134 #if defined(SK_BUILD_FOR_WIN32) 135 #define GR_ALWAYSBREAK SkNO_RETURN_HINT(); __debugbreak() 136 #else 137 // TODO: do other platforms really not have continuable breakpoints? 138 // sign extend for 64bit architectures to be sure this is 139 // in the high address range 140 #define GR_ALWAYSBREAK SkNO_RETURN_HINT(); *((int*)(int64_t)(int32_t)0xbeefcafe) = 0; 141 #endif 142 #endif 143 144 /** 145 * GR_DEBUGBREAK is an unconditional break in debug builds. 146 */ 147 #if !defined(GR_DEBUGBREAK) 148 #ifdef SK_DEBUG 149 #define GR_DEBUGBREAK GR_ALWAYSBREAK 150 #else 151 #define GR_DEBUGBREAK 152 #endif 153 #endif 154 155 /** 156 * GR_ALWAYSASSERT is an assertion in all builds. 157 */ 158 #if !defined(GR_ALWAYSASSERT) 159 #define GR_ALWAYSASSERT(COND) \ 160 do { \ 161 if (!(COND)) { \ 162 GrPrintf("%s %s failed\n", GR_FILE_AND_LINE_STR, #COND); \ 163 GR_ALWAYSBREAK; \ 164 } \ 165 } while (false) 166 #endif 167 168 /** 169 * GR_DEBUGASSERT is an assertion in debug builds only. 170 */ 171 #if !defined(GR_DEBUGASSERT) 172 #ifdef SK_DEBUG 173 #define GR_DEBUGASSERT(COND) GR_ALWAYSASSERT(COND) 174 #else 175 #define GR_DEBUGASSERT(COND) 176 #endif 177 #endif 178 179 /** 180 * Prettier forms of the above macros. 181 */ 182 #define GrAlwaysAssert(COND) GR_ALWAYSASSERT(COND) 183 184 /** 185 * GR_STATIC_ASSERT is a compile time assertion. Depending on the platform 186 * it may print the message in the compiler log. Obviously, the condition must 187 * be evaluatable at compile time. 188 */ 189 // VS 2010 and GCC compiled with c++0x or gnu++0x support the new 190 // static_assert. 191 #if !defined(GR_STATIC_ASSERT) 192 #if (defined(_MSC_VER) && _MSC_VER >= 1600) || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__) 193 #define GR_STATIC_ASSERT(CONDITION) static_assert(CONDITION, "bug") 194 #else 195 template <bool> class GR_STATIC_ASSERT_FAILURE; 196 template <> class GR_STATIC_ASSERT_FAILURE<true> {}; 197 #define GR_STATIC_ASSERT(CONDITION) \ 198 enum {GR_CONCAT(X,__LINE__) = \ 199 sizeof(GR_STATIC_ASSERT_FAILURE<CONDITION>)} 200 #endif 201 #endif 202 203 /** 204 * GR_GEOM_BUFFER_MAP_THRESHOLD gives a threshold (in bytes) for when Gr should 205 * map a GrGeometryBuffer to update its contents. It will use map() if the 206 * size of the updated region is greater than the threshold. Otherwise it will 207 * use updateData(). 208 */ 209 #if !defined(GR_GEOM_BUFFER_MAP_THRESHOLD) 210 #define GR_GEOM_BUFFER_MAP_THRESHOLD (1 << 15) 211 #endif 212 213 /** 214 * GR_DEFAULT_RESOURCE_CACHE_MB_LIMIT gives a threshold (in megabytes) for the 215 * maximum size of the texture cache in vram. The value is only a default and 216 * can be overridden at runtime. 217 */ 218 #if !defined(GR_DEFAULT_RESOURCE_CACHE_MB_LIMIT) 219 #define GR_DEFAULT_RESOURCE_CACHE_MB_LIMIT 96 220 #endif 221 222 /** 223 * GR_DEFAULT_RESOURCE_CACHE_COUNT_LIMIT specifies the maximum number of 224 * textures the texture cache can hold in vram. The value is only a default and 225 * can be overridden at runtime. 226 */ 227 #if !defined(GR_DEFAULT_RESOURCE_CACHE_COUNT_LIMIT) 228 #define GR_DEFAULT_RESOURCE_CACHE_COUNT_LIMIT 2048 229 #endif 230 231 /** 232 * GR_STROKE_PATH_RENDERING controls whether or not the GrStrokePathRenderer can be selected 233 * as a path renderer. GrStrokePathRenderer is currently an experimental path renderer. 234 */ 235 #if !defined(GR_STROKE_PATH_RENDERING) 236 #define GR_STROKE_PATH_RENDERING 0 237 #endif 238 239 /** 240 * GR_ALWAYS_ALLOCATE_ON_HEAP determines whether various temporary buffers created 241 * in the GPU backend are always allocated on the heap or are allowed to be 242 * allocated on the stack for smaller memory requests. 243 * 244 * This is only used for memory buffers that are created and then passed through to the 245 * 3D API (e.g. as texture or geometry data) 246 */ 247 #if !defined(GR_ALWAYS_ALLOCATE_ON_HEAP) 248 #define GR_ALWAYS_ALLOCATE_ON_HEAP 0 249 #endif 250 251 #endif 252