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