SkPreConfig.h 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  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. // IWYU pragma: private, include "SkTypes.h"
  8. #ifndef SkPreConfig_DEFINED
  9. #define SkPreConfig_DEFINED
  10. // Allows embedders that want to disable macros that take arguments to just
  11. // define that symbol to be one of these
  12. #define SK_NOTHING_ARG1(arg1)
  13. #define SK_NOTHING_ARG2(arg1, arg2)
  14. #define SK_NOTHING_ARG3(arg1, arg2, arg3)
  15. //////////////////////////////////////////////////////////////////////
  16. #if !defined(SK_BUILD_FOR_ANDROID) && !defined(SK_BUILD_FOR_IOS) && !defined(SK_BUILD_FOR_WIN) && \
  17. !defined(SK_BUILD_FOR_UNIX) && !defined(SK_BUILD_FOR_MAC)
  18. #ifdef __APPLE__
  19. #include "TargetConditionals.h"
  20. #endif
  21. #if defined(_WIN32) || defined(__SYMBIAN32__)
  22. #define SK_BUILD_FOR_WIN
  23. #elif defined(ANDROID) || defined(__ANDROID__)
  24. #define SK_BUILD_FOR_ANDROID
  25. #elif defined(linux) || defined(__linux) || defined(__FreeBSD__) || \
  26. defined(__OpenBSD__) || defined(__sun) || defined(__NetBSD__) || \
  27. defined(__DragonFly__) || defined(__Fuchsia__) || \
  28. defined(__GLIBC__) || defined(__GNU__) || defined(__unix__)
  29. #define SK_BUILD_FOR_UNIX
  30. #elif TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR
  31. #define SK_BUILD_FOR_IOS
  32. #else
  33. #define SK_BUILD_FOR_MAC
  34. #endif
  35. #endif
  36. //////////////////////////////////////////////////////////////////////
  37. #if defined(SK_BUILD_FOR_WIN) && !defined(__clang__)
  38. #if !defined(SK_RESTRICT)
  39. #define SK_RESTRICT __restrict
  40. #endif
  41. #if !defined(SK_WARN_UNUSED_RESULT)
  42. #define SK_WARN_UNUSED_RESULT
  43. #endif
  44. #endif
  45. #if !defined(SK_RESTRICT)
  46. #define SK_RESTRICT __restrict__
  47. #endif
  48. #if !defined(SK_WARN_UNUSED_RESULT)
  49. #define SK_WARN_UNUSED_RESULT __attribute__((warn_unused_result))
  50. #endif
  51. //////////////////////////////////////////////////////////////////////
  52. #if !defined(SK_CPU_BENDIAN) && !defined(SK_CPU_LENDIAN)
  53. #if defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
  54. #define SK_CPU_BENDIAN
  55. #elif defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
  56. #define SK_CPU_LENDIAN
  57. #elif defined(__sparc) || defined(__sparc__) || \
  58. defined(_POWER) || defined(__powerpc__) || \
  59. defined(__ppc__) || defined(__hppa) || \
  60. defined(__PPC__) || defined(__PPC64__) || \
  61. defined(_MIPSEB) || defined(__ARMEB__) || \
  62. defined(__s390__) || \
  63. (defined(__sh__) && defined(__BIG_ENDIAN__)) || \
  64. (defined(__ia64) && defined(__BIG_ENDIAN__))
  65. #define SK_CPU_BENDIAN
  66. #else
  67. #define SK_CPU_LENDIAN
  68. #endif
  69. #endif
  70. //////////////////////////////////////////////////////////////////////
  71. #if defined(__i386) || defined(_M_IX86) || defined(__x86_64__) || defined(_M_X64)
  72. #define SK_CPU_X86 1
  73. #endif
  74. /**
  75. * SK_CPU_SSE_LEVEL
  76. *
  77. * If defined, SK_CPU_SSE_LEVEL should be set to the highest supported level.
  78. * On non-intel CPU this should be undefined.
  79. */
  80. #define SK_CPU_SSE_LEVEL_SSE1 10
  81. #define SK_CPU_SSE_LEVEL_SSE2 20
  82. #define SK_CPU_SSE_LEVEL_SSE3 30
  83. #define SK_CPU_SSE_LEVEL_SSSE3 31
  84. #define SK_CPU_SSE_LEVEL_SSE41 41
  85. #define SK_CPU_SSE_LEVEL_SSE42 42
  86. #define SK_CPU_SSE_LEVEL_AVX 51
  87. #define SK_CPU_SSE_LEVEL_AVX2 52
  88. #define SK_CPU_SSE_LEVEL_AVX512 60
  89. // When targetting iOS and using gyp to generate the build files, it is not
  90. // possible to select files to build depending on the architecture (i.e. it
  91. // is not possible to use hand optimized assembly implementation). In that
  92. // configuration SK_BUILD_NO_OPTS is defined. Remove optimisation then.
  93. #ifdef SK_BUILD_NO_OPTS
  94. #define SK_CPU_SSE_LEVEL 0
  95. #endif
  96. // Are we in GCC/Clang?
  97. #ifndef SK_CPU_SSE_LEVEL
  98. // These checks must be done in descending order to ensure we set the highest
  99. // available SSE level.
  100. #if defined(__AVX512F__)
  101. #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_AVX512
  102. #elif defined(__AVX2__)
  103. #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_AVX2
  104. #elif defined(__AVX__)
  105. #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_AVX
  106. #elif defined(__SSE4_2__)
  107. #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_SSE42
  108. #elif defined(__SSE4_1__)
  109. #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_SSE41
  110. #elif defined(__SSSE3__)
  111. #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_SSSE3
  112. #elif defined(__SSE3__)
  113. #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_SSE3
  114. #elif defined(__SSE2__)
  115. #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_SSE2
  116. #endif
  117. #endif
  118. // Are we in VisualStudio?
  119. #ifndef SK_CPU_SSE_LEVEL
  120. // These checks must be done in descending order to ensure we set the highest
  121. // available SSE level. 64-bit intel guarantees at least SSE2 support.
  122. #if defined(__AVX2__)
  123. #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_AVX2
  124. #elif defined(__AVX__)
  125. #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_AVX
  126. #elif defined(_M_X64) || defined(_M_AMD64)
  127. #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_SSE2
  128. #elif defined(_M_IX86_FP)
  129. #if _M_IX86_FP >= 2
  130. #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_SSE2
  131. #elif _M_IX86_FP == 1
  132. #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_SSE1
  133. #endif
  134. #endif
  135. #endif
  136. //////////////////////////////////////////////////////////////////////
  137. // ARM defines
  138. #if defined(__arm__) && (!defined(__APPLE__) || !TARGET_IPHONE_SIMULATOR)
  139. #define SK_CPU_ARM32
  140. #elif defined(__aarch64__) && !defined(SK_BUILD_NO_OPTS)
  141. #define SK_CPU_ARM64
  142. #endif
  143. // All 64-bit ARM chips have NEON. Many 32-bit ARM chips do too.
  144. #if !defined(SK_ARM_HAS_NEON) && !defined(SK_BUILD_NO_OPTS) && defined(__ARM_NEON)
  145. #define SK_ARM_HAS_NEON
  146. #endif
  147. // Really this __APPLE__ check shouldn't be necessary, but it seems that Apple's Clang defines
  148. // __ARM_FEATURE_CRC32 for -arch arm64, even though their chips don't support those instructions!
  149. #if defined(__ARM_FEATURE_CRC32) && !defined(__APPLE__)
  150. #define SK_ARM_HAS_CRC32
  151. #endif
  152. //////////////////////////////////////////////////////////////////////
  153. #if !defined(SKIA_IMPLEMENTATION)
  154. #define SKIA_IMPLEMENTATION 0
  155. #endif
  156. #if !defined(SK_API)
  157. #if defined(SKIA_DLL)
  158. #if defined(_MSC_VER)
  159. #if SKIA_IMPLEMENTATION
  160. #define SK_API __declspec(dllexport)
  161. #else
  162. #define SK_API __declspec(dllimport)
  163. #endif
  164. #else
  165. #define SK_API __attribute__((visibility("default")))
  166. #endif
  167. #else
  168. #define SK_API
  169. #endif
  170. #endif
  171. #endif