GrTypes.h 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. /*
  2. * Copyright 2010 Google Inc.
  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. #ifndef GrTypes_DEFINED
  8. #define GrTypes_DEFINED
  9. #include "SkMath.h"
  10. #include "SkTypes.h"
  11. #include "GrConfig.h"
  12. ////////////////////////////////////////////////////////////////////////////////
  13. /**
  14. * Defines overloaded bitwise operators to make it easier to use an enum as a
  15. * bitfield.
  16. */
  17. #define GR_MAKE_BITFIELD_OPS(X) \
  18. inline X operator |(X a, X b) { \
  19. return (X) (+a | +b); \
  20. } \
  21. inline X& operator |=(X& a, X b) { \
  22. return (a = a | b); \
  23. } \
  24. inline X operator &(X a, X b) { \
  25. return (X) (+a & +b); \
  26. } \
  27. inline X& operator &=(X& a, X b) { \
  28. return (a = a & b); \
  29. } \
  30. template <typename T> \
  31. inline X operator &(T a, X b) { \
  32. return (X) (+a & +b); \
  33. } \
  34. template <typename T> \
  35. inline X operator &(X a, T b) { \
  36. return (X) (+a & +b); \
  37. } \
  38. #define GR_DECL_BITFIELD_OPS_FRIENDS(X) \
  39. friend X operator |(X a, X b); \
  40. friend X& operator |=(X& a, X b); \
  41. \
  42. friend X operator &(X a, X b); \
  43. friend X& operator &=(X& a, X b); \
  44. \
  45. template <typename T> \
  46. friend X operator &(T a, X b); \
  47. \
  48. template <typename T> \
  49. friend X operator &(X a, T b); \
  50. /**
  51. * Wraps a C++11 enum that we use as a bitfield, and enables a limited amount of
  52. * masking with type safety. Instantiated with the ~ operator.
  53. */
  54. template<typename TFlags> class GrTFlagsMask {
  55. public:
  56. constexpr explicit GrTFlagsMask(TFlags value) : GrTFlagsMask(static_cast<int>(value)) {}
  57. constexpr explicit GrTFlagsMask(int value) : fValue(value) {}
  58. constexpr int value() const { return fValue; }
  59. private:
  60. const int fValue;
  61. };
  62. // Or-ing a mask always returns another mask.
  63. template<typename TFlags> constexpr GrTFlagsMask<TFlags> operator|(GrTFlagsMask<TFlags> a,
  64. GrTFlagsMask<TFlags> b) {
  65. return GrTFlagsMask<TFlags>(a.value() | b.value());
  66. }
  67. template<typename TFlags> constexpr GrTFlagsMask<TFlags> operator|(GrTFlagsMask<TFlags> a,
  68. TFlags b) {
  69. return GrTFlagsMask<TFlags>(a.value() | static_cast<int>(b));
  70. }
  71. template<typename TFlags> constexpr GrTFlagsMask<TFlags> operator|(TFlags a,
  72. GrTFlagsMask<TFlags> b) {
  73. return GrTFlagsMask<TFlags>(static_cast<int>(a) | b.value());
  74. }
  75. template<typename TFlags> inline GrTFlagsMask<TFlags>& operator|=(GrTFlagsMask<TFlags>& a,
  76. GrTFlagsMask<TFlags> b) {
  77. return (a = a | b);
  78. }
  79. // And-ing two masks returns another mask; and-ing one with regular flags returns flags.
  80. template<typename TFlags> constexpr GrTFlagsMask<TFlags> operator&(GrTFlagsMask<TFlags> a,
  81. GrTFlagsMask<TFlags> b) {
  82. return GrTFlagsMask<TFlags>(a.value() & b.value());
  83. }
  84. template<typename TFlags> constexpr TFlags operator&(GrTFlagsMask<TFlags> a, TFlags b) {
  85. return static_cast<TFlags>(a.value() & static_cast<int>(b));
  86. }
  87. template<typename TFlags> constexpr TFlags operator&(TFlags a, GrTFlagsMask<TFlags> b) {
  88. return static_cast<TFlags>(static_cast<int>(a) & b.value());
  89. }
  90. template<typename TFlags> inline TFlags& operator&=(TFlags& a, GrTFlagsMask<TFlags> b) {
  91. return (a = a & b);
  92. }
  93. /**
  94. * Defines bitwise operators that make it possible to use an enum class as a
  95. * basic bitfield.
  96. */
  97. #define GR_MAKE_BITFIELD_CLASS_OPS(X) \
  98. constexpr GrTFlagsMask<X> operator~(X a) { \
  99. return GrTFlagsMask<X>(~static_cast<int>(a)); \
  100. } \
  101. constexpr X operator|(X a, X b) { \
  102. return static_cast<X>(static_cast<int>(a) | static_cast<int>(b)); \
  103. } \
  104. inline X& operator|=(X& a, X b) { \
  105. return (a = a | b); \
  106. } \
  107. constexpr bool operator&(X a, X b) { \
  108. return SkToBool(static_cast<int>(a) & static_cast<int>(b)); \
  109. } \
  110. #define GR_DECL_BITFIELD_CLASS_OPS_FRIENDS(X) \
  111. friend constexpr GrTFlagsMask<X> operator ~(X); \
  112. friend constexpr X operator |(X, X); \
  113. friend X& operator |=(X&, X); \
  114. friend constexpr bool operator &(X, X);
  115. ////////////////////////////////////////////////////////////////////////////////
  116. // compile time versions of min/max
  117. #define GR_CT_MAX(a, b) (((b) < (a)) ? (a) : (b))
  118. #define GR_CT_MIN(a, b) (((b) < (a)) ? (b) : (a))
  119. /**
  120. * divide, rounding up
  121. */
  122. static inline int32_t GrIDivRoundUp(int x, int y) {
  123. SkASSERT(y > 0);
  124. return (x + (y-1)) / y;
  125. }
  126. static inline uint32_t GrUIDivRoundUp(uint32_t x, uint32_t y) {
  127. return (x + (y-1)) / y;
  128. }
  129. static inline size_t GrSizeDivRoundUp(size_t x, size_t y) {
  130. return (x + (y-1)) / y;
  131. }
  132. // compile time, evaluates Y multiple times
  133. #define GR_CT_DIV_ROUND_UP(X, Y) (((X) + ((Y)-1)) / (Y))
  134. /**
  135. * align up
  136. */
  137. static inline uint32_t GrUIAlignUp(uint32_t x, uint32_t alignment) {
  138. return GrUIDivRoundUp(x, alignment) * alignment;
  139. }
  140. static inline size_t GrSizeAlignUp(size_t x, size_t alignment) {
  141. return GrSizeDivRoundUp(x, alignment) * alignment;
  142. }
  143. // compile time, evaluates A multiple times
  144. #define GR_CT_ALIGN_UP(X, A) (GR_CT_DIV_ROUND_UP((X),(A)) * (A))
  145. /**
  146. * amount of pad needed to align up
  147. */
  148. static inline uint32_t GrUIAlignUpPad(uint32_t x, uint32_t alignment) {
  149. return (alignment - x % alignment) % alignment;
  150. }
  151. static inline size_t GrSizeAlignUpPad(size_t x, size_t alignment) {
  152. return (alignment - x % alignment) % alignment;
  153. }
  154. /**
  155. * align down
  156. */
  157. static inline uint32_t GrUIAlignDown(uint32_t x, uint32_t alignment) {
  158. return (x / alignment) * alignment;
  159. }
  160. static inline size_t GrSizeAlignDown(size_t x, uint32_t alignment) {
  161. return (x / alignment) * alignment;
  162. }
  163. ///////////////////////////////////////////////////////////////////////////////
  164. /**
  165. * Possible 3D APIs that may be used by Ganesh.
  166. */
  167. enum class GrBackendApi : unsigned {
  168. kMetal,
  169. kOpenGL,
  170. kVulkan,
  171. /**
  172. * Mock is a backend that does not draw anything. It is used for unit tests
  173. * and to measure CPU overhead.
  174. */
  175. kMock,
  176. /**
  177. * Added here to support the legacy GrBackend enum value and clients who referenced it using
  178. * GrBackend::kOpenGL_GrBackend.
  179. */
  180. kOpenGL_GrBackend = kOpenGL,
  181. };
  182. /**
  183. * Previously the above enum was not an enum class but a normal enum. To support the legacy use of
  184. * the enum values we define them below so that no clients break.
  185. */
  186. typedef GrBackendApi GrBackend;
  187. static constexpr GrBackendApi kMetal_GrBackend = GrBackendApi::kMetal;
  188. static constexpr GrBackendApi kVulkan_GrBackend = GrBackendApi::kVulkan;
  189. static constexpr GrBackendApi kMock_GrBackend = GrBackendApi::kMock;
  190. ///////////////////////////////////////////////////////////////////////////////
  191. /**
  192. * Used to say whether a texture has mip levels allocated or not.
  193. */
  194. enum class GrMipMapped : bool {
  195. kNo = false,
  196. kYes = true
  197. };
  198. ///////////////////////////////////////////////////////////////////////////////
  199. /**
  200. * GPU SkImage and SkSurfaces can be stored such that (0, 0) in texture space may correspond to
  201. * either the top-left or bottom-left content pixel.
  202. */
  203. enum GrSurfaceOrigin : int {
  204. kTopLeft_GrSurfaceOrigin,
  205. kBottomLeft_GrSurfaceOrigin,
  206. };
  207. /**
  208. * A GrContext's cache of backend context state can be partially invalidated.
  209. * These enums are specific to the GL backend and we'd add a new set for an alternative backend.
  210. */
  211. enum GrGLBackendState {
  212. kRenderTarget_GrGLBackendState = 1 << 0,
  213. // Also includes samplers bound to texture units.
  214. kTextureBinding_GrGLBackendState = 1 << 1,
  215. // View state stands for scissor and viewport
  216. kView_GrGLBackendState = 1 << 2,
  217. kBlend_GrGLBackendState = 1 << 3,
  218. kMSAAEnable_GrGLBackendState = 1 << 4,
  219. kVertex_GrGLBackendState = 1 << 5,
  220. kStencil_GrGLBackendState = 1 << 6,
  221. kPixelStore_GrGLBackendState = 1 << 7,
  222. kProgram_GrGLBackendState = 1 << 8,
  223. kFixedFunction_GrGLBackendState = 1 << 9,
  224. kMisc_GrGLBackendState = 1 << 10,
  225. kPathRendering_GrGLBackendState = 1 << 11,
  226. kALL_GrGLBackendState = 0xffff
  227. };
  228. /**
  229. * This value translates to reseting all the context state for any backend.
  230. */
  231. static const uint32_t kAll_GrBackendState = 0xffffffff;
  232. /**
  233. * Enum used as return value when flush with semaphores so the client knows whether the semaphores
  234. * were submitted to GPU or not.
  235. */
  236. enum class GrSemaphoresSubmitted : bool {
  237. kNo = false,
  238. kYes = true
  239. };
  240. #endif