LCOV - code coverage report
Current view: top level - gfx/skia/skia/include/gpu - GrTypes.h (source / functions) Hit Total Coverage
Test: output.info Lines: 0 95 0.0 %
Date: 2017-07-14 16:53:18 Functions: 0 24 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       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             : 
       8             : #ifndef GrTypes_DEFINED
       9             : #define GrTypes_DEFINED
      10             : 
      11             : #include "SkMath.h"
      12             : #include "SkTypes.h"
      13             : #include "GrConfig.h"
      14             : 
      15             : ////////////////////////////////////////////////////////////////////////////////
      16             : 
      17             : /**
      18             :  * Defines overloaded bitwise operators to make it easier to use an enum as a
      19             :  * bitfield.
      20             :  */
      21             : #define GR_MAKE_BITFIELD_OPS(X) \
      22             :     inline X operator |(X a, X b) { \
      23             :         return (X) (+a | +b); \
      24             :     } \
      25             :     inline X& operator |=(X& a, X b) { \
      26             :         return (a = a | b); \
      27             :     } \
      28             :     inline X operator &(X a, X b) { \
      29             :         return (X) (+a & +b); \
      30             :     } \
      31             :     inline X& operator &=(X& a, X b) { \
      32             :         return (a = a & b); \
      33             :     } \
      34             :     template <typename T> \
      35             :     inline X operator &(T a, X b) { \
      36             :         return (X) (+a & +b); \
      37             :     } \
      38             :     template <typename T> \
      39             :     inline X operator &(X a, T b) { \
      40             :         return (X) (+a & +b); \
      41             :     } \
      42             : 
      43             : #define GR_DECL_BITFIELD_OPS_FRIENDS(X) \
      44             :     friend X operator |(X a, X b); \
      45             :     friend X& operator |=(X& a, X b); \
      46             :     \
      47             :     friend X operator &(X a, X b); \
      48             :     friend X& operator &=(X& a, X b); \
      49             :     \
      50             :     template <typename T> \
      51             :     friend X operator &(T a, X b); \
      52             :     \
      53             :     template <typename T> \
      54             :     friend X operator &(X a, T b); \
      55             : 
      56             : /**
      57             :  * Wraps a C++11 enum that we use as a bitfield, and enables a limited amount of
      58             :  * masking with type safety. Instantiated with the ~ operator.
      59             :  */
      60             : template<typename TFlags> class GrTFlagsMask {
      61             : public:
      62             :     constexpr explicit GrTFlagsMask(TFlags value) : GrTFlagsMask(static_cast<int>(value)) {}
      63             :     constexpr explicit GrTFlagsMask(int value) : fValue(value) {}
      64             :     constexpr int value() const { return fValue; }
      65             : private:
      66             :     const int fValue;
      67             : };
      68             : 
      69             : // Or-ing a mask always returns another mask.
      70             : template<typename TFlags> constexpr GrTFlagsMask<TFlags> operator|(GrTFlagsMask<TFlags> a,
      71             :                                                                    GrTFlagsMask<TFlags> b) {
      72             :     return GrTFlagsMask<TFlags>(a.value() | b.value());
      73             : }
      74             : template<typename TFlags> constexpr GrTFlagsMask<TFlags> operator|(GrTFlagsMask<TFlags> a,
      75             :                                                                    TFlags b) {
      76             :     return GrTFlagsMask<TFlags>(a.value() | static_cast<int>(b));
      77             : }
      78             : template<typename TFlags> constexpr GrTFlagsMask<TFlags> operator|(TFlags a,
      79             :                                                                    GrTFlagsMask<TFlags> b) {
      80             :     return GrTFlagsMask<TFlags>(static_cast<int>(a) | b.value());
      81             : }
      82             : template<typename TFlags> inline GrTFlagsMask<TFlags>& operator|=(GrTFlagsMask<TFlags>& a,
      83             :                                                                   GrTFlagsMask<TFlags> b) {
      84             :     return (a = a | b);
      85             : }
      86             : 
      87             : // And-ing two masks returns another mask; and-ing one with regular flags returns flags.
      88             : template<typename TFlags> constexpr GrTFlagsMask<TFlags> operator&(GrTFlagsMask<TFlags> a,
      89             :                                                                    GrTFlagsMask<TFlags> b) {
      90             :     return GrTFlagsMask<TFlags>(a.value() & b.value());
      91             : }
      92             : template<typename TFlags> constexpr TFlags operator&(GrTFlagsMask<TFlags> a, TFlags b) {
      93             :     return static_cast<TFlags>(a.value() & static_cast<int>(b));
      94             : }
      95             : template<typename TFlags> constexpr TFlags operator&(TFlags a, GrTFlagsMask<TFlags> b) {
      96             :     return static_cast<TFlags>(static_cast<int>(a) & b.value());
      97             : }
      98             : template<typename TFlags> inline TFlags& operator&=(TFlags& a, GrTFlagsMask<TFlags> b) {
      99             :     return (a = a & b);
     100             : }
     101             : 
     102             : /**
     103             :  * Defines bitwise operators that make it possible to use an enum class as a
     104             :  * basic bitfield.
     105             :  */
     106             : #define GR_MAKE_BITFIELD_CLASS_OPS(X) \
     107             :     constexpr GrTFlagsMask<X> operator~(X a) { \
     108             :         return GrTFlagsMask<X>(~static_cast<int>(a)); \
     109             :     } \
     110             :     constexpr X operator|(X a, X b) { \
     111             :         return static_cast<X>(static_cast<int>(a) | static_cast<int>(b)); \
     112             :     } \
     113             :     inline X& operator|=(X& a, X b) { \
     114             :         return (a = a | b); \
     115             :     } \
     116             :     constexpr bool operator&(X a, X b) { \
     117             :         return SkToBool(static_cast<int>(a) & static_cast<int>(b)); \
     118             :     } \
     119             : 
     120             : #define GR_DECL_BITFIELD_CLASS_OPS_FRIENDS(X) \
     121             :     friend constexpr GrTFlagsMask<X> operator ~(X); \
     122             :     friend constexpr X operator |(X, X); \
     123             :     friend X& operator |=(X&, X); \
     124             :     friend constexpr bool operator &(X, X);
     125             : 
     126             : ////////////////////////////////////////////////////////////////////////////////
     127             : 
     128             : // compile time versions of min/max
     129             : #define GR_CT_MAX(a, b) (((b) < (a)) ? (a) : (b))
     130             : #define GR_CT_MIN(a, b) (((b) < (a)) ? (b) : (a))
     131             : 
     132             : /**
     133             :  *  divide, rounding up
     134             :  */
     135             : static inline int32_t GrIDivRoundUp(int x, int y) {
     136             :     SkASSERT(y > 0);
     137             :     return (x + (y-1)) / y;
     138             : }
     139             : static inline uint32_t GrUIDivRoundUp(uint32_t x, uint32_t y) {
     140             :     return (x + (y-1)) / y;
     141             : }
     142           0 : static inline size_t GrSizeDivRoundUp(size_t x, size_t y) {
     143           0 :     return (x + (y-1)) / y;
     144             : }
     145             : 
     146             : // compile time, evaluates Y multiple times
     147             : #define GR_CT_DIV_ROUND_UP(X, Y) (((X) + ((Y)-1)) / (Y))
     148             : 
     149             : /**
     150             :  *  align up
     151             :  */
     152             : static inline uint32_t GrUIAlignUp(uint32_t x, uint32_t alignment) {
     153             :     return GrUIDivRoundUp(x, alignment) * alignment;
     154             : }
     155           0 : static inline size_t GrSizeAlignUp(size_t x, size_t alignment) {
     156           0 :     return GrSizeDivRoundUp(x, alignment) * alignment;
     157             : }
     158             : 
     159             : // compile time, evaluates A multiple times
     160             : #define GR_CT_ALIGN_UP(X, A) (GR_CT_DIV_ROUND_UP((X),(A)) * (A))
     161             : 
     162             : /**
     163             :  * amount of pad needed to align up
     164             :  */
     165             : static inline uint32_t GrUIAlignUpPad(uint32_t x, uint32_t alignment) {
     166             :     return (alignment - x % alignment) % alignment;
     167             : }
     168           0 : static inline size_t GrSizeAlignUpPad(size_t x, size_t alignment) {
     169           0 :     return (alignment - x % alignment) % alignment;
     170             : }
     171             : 
     172             : /**
     173             :  *  align down
     174             :  */
     175             : static inline uint32_t GrUIAlignDown(uint32_t x, uint32_t alignment) {
     176             :     return (x / alignment) * alignment;
     177             : }
     178             : static inline size_t GrSizeAlignDown(size_t x, uint32_t alignment) {
     179             :     return (x / alignment) * alignment;
     180             : }
     181             : 
     182             : ///////////////////////////////////////////////////////////////////////////////
     183             : 
     184             : /**
     185             :  * Possible 3D APIs that may be used by Ganesh.
     186             :  */
     187             : enum GrBackend {
     188             :     kOpenGL_GrBackend,
     189             :     kVulkan_GrBackend,
     190             : 
     191             :     kLast_GrBackend = kVulkan_GrBackend
     192             : };
     193             : const int kBackendCount = kLast_GrBackend + 1;
     194             : 
     195             : /**
     196             :  * Backend-specific 3D context handle
     197             :  *      GrGLInterface* for OpenGL. If NULL will use the default GL interface.
     198             :  *      GrVkBackendContext* for Vulkan.
     199             :  */
     200             : typedef intptr_t GrBackendContext;
     201             : 
     202             : ///////////////////////////////////////////////////////////////////////////////
     203             : 
     204             : /**
     205             :  * Used to control antialiasing in draw calls.
     206             :  */
     207             : enum class GrAA {
     208             :     kYes,
     209             :     kNo
     210             : };
     211             : 
     212           0 : static inline GrAA GrBoolToAA(bool aa) { return aa ? GrAA::kYes : GrAA::kNo; }
     213             : 
     214             : ///////////////////////////////////////////////////////////////////////////////
     215             : 
     216             : /**
     217             : * Geometric primitives used for drawing.
     218             : */
     219             : enum GrPrimitiveType {
     220             :     kTriangles_GrPrimitiveType,
     221             :     kTriangleStrip_GrPrimitiveType,
     222             :     kTriangleFan_GrPrimitiveType,
     223             :     kPoints_GrPrimitiveType,
     224             :     kLines_GrPrimitiveType,     // 1 pix wide only
     225             :     kLineStrip_GrPrimitiveType, // 1 pix wide only
     226             :     kLast_GrPrimitiveType = kLineStrip_GrPrimitiveType
     227             : };
     228             : 
     229           0 : static inline bool GrIsPrimTypeLines(GrPrimitiveType type) {
     230           0 :     return kLines_GrPrimitiveType == type || kLineStrip_GrPrimitiveType == type;
     231             : }
     232             : 
     233             : static inline bool GrIsPrimTypeTris(GrPrimitiveType type) {
     234             :     return kTriangles_GrPrimitiveType == type     ||
     235             :            kTriangleStrip_GrPrimitiveType == type ||
     236             :            kTriangleFan_GrPrimitiveType == type;
     237             : }
     238             : 
     239             : /**
     240             :  *  Formats for masks, used by the font cache.
     241             :  *  Important that these are 0-based.
     242             :  */
     243             : enum GrMaskFormat {
     244             :     kA8_GrMaskFormat,    //!< 1-byte per pixel
     245             :     kA565_GrMaskFormat,  //!< 2-bytes per pixel, RGB represent 3-channel LCD coverage
     246             :     kARGB_GrMaskFormat,  //!< 4-bytes per pixel, color format
     247             : 
     248             :     kLast_GrMaskFormat = kARGB_GrMaskFormat
     249             : };
     250             : static const int kMaskFormatCount = kLast_GrMaskFormat + 1;
     251             : 
     252             : /**
     253             :  *  Return the number of bytes-per-pixel for the specified mask format.
     254             :  */
     255           0 : static inline int GrMaskFormatBytesPerPixel(GrMaskFormat format) {
     256           0 :     SkASSERT(format < kMaskFormatCount);
     257             :     // kA8   (0) -> 1
     258             :     // kA565 (1) -> 2
     259             :     // kARGB (2) -> 4
     260             :     static const int sBytesPerPixel[] = { 1, 2, 4 };
     261             :     static_assert(SK_ARRAY_COUNT(sBytesPerPixel) == kMaskFormatCount, "array_size_mismatch");
     262             :     static_assert(kA8_GrMaskFormat == 0, "enum_order_dependency");
     263             :     static_assert(kA565_GrMaskFormat == 1, "enum_order_dependency");
     264             :     static_assert(kARGB_GrMaskFormat == 2, "enum_order_dependency");
     265             : 
     266           0 :     return sBytesPerPixel[(int) format];
     267             : }
     268             : 
     269             : /**
     270             :  * Pixel configurations.
     271             :  */
     272             : enum GrPixelConfig {
     273             :     kUnknown_GrPixelConfig,
     274             :     kAlpha_8_GrPixelConfig,
     275             :     kGray_8_GrPixelConfig,
     276             :     kRGB_565_GrPixelConfig,
     277             :     /**
     278             :      * Premultiplied
     279             :      */
     280             :     kRGBA_4444_GrPixelConfig,
     281             :     /**
     282             :      * Premultiplied. Byte order is r,g,b,a.
     283             :      */
     284             :     kRGBA_8888_GrPixelConfig,
     285             :     /**
     286             :      * Premultiplied. Byte order is b,g,r,a.
     287             :      */
     288             :     kBGRA_8888_GrPixelConfig,
     289             :     /**
     290             :      * Premultiplied and sRGB. Byte order is r,g,b,a.
     291             :      */
     292             :     kSRGBA_8888_GrPixelConfig,
     293             :     /**
     294             :      * Premultiplied and sRGB. Byte order is b,g,r,a.
     295             :      */
     296             :     kSBGRA_8888_GrPixelConfig,
     297             :     /**
     298             :      * 8 bit signed integers per-channel. Byte order is b,g,r,a.
     299             :      */
     300             :     kRGBA_8888_sint_GrPixelConfig,
     301             :     /**
     302             :      * ETC1 Compressed Data
     303             :      */
     304             :     kETC1_GrPixelConfig,
     305             :     /**
     306             :      * Byte order is r, g, b, a.  This color format is 32 bits per channel
     307             :      */
     308             :     kRGBA_float_GrPixelConfig,
     309             :     /**
     310             :      * Byte order is r, g.  This color format is 32 bits per channel
     311             :      */
     312             :     kRG_float_GrPixelConfig,
     313             : 
     314             :     /**
     315             :      * This color format is a single 16 bit float channel
     316             :      */
     317             :     kAlpha_half_GrPixelConfig,
     318             : 
     319             :     /**
     320             :     * Byte order is r, g, b, a.  This color format is 16 bits per channel
     321             :     */
     322             :     kRGBA_half_GrPixelConfig,
     323             : 
     324             :     kLast_GrPixelConfig = kRGBA_half_GrPixelConfig
     325             : };
     326             : static const int kGrPixelConfigCnt = kLast_GrPixelConfig + 1;
     327             : 
     328             : // Aliases for pixel configs that match skia's byte order.
     329             : #ifndef SK_CPU_LENDIAN
     330             :     #error "Skia gpu currently assumes little endian"
     331             : #endif
     332             : #if SK_PMCOLOR_BYTE_ORDER(B,G,R,A)
     333             :     static const GrPixelConfig kSkia8888_GrPixelConfig = kBGRA_8888_GrPixelConfig;
     334             : #elif SK_PMCOLOR_BYTE_ORDER(R,G,B,A)
     335             :     static const GrPixelConfig kSkia8888_GrPixelConfig = kRGBA_8888_GrPixelConfig;
     336             : #else
     337             :     #error "SK_*32_SHIFT values must correspond to GL_BGRA or GL_RGBA format."
     338             : #endif
     339             : 
     340             : // Returns true if the pixel config is a GPU-specific compressed format
     341             : // representation.
     342           0 : static inline bool GrPixelConfigIsCompressed(GrPixelConfig config) {
     343           0 :     switch (config) {
     344             :         case kETC1_GrPixelConfig:
     345           0 :             return true;
     346             :         case kUnknown_GrPixelConfig:
     347             :         case kAlpha_8_GrPixelConfig:
     348             :         case kGray_8_GrPixelConfig:
     349             :         case kRGB_565_GrPixelConfig:
     350             :         case kRGBA_4444_GrPixelConfig:
     351             :         case kRGBA_8888_GrPixelConfig:
     352             :         case kBGRA_8888_GrPixelConfig:
     353             :         case kSRGBA_8888_GrPixelConfig:
     354             :         case kSBGRA_8888_GrPixelConfig:
     355             :         case kRGBA_8888_sint_GrPixelConfig:
     356             :         case kRGBA_float_GrPixelConfig:
     357             :         case kRG_float_GrPixelConfig:
     358             :         case kAlpha_half_GrPixelConfig:
     359             :         case kRGBA_half_GrPixelConfig:
     360           0 :             return false;
     361             :     }
     362           0 :     SkFAIL("Invalid pixel config");
     363           0 :     return false;
     364             : }
     365             : 
     366             : /** If the pixel config is compressed, return an equivalent uncompressed format. */
     367           0 : static inline GrPixelConfig GrMakePixelConfigUncompressed(GrPixelConfig config) {
     368           0 :     switch (config) {
     369             :         case kETC1_GrPixelConfig:
     370           0 :             return kRGBA_8888_GrPixelConfig;
     371             :         case kUnknown_GrPixelConfig:
     372             :         case kAlpha_8_GrPixelConfig:
     373             :         case kGray_8_GrPixelConfig:
     374             :         case kRGB_565_GrPixelConfig:
     375             :         case kRGBA_4444_GrPixelConfig:
     376             :         case kRGBA_8888_GrPixelConfig:
     377             :         case kBGRA_8888_GrPixelConfig:
     378             :         case kSRGBA_8888_GrPixelConfig:
     379             :         case kSBGRA_8888_GrPixelConfig:
     380             :         case kRGBA_8888_sint_GrPixelConfig:
     381             :         case kRGBA_float_GrPixelConfig:
     382             :         case kRG_float_GrPixelConfig:
     383             :         case kAlpha_half_GrPixelConfig:
     384             :         case kRGBA_half_GrPixelConfig:
     385           0 :             SkASSERT(!GrPixelConfigIsCompressed(config));
     386           0 :             return config;
     387             :     }
     388           0 :     SkFAIL("Invalid pixel config");
     389           0 :     return config;
     390             : }
     391             : 
     392             : // Returns true if the pixel config is 32 bits per pixel
     393           0 : static inline bool GrPixelConfigIs8888Unorm(GrPixelConfig config) {
     394           0 :     switch (config) {
     395             :         case kRGBA_8888_GrPixelConfig:
     396             :         case kBGRA_8888_GrPixelConfig:
     397             :         case kSRGBA_8888_GrPixelConfig:
     398             :         case kSBGRA_8888_GrPixelConfig:
     399           0 :             return true;
     400             :         case kUnknown_GrPixelConfig:
     401             :         case kAlpha_8_GrPixelConfig:
     402             :         case kGray_8_GrPixelConfig:
     403             :         case kRGB_565_GrPixelConfig:
     404             :         case kRGBA_4444_GrPixelConfig:
     405             :         case kRGBA_8888_sint_GrPixelConfig:
     406             :         case kETC1_GrPixelConfig:
     407             :         case kRGBA_float_GrPixelConfig:
     408             :         case kRG_float_GrPixelConfig:
     409             :         case kAlpha_half_GrPixelConfig:
     410             :         case kRGBA_half_GrPixelConfig:
     411           0 :             return false;
     412             :     }
     413           0 :     SkFAIL("Invalid pixel config");
     414           0 :     return false;
     415             : }
     416             : 
     417             : // Returns true if the color (non-alpha) components represent sRGB values. It does NOT indicate that
     418             : // all three color components are present in the config or anything about their order.
     419           0 : static inline bool GrPixelConfigIsSRGB(GrPixelConfig config) {
     420           0 :     switch (config) {
     421             :         case kSRGBA_8888_GrPixelConfig:
     422             :         case kSBGRA_8888_GrPixelConfig:
     423           0 :             return true;
     424             :         case kUnknown_GrPixelConfig:
     425             :         case kAlpha_8_GrPixelConfig:
     426             :         case kGray_8_GrPixelConfig:
     427             :         case kRGB_565_GrPixelConfig:
     428             :         case kRGBA_4444_GrPixelConfig:
     429             :         case kRGBA_8888_GrPixelConfig:
     430             :         case kBGRA_8888_GrPixelConfig:
     431             :         case kRGBA_8888_sint_GrPixelConfig:
     432             :         case kETC1_GrPixelConfig:
     433             :         case kRGBA_float_GrPixelConfig:
     434             :         case kRG_float_GrPixelConfig:
     435             :         case kAlpha_half_GrPixelConfig:
     436             :         case kRGBA_half_GrPixelConfig:
     437           0 :             return false;
     438             :     }
     439           0 :     SkFAIL("Invalid pixel config");
     440           0 :     return false;
     441             : }
     442             : 
     443             : // Takes a config and returns the equivalent config with the R and B order
     444             : // swapped if such a config exists. Otherwise, kUnknown_GrPixelConfig
     445           0 : static inline GrPixelConfig GrPixelConfigSwapRAndB(GrPixelConfig config) {
     446           0 :     switch (config) {
     447             :         case kBGRA_8888_GrPixelConfig:
     448           0 :             return kRGBA_8888_GrPixelConfig;
     449             :         case kRGBA_8888_GrPixelConfig:
     450           0 :             return kBGRA_8888_GrPixelConfig;
     451             :         case kSBGRA_8888_GrPixelConfig:
     452           0 :             return kSRGBA_8888_GrPixelConfig;
     453             :         case kSRGBA_8888_GrPixelConfig:
     454           0 :             return kSBGRA_8888_GrPixelConfig;
     455             :         case kUnknown_GrPixelConfig:
     456             :         case kAlpha_8_GrPixelConfig:
     457             :         case kGray_8_GrPixelConfig:
     458             :         case kRGB_565_GrPixelConfig:
     459             :         case kRGBA_4444_GrPixelConfig:
     460             :         case kRGBA_8888_sint_GrPixelConfig:
     461             :         case kETC1_GrPixelConfig:
     462             :         case kRGBA_float_GrPixelConfig:
     463             :         case kRG_float_GrPixelConfig:
     464             :         case kAlpha_half_GrPixelConfig:
     465             :         case kRGBA_half_GrPixelConfig:
     466           0 :             return kUnknown_GrPixelConfig;
     467             :     }
     468           0 :     SkFAIL("Invalid pixel config");
     469           0 :     return kUnknown_GrPixelConfig;
     470             : }
     471             : 
     472           0 : static inline size_t GrBytesPerPixel(GrPixelConfig config) {
     473           0 :     SkASSERT(!GrPixelConfigIsCompressed(config));
     474           0 :     switch (config) {
     475             :         case kAlpha_8_GrPixelConfig:
     476             :         case kGray_8_GrPixelConfig:
     477           0 :             return 1;
     478             :         case kRGB_565_GrPixelConfig:
     479             :         case kRGBA_4444_GrPixelConfig:
     480             :         case kAlpha_half_GrPixelConfig:
     481           0 :             return 2;
     482             :         case kRGBA_8888_GrPixelConfig:
     483             :         case kBGRA_8888_GrPixelConfig:
     484             :         case kSRGBA_8888_GrPixelConfig:
     485             :         case kSBGRA_8888_GrPixelConfig:
     486             :         case kRGBA_8888_sint_GrPixelConfig:
     487           0 :             return 4;
     488             :         case kRGBA_half_GrPixelConfig:
     489           0 :             return 8;
     490             :         case kRGBA_float_GrPixelConfig:
     491           0 :             return 16;
     492             :         case kRG_float_GrPixelConfig:
     493           0 :             return 8;
     494             :         case kUnknown_GrPixelConfig:
     495             :         case kETC1_GrPixelConfig:
     496           0 :             return 0;
     497             :     }
     498           0 :     SkFAIL("Invalid pixel config");
     499           0 :     return 0;
     500             : }
     501             : 
     502           0 : static inline bool GrPixelConfigIsOpaque(GrPixelConfig config) {
     503           0 :     switch (config) {
     504             :         case kETC1_GrPixelConfig:
     505             :         case kRGB_565_GrPixelConfig:
     506             :         case kGray_8_GrPixelConfig:
     507           0 :             return true;
     508             :         case kAlpha_8_GrPixelConfig:
     509             :         case kRGBA_4444_GrPixelConfig:
     510             :         case kAlpha_half_GrPixelConfig:
     511             :         case kRGBA_8888_GrPixelConfig:
     512             :         case kBGRA_8888_GrPixelConfig:
     513             :         case kSRGBA_8888_GrPixelConfig:
     514             :         case kSBGRA_8888_GrPixelConfig:
     515             :         case kRGBA_8888_sint_GrPixelConfig:
     516             :         case kRGBA_half_GrPixelConfig:
     517             :         case kRGBA_float_GrPixelConfig:
     518             :         case kRG_float_GrPixelConfig:
     519             :         case kUnknown_GrPixelConfig:
     520           0 :             return false;
     521             :     }
     522           0 :     SkFAIL("Invalid pixel config");
     523           0 :     return false;
     524             : }
     525             : 
     526           0 : static inline bool GrPixelConfigIsAlphaOnly(GrPixelConfig config) {
     527           0 :     switch (config) {
     528             :         case kAlpha_8_GrPixelConfig:
     529             :         case kAlpha_half_GrPixelConfig:
     530           0 :             return true;
     531             :         case kUnknown_GrPixelConfig:
     532             :         case kGray_8_GrPixelConfig:
     533             :         case kRGB_565_GrPixelConfig:
     534             :         case kRGBA_4444_GrPixelConfig:
     535             :         case kRGBA_8888_GrPixelConfig:
     536             :         case kBGRA_8888_GrPixelConfig:
     537             :         case kSRGBA_8888_GrPixelConfig:
     538             :         case kSBGRA_8888_GrPixelConfig:
     539             :         case kRGBA_8888_sint_GrPixelConfig:
     540             :         case kETC1_GrPixelConfig:
     541             :         case kRGBA_float_GrPixelConfig:
     542             :         case kRG_float_GrPixelConfig:
     543             :         case kRGBA_half_GrPixelConfig:
     544           0 :             return false;
     545             :     }
     546           0 :     SkFAIL("Invalid pixel config.");
     547           0 :     return false;
     548             : }
     549             : 
     550           0 : static inline bool GrPixelConfigIsFloatingPoint(GrPixelConfig config) {
     551           0 :     switch (config) {
     552             :         case kRGBA_float_GrPixelConfig:
     553             :         case kRG_float_GrPixelConfig:
     554             :         case kAlpha_half_GrPixelConfig:
     555             :         case kRGBA_half_GrPixelConfig:
     556           0 :             return true;
     557             :         case kUnknown_GrPixelConfig:
     558             :         case kAlpha_8_GrPixelConfig:
     559             :         case kGray_8_GrPixelConfig:
     560             :         case kRGB_565_GrPixelConfig:
     561             :         case kRGBA_4444_GrPixelConfig:
     562             :         case kRGBA_8888_GrPixelConfig:
     563             :         case kBGRA_8888_GrPixelConfig:
     564             :         case kSRGBA_8888_GrPixelConfig:
     565             :         case kSBGRA_8888_GrPixelConfig:
     566             :         case kRGBA_8888_sint_GrPixelConfig:
     567             :         case kETC1_GrPixelConfig:
     568           0 :             return false;
     569             :     }
     570           0 :     SkFAIL("Invalid pixel config");
     571           0 :     return false;
     572             : }
     573             : 
     574           0 : static inline bool GrPixelConfigIsSint(GrPixelConfig config) {
     575           0 :     return config == kRGBA_8888_sint_GrPixelConfig;
     576             : }
     577             : 
     578             : /**
     579             :  * Optional bitfield flags that can be set on GrSurfaceDesc (below).
     580             :  */
     581             : enum GrSurfaceFlags {
     582             :     kNone_GrSurfaceFlags            = 0x0,
     583             :     /**
     584             :      * Creates a texture that can be rendered to as a GrRenderTarget. Use
     585             :      * GrTexture::asRenderTarget() to access.
     586             :      */
     587             :     kRenderTarget_GrSurfaceFlag     = 0x1,
     588             :     /**
     589             :      * Placeholder for managing zero-copy textures
     590             :      */
     591             :     kZeroCopy_GrSurfaceFlag         = 0x2,
     592             :     /**
     593             :      * Indicates that all allocations (color buffer, FBO completeness, etc)
     594             :      * should be verified.
     595             :      */
     596             :     kCheckAllocation_GrSurfaceFlag  = 0x4,
     597             : };
     598             : 
     599           0 : GR_MAKE_BITFIELD_OPS(GrSurfaceFlags)
     600             : 
     601             : // opaque type for 3D API object handles
     602             : typedef intptr_t GrBackendObject;
     603             : 
     604             : /**
     605             :  * Some textures will be stored such that the upper and left edges of the content meet at the
     606             :  * the origin (in texture coord space) and for other textures the lower and left edges meet at
     607             :  * the origin. kDefault_GrSurfaceOrigin sets textures to TopLeft, and render targets
     608             :  * to BottomLeft.
     609             :  */
     610             : 
     611             : enum GrSurfaceOrigin {
     612             :     kDefault_GrSurfaceOrigin,         // DEPRECATED; to be removed
     613             :     kTopLeft_GrSurfaceOrigin,
     614             :     kBottomLeft_GrSurfaceOrigin,
     615             : };
     616             : 
     617             : struct GrMipLevel {
     618             :     const void* fPixels;
     619             :     size_t fRowBytes;
     620             : };
     621             : 
     622             : /**
     623             :  * Describes a surface to be created.
     624             :  */
     625             : struct GrSurfaceDesc {
     626           0 :     GrSurfaceDesc()
     627           0 :     : fFlags(kNone_GrSurfaceFlags)
     628             :     , fOrigin(kDefault_GrSurfaceOrigin)
     629             :     , fWidth(0)
     630             :     , fHeight(0)
     631             :     , fConfig(kUnknown_GrPixelConfig)
     632             :     , fSampleCnt(0)
     633           0 :     , fIsMipMapped(false) {
     634           0 :     }
     635             : 
     636             :     GrSurfaceFlags         fFlags;  //!< bitfield of TextureFlags
     637             :     GrSurfaceOrigin        fOrigin; //!< origin of the texture
     638             :     int                    fWidth;  //!< Width of the texture
     639             :     int                    fHeight; //!< Height of the texture
     640             : 
     641             :     /**
     642             :      * Format of source data of the texture. Not guaranteed to be the same as
     643             :      * internal format used by 3D API.
     644             :      */
     645             :     GrPixelConfig          fConfig;
     646             : 
     647             :     /**
     648             :      * The number of samples per pixel or 0 to disable full scene AA. This only
     649             :      * applies if the kRenderTarget_GrSurfaceFlag is set. The actual number
     650             :      * of samples may not exactly match the request. The request will be rounded
     651             :      * up to the next supported sample count, or down if it is larger than the
     652             :      * max supported count.
     653             :      */
     654             :     int                    fSampleCnt;
     655             :     bool                   fIsMipMapped; //!< Indicates if the texture has mipmaps
     656             : };
     657             : 
     658             : // Legacy alias
     659             : typedef GrSurfaceDesc GrTextureDesc;
     660             : 
     661             : /**
     662             :  * Clips are composed from these objects.
     663             :  */
     664             : enum GrClipType {
     665             :     kRect_ClipType,
     666             :     kPath_ClipType
     667             : };
     668             : 
     669             : ///////////////////////////////////////////////////////////////////////////////
     670             : 
     671             : 
     672             : /** Ownership rules for external GPU resources imported into Skia. */
     673             : enum GrWrapOwnership {
     674             :     /** Skia will assume the client will keep the resource alive and Skia will not free it. */
     675             :     kBorrow_GrWrapOwnership,
     676             : 
     677             :     /** Skia will assume ownership of the resource and free it. */
     678             :     kAdopt_GrWrapOwnership,
     679             : 
     680             :     /** Skia will assume ownership of the resource, free it, and reuse it within the cache. */
     681             :     kAdoptAndCache_GrWrapOwnership,
     682             : };
     683             : 
     684             : /**
     685             :  * Gr can wrap an existing texture created by the client with a GrTexture
     686             :  * object. The client is responsible for ensuring that the texture lives at
     687             :  * least as long as the GrTexture object wrapping it. We require the client to
     688             :  * explicitly provide information about the texture, such as width, height,
     689             :  * and pixel config, rather than querying the 3D APIfor these values. We expect
     690             :  * these to be immutable even if the 3D API doesn't require this (OpenGL).
     691             :  *
     692             :  * Textures that are also render targets are supported as well. Gr will manage
     693             :  * any ancillary 3D API (stencil buffer, FBO id, etc) objects necessary for
     694             :  * Gr to draw into the render target. To access the render target object
     695             :  * call GrTexture::asRenderTarget().
     696             :  *
     697             :  * If in addition to the render target flag, the caller also specifies a sample
     698             :  * count Gr will create an MSAA buffer that resolves into the texture. Gr auto-
     699             :  * resolves when it reads from the texture. The client can explictly resolve
     700             :  * using the GrRenderTarget interface.
     701             :  *
     702             :  * Note: These flags currently form a subset of GrTexture's flags.
     703             :  */
     704             : 
     705             : enum GrBackendTextureFlags {
     706             :     /**
     707             :      * No flags enabled
     708             :      */
     709             :     kNone_GrBackendTextureFlag             = 0,
     710             :     /**
     711             :      * Indicates that the texture is also a render target, and thus should have
     712             :      * a GrRenderTarget object.
     713             :      */
     714             :     kRenderTarget_GrBackendTextureFlag     = kRenderTarget_GrSurfaceFlag,
     715             : };
     716           0 : GR_MAKE_BITFIELD_OPS(GrBackendTextureFlags)
     717             : 
     718             : struct GrBackendTextureDesc {
     719           0 :     GrBackendTextureDesc() { memset(this, 0, sizeof(*this)); }
     720             :     GrBackendTextureFlags           fFlags;
     721             :     GrSurfaceOrigin                 fOrigin;
     722             :     int                             fWidth;         //<! width in pixels
     723             :     int                             fHeight;        //<! height in pixels
     724             :     GrPixelConfig                   fConfig;        //<! color format
     725             :     /**
     726             :      * If the render target flag is set and sample count is greater than 0
     727             :      * then Gr will create an MSAA buffer that resolves to the texture.
     728             :      */
     729             :     int                             fSampleCnt;
     730             :     /**
     731             :      * Handle to the 3D API object.
     732             :      * OpenGL: Texture ID.
     733             :      * Vulkan: GrVkImageInfo*
     734             :      */
     735             :     GrBackendObject                 fTextureHandle;
     736             : };
     737             : 
     738             : ///////////////////////////////////////////////////////////////////////////////
     739             : 
     740             : /**
     741             :  * Gr can wrap an existing render target created by the client in the 3D API
     742             :  * with a GrRenderTarget object. The client is responsible for ensuring that the
     743             :  * underlying 3D API object lives at least as long as the GrRenderTarget object
     744             :  * wrapping it. We require the client to explicitly provide information about
     745             :  * the target, such as width, height, and pixel config rather than querying the
     746             :  * 3D API for these values. We expect these properties to be immutable even if
     747             :  * the 3D API doesn't require this (OpenGL).
     748             :  */
     749             : 
     750             : struct GrBackendRenderTargetDesc {
     751             :     GrBackendRenderTargetDesc() { memset(this, 0, sizeof(*this)); }
     752             :     int                             fWidth;         //<! width in pixels
     753             :     int                             fHeight;        //<! height in pixels
     754             :     GrPixelConfig                   fConfig;        //<! color format
     755             :     GrSurfaceOrigin                 fOrigin;        //<! pixel origin
     756             :     /**
     757             :      * The number of samples per pixel. Gr uses this to influence decisions
     758             :      * about applying other forms of anti-aliasing.
     759             :      */
     760             :     int                             fSampleCnt;
     761             :     /**
     762             :      * Number of bits of stencil per-pixel.
     763             :      */
     764             :     int                             fStencilBits;
     765             :     /**
     766             :      * Handle to the 3D API object.
     767             :      * OpenGL: FBO ID
     768             :      * Vulkan: GrVkImageInfo*
     769             :      */
     770             :     GrBackendObject                 fRenderTargetHandle;
     771             : };
     772             : 
     773             : /**
     774             :  * The GrContext's cache of backend context state can be partially invalidated.
     775             :  * These enums are specific to the GL backend and we'd add a new set for an alternative backend.
     776             :  */
     777             : enum GrGLBackendState {
     778             :     kRenderTarget_GrGLBackendState     = 1 << 0,
     779             :     kTextureBinding_GrGLBackendState   = 1 << 1,
     780             :     // View state stands for scissor and viewport
     781             :     kView_GrGLBackendState             = 1 << 2,
     782             :     kBlend_GrGLBackendState            = 1 << 3,
     783             :     kMSAAEnable_GrGLBackendState       = 1 << 4,
     784             :     kVertex_GrGLBackendState           = 1 << 5,
     785             :     kStencil_GrGLBackendState          = 1 << 6,
     786             :     kPixelStore_GrGLBackendState       = 1 << 7,
     787             :     kProgram_GrGLBackendState          = 1 << 8,
     788             :     kFixedFunction_GrGLBackendState    = 1 << 9,
     789             :     kMisc_GrGLBackendState             = 1 << 10,
     790             :     kPathRendering_GrGLBackendState    = 1 << 11,
     791             :     kALL_GrGLBackendState              = 0xffff
     792             : };
     793             : 
     794             : /**
     795             :  * Returns the data size for the given compressed pixel config
     796             :  */
     797           0 : static inline size_t GrCompressedFormatDataSize(GrPixelConfig config,
     798             :                                                 int width, int height) {
     799           0 :     SkASSERT(GrPixelConfigIsCompressed(config));
     800             : 
     801           0 :     switch (config) {
     802             :         case kETC1_GrPixelConfig:
     803           0 :             SkASSERT((width & 3) == 0);
     804           0 :             SkASSERT((height & 3) == 0);
     805           0 :             return (width >> 2) * (height >> 2) * 8;
     806             : 
     807             :         case kUnknown_GrPixelConfig:
     808             :         case kAlpha_8_GrPixelConfig:
     809             :         case kGray_8_GrPixelConfig:
     810             :         case kRGB_565_GrPixelConfig:
     811             :         case kRGBA_4444_GrPixelConfig:
     812             :         case kRGBA_8888_GrPixelConfig:
     813             :         case kBGRA_8888_GrPixelConfig:
     814             :         case kSRGBA_8888_GrPixelConfig:
     815             :         case kSBGRA_8888_GrPixelConfig:
     816             :         case kRGBA_8888_sint_GrPixelConfig:
     817             :         case kRGBA_float_GrPixelConfig:
     818             :         case kRG_float_GrPixelConfig:
     819             :         case kAlpha_half_GrPixelConfig:
     820             :         case kRGBA_half_GrPixelConfig:
     821           0 :             SkFAIL("Unknown compressed pixel config");
     822           0 :             return 4 * width * height;
     823             :     }
     824             : 
     825           0 :     SkFAIL("Invalid pixel config");
     826           0 :     return 4 * width * height;
     827             : }
     828             : 
     829             : /**
     830             :  * This value translates to reseting all the context state for any backend.
     831             :  */
     832             : static const uint32_t kAll_GrBackendState = 0xffffffff;
     833             : 
     834             : #endif

Generated by: LCOV version 1.13