Home | History | Annotate | Download | only in private
      1 /*
      2  * Copyright 2013 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 GrTypesPriv_DEFINED
      9 #define GrTypesPriv_DEFINED
     10 
     11 #include <chrono>
     12 #include "GrSharedEnums.h"
     13 #include "GrTypes.h"
     14 #include "SkCanvas.h"
     15 #include "SkImageInfo.h"
     16 #include "SkImageInfoPriv.h"
     17 #include "SkRefCnt.h"
     18 #include "SkWeakRefCnt.h"
     19 
     20 class GrCaps;
     21 
     22 // The old libstdc++ uses the draft name "monotonic_clock" rather than "steady_clock". This might
     23 // not actually be monotonic, depending on how libstdc++ was built. However, this is only currently
     24 // used for idle resource purging so it shouldn't cause a correctness problem.
     25 #if defined(__GLIBCXX__) && (__GLIBCXX__ < 20130000)
     26 using GrStdSteadyClock = std::chrono::monotonic_clock;
     27 #else
     28 using GrStdSteadyClock = std::chrono::steady_clock;
     29 #endif
     30 
     31 /**
     32  * Pixel configurations. This type conflates texture formats, CPU pixel formats, and
     33  * premultipliedness. We are moving away from it towards SkColorType and backend API (GL, Vulkan)
     34  * texture formats in the public API. Right now this mostly refers to texture formats as we're
     35  * migrating.
     36  */
     37 enum GrPixelConfig {
     38     kUnknown_GrPixelConfig,
     39     kAlpha_8_GrPixelConfig,
     40     kAlpha_8_as_Alpha_GrPixelConfig,
     41     kAlpha_8_as_Red_GrPixelConfig,
     42     kGray_8_GrPixelConfig,
     43     kGray_8_as_Lum_GrPixelConfig,
     44     kGray_8_as_Red_GrPixelConfig,
     45     kRGB_565_GrPixelConfig,
     46     kRGBA_4444_GrPixelConfig,
     47     kRGBA_8888_GrPixelConfig,
     48     kRGB_888_GrPixelConfig,
     49     kRGB_888X_GrPixelConfig,
     50     kRG_88_GrPixelConfig,
     51     kBGRA_8888_GrPixelConfig,
     52     kSRGBA_8888_GrPixelConfig,
     53     kSBGRA_8888_GrPixelConfig,
     54     kRGBA_1010102_GrPixelConfig,
     55     kRGBA_float_GrPixelConfig,
     56     kRG_float_GrPixelConfig,
     57     kAlpha_half_GrPixelConfig,
     58     kAlpha_half_as_Red_GrPixelConfig,
     59     kRGBA_half_GrPixelConfig,
     60     kRGBA_half_Clamped_GrPixelConfig,
     61     kRGB_ETC1_GrPixelConfig,
     62 
     63     kLast_GrPixelConfig = kRGB_ETC1_GrPixelConfig
     64 };
     65 static const int kGrPixelConfigCnt = kLast_GrPixelConfig + 1;
     66 
     67 // Aliases for pixel configs that match skia's byte order.
     68 #ifndef SK_CPU_LENDIAN
     69 #error "Skia gpu currently assumes little endian"
     70 #endif
     71 #if SK_PMCOLOR_BYTE_ORDER(B,G,R,A)
     72 static const GrPixelConfig kSkia8888_GrPixelConfig = kBGRA_8888_GrPixelConfig;
     73 #elif SK_PMCOLOR_BYTE_ORDER(R,G,B,A)
     74 static const GrPixelConfig kSkia8888_GrPixelConfig = kRGBA_8888_GrPixelConfig;
     75 #else
     76     #error "SK_*32_SHIFT values must correspond to GL_BGRA or GL_RGBA format."
     77 #endif
     78 
     79 /**
     80  * Geometric primitives used for drawing.
     81  */
     82 enum class GrPrimitiveType {
     83     kTriangles,
     84     kTriangleStrip,
     85     kPoints,
     86     kLines,          // 1 pix wide only
     87     kLineStrip,      // 1 pix wide only
     88     kLinesAdjacency  // requires geometry shader support.
     89 };
     90 static constexpr int kNumGrPrimitiveTypes = (int)GrPrimitiveType::kLinesAdjacency + 1;
     91 
     92 static constexpr bool GrIsPrimTypeLines(GrPrimitiveType type) {
     93     return GrPrimitiveType::kLines == type ||
     94            GrPrimitiveType::kLineStrip == type ||
     95            GrPrimitiveType::kLinesAdjacency == type;
     96 }
     97 
     98 static constexpr bool GrIsPrimTypeTris(GrPrimitiveType type) {
     99     return GrPrimitiveType::kTriangles == type || GrPrimitiveType::kTriangleStrip == type;
    100 }
    101 
    102 static constexpr bool GrPrimTypeRequiresGeometryShaderSupport(GrPrimitiveType type) {
    103     return GrPrimitiveType::kLinesAdjacency == type;
    104 }
    105 
    106 enum class GrPrimitiveRestart : bool {
    107     kNo = false,
    108     kYes = true
    109 };
    110 
    111 /**
    112  *  Formats for masks, used by the font cache. Important that these are 0-based.
    113  */
    114 enum GrMaskFormat {
    115     kA8_GrMaskFormat,    //!< 1-byte per pixel
    116     kA565_GrMaskFormat,  //!< 2-bytes per pixel, RGB represent 3-channel LCD coverage
    117     kARGB_GrMaskFormat,  //!< 4-bytes per pixel, color format
    118 
    119     kLast_GrMaskFormat = kARGB_GrMaskFormat
    120 };
    121 static const int kMaskFormatCount = kLast_GrMaskFormat + 1;
    122 
    123 /**
    124  *  Return the number of bytes-per-pixel for the specified mask format.
    125  */
    126 static inline int GrMaskFormatBytesPerPixel(GrMaskFormat format) {
    127     SkASSERT(format < kMaskFormatCount);
    128     // kA8   (0) -> 1
    129     // kA565 (1) -> 2
    130     // kARGB (2) -> 4
    131     static const int sBytesPerPixel[] = {1, 2, 4};
    132     static_assert(SK_ARRAY_COUNT(sBytesPerPixel) == kMaskFormatCount, "array_size_mismatch");
    133     static_assert(kA8_GrMaskFormat == 0, "enum_order_dependency");
    134     static_assert(kA565_GrMaskFormat == 1, "enum_order_dependency");
    135     static_assert(kARGB_GrMaskFormat == 2, "enum_order_dependency");
    136 
    137     return sBytesPerPixel[(int)format];
    138 }
    139 
    140 /**
    141  * Optional bitfield flags that can be set on GrSurfaceDesc (below).
    142  */
    143 enum GrSurfaceFlags {
    144     kNone_GrSurfaceFlags = 0x0,
    145     /**
    146      * Creates a texture that can be rendered to as a GrRenderTarget. Use
    147      * GrTexture::asRenderTarget() to access.
    148      */
    149     kRenderTarget_GrSurfaceFlag = 0x1,
    150     /**
    151      * Clears to zero on creation. It will cause creation failure if initial data is supplied to the
    152      * texture. This only affects the base level if the texture is created with MIP levels.
    153      */
    154     kPerformInitialClear_GrSurfaceFlag = 0x2
    155 };
    156 GR_MAKE_BITFIELD_OPS(GrSurfaceFlags)
    157 
    158 typedef GrSurfaceFlags GrSurfaceDescFlags;
    159 
    160 /**
    161  * Describes a surface to be created.
    162  */
    163 struct GrSurfaceDesc {
    164     GrSurfaceDesc()
    165             : fFlags(kNone_GrSurfaceFlags)
    166             , fWidth(0)
    167             , fHeight(0)
    168             , fConfig(kUnknown_GrPixelConfig)
    169             , fSampleCnt(1) {}
    170 
    171     GrSurfaceDescFlags     fFlags;  //!< bitfield of TextureFlags
    172     int                    fWidth;  //!< Width of the texture
    173     int                    fHeight; //!< Height of the texture
    174 
    175     /**
    176      * Format of source data of the texture. Not guaranteed to be the same as
    177      * internal format used by 3D API.
    178      */
    179     GrPixelConfig          fConfig;
    180 
    181     /**
    182      * The number of samples per pixel. Zero is treated equivalently to 1. This only
    183      * applies if the kRenderTarget_GrSurfaceFlag is set. The actual number
    184      * of samples may not exactly match the request. The request will be rounded
    185      * up to the next supported sample count. A value larger than the largest
    186      * supported sample count will fail.
    187      */
    188     int                    fSampleCnt;
    189 };
    190 
    191 /** Ownership rules for external GPU resources imported into Skia. */
    192 enum GrWrapOwnership {
    193     /** Skia will assume the client will keep the resource alive and Skia will not free it. */
    194     kBorrow_GrWrapOwnership,
    195 
    196     /** Skia will assume ownership of the resource and free it. */
    197     kAdopt_GrWrapOwnership,
    198 };
    199 
    200 enum class GrWrapCacheable : bool {
    201     /**
    202      * The wrapped resource will be removed from the cache as soon as it becomes purgeable. It may
    203      * still be assigned and found by a unique key, but the presence of the key will not be used to
    204      * keep the resource alive when it has no references.
    205      */
    206     kNo = false,
    207     /**
    208      * The wrapped resource is allowed to remain in the GrResourceCache when it has no references
    209      * but has a unique key. Such resources should only be given unique keys when it is known that
    210      * the key will eventually be removed from the resource or invalidated via the message bus.
    211      */
    212     kYes = true
    213 };
    214 
    215 enum class GrBudgetedType : uint8_t {
    216     /** The resource is budgeted and is subject to purging under budget pressure. */
    217     kBudgeted,
    218     /**
    219      * The resource is unbudgeted and is purged as soon as it has no refs regardless of whether
    220      * it has a unique or scratch key.
    221      */
    222     kUnbudgetedUncacheable,
    223     /**
    224      * The resource is unbudgeted and is allowed to remain in the cache with no refs if it
    225      * has a unique key. Scratch keys are ignored.
    226      */
    227     kUnbudgetedCacheable,
    228 };
    229 
    230 /**
    231  * Clips are composed from these objects.
    232  */
    233 enum GrClipType {
    234     kRect_ClipType,
    235     kPath_ClipType
    236 };
    237 
    238 enum class GrScissorTest : bool {
    239     kDisabled = false,
    240     kEnabled = true
    241 };
    242 
    243 struct GrMipLevel {
    244     const void* fPixels = nullptr;
    245     size_t fRowBytes = 0;
    246 };
    247 
    248 /**
    249  * This enum is used to specify the load operation to be used when an opList/GrGpuCommandBuffer
    250  * begins execution.
    251  */
    252 enum class GrLoadOp {
    253     kLoad,
    254     kClear,
    255     kDiscard,
    256 };
    257 
    258 /**
    259  * This enum is used to specify the store operation to be used when an opList/GrGpuCommandBuffer
    260  * ends execution.
    261  */
    262 enum class GrStoreOp {
    263     kStore,
    264     kDiscard,
    265 };
    266 
    267 /**
    268  * Used to control antialiasing in draw calls.
    269  */
    270 enum class GrAA : bool {
    271     kNo = false,
    272     kYes = true
    273 };
    274 
    275 /** This enum indicates the type of antialiasing to be performed. */
    276 enum class GrAAType : unsigned {
    277     /** No antialiasing */
    278     kNone,
    279     /** Use fragment shader code to compute a fractional pixel coverage. */
    280     kCoverage,
    281     /** Use normal MSAA. */
    282     kMSAA,
    283     /**
    284      * Use "mixed samples" MSAA such that the stencil buffer is multisampled but the color buffer is
    285      * not.
    286      */
    287     kMixedSamples
    288 };
    289 
    290 static inline bool GrAATypeIsHW(GrAAType type) {
    291     switch (type) {
    292         case GrAAType::kNone:
    293             return false;
    294         case GrAAType::kCoverage:
    295             return false;
    296         case GrAAType::kMSAA:
    297             return true;
    298         case GrAAType::kMixedSamples:
    299             return true;
    300     }
    301     SK_ABORT("Unknown AA Type");
    302     return false;
    303 }
    304 
    305 /** The type of full scene antialiasing supported by a render target. */
    306 enum class GrFSAAType {
    307     /** No FSAA */
    308     kNone,
    309     /** Regular MSAA where each attachment has the same sample count. */
    310     kUnifiedMSAA,
    311     /** One color sample, N stencil samples. */
    312     kMixedSamples,
    313 };
    314 
    315 /**
    316  * Not all drawing code paths support using mixed samples when available and instead use
    317  * coverage-based aa.
    318  */
    319 enum class GrAllowMixedSamples : bool { kNo = false, kYes = true };
    320 
    321 GrAAType GrChooseAAType(GrAA, GrFSAAType, GrAllowMixedSamples, const GrCaps&);
    322 
    323 /*
    324  * Some pixel configs are inherently clamped to [0,1], some are allowed to go outside that range,
    325  * and some are FP but manually clamped in the XP.
    326  */
    327 enum class GrClampType {
    328     kAuto,    // Normalized, fixed-point configs
    329     kManual,  // Clamped FP configs
    330     kNone,    // Normal (unclamped) FP configs
    331 };
    332 
    333 /**
    334  * A number of rectangle/quadrilateral drawing APIs can control anti-aliasing on a per edge basis.
    335  * These masks specify which edges are AA'ed. The intent for this is to support tiling with seamless
    336  * boundaries, where the inner edges are non-AA and the outer edges are AA. Regular draws (where AA
    337  * is specified by GrAA) is almost equivalent to kNone or kAll, with the exception of how MSAA is
    338  * handled.
    339  *
    340  * When tiling and there is MSAA, mixed edge rectangles are processed with MSAA, so in order for the
    341  * tiled edges to remain seamless, inner tiles with kNone must also be processed with MSAA. In
    342  * regular drawing, however, kNone should disable MSAA (if it's supported) to match the expected
    343  * appearance.
    344  *
    345  * Therefore, APIs that use per-edge AA flags also take a GrAA value so that they can differentiate
    346  * between the regular and tiling use case behaviors. Tiling operations should always pass
    347  * GrAA::kYes while regular options should pass GrAA based on the SkPaint's anti-alias state.
    348  */
    349 enum class GrQuadAAFlags {
    350     kLeft   = SkCanvas::kLeft_QuadAAFlag,
    351     kTop    = SkCanvas::kTop_QuadAAFlag,
    352     kRight  = SkCanvas::kRight_QuadAAFlag,
    353     kBottom = SkCanvas::kBottom_QuadAAFlag,
    354 
    355     kNone = SkCanvas::kNone_QuadAAFlags,
    356     kAll  = SkCanvas::kAll_QuadAAFlags
    357 };
    358 
    359 GR_MAKE_BITFIELD_CLASS_OPS(GrQuadAAFlags)
    360 
    361 static inline GrQuadAAFlags SkToGrQuadAAFlags(unsigned flags) {
    362     return static_cast<GrQuadAAFlags>(flags);
    363 }
    364 
    365 /**
    366  * Types of shader-language-specific boxed variables we can create.
    367  */
    368 enum GrSLType {
    369     kVoid_GrSLType,
    370     kBool_GrSLType,
    371     kByte_GrSLType,
    372     kByte2_GrSLType,
    373     kByte3_GrSLType,
    374     kByte4_GrSLType,
    375     kUByte_GrSLType,
    376     kUByte2_GrSLType,
    377     kUByte3_GrSLType,
    378     kUByte4_GrSLType,
    379     kShort_GrSLType,
    380     kShort2_GrSLType,
    381     kShort3_GrSLType,
    382     kShort4_GrSLType,
    383     kUShort_GrSLType,
    384     kUShort2_GrSLType,
    385     kUShort3_GrSLType,
    386     kUShort4_GrSLType,
    387     kFloat_GrSLType,
    388     kFloat2_GrSLType,
    389     kFloat3_GrSLType,
    390     kFloat4_GrSLType,
    391     kFloat2x2_GrSLType,
    392     kFloat3x3_GrSLType,
    393     kFloat4x4_GrSLType,
    394     kHalf_GrSLType,
    395     kHalf2_GrSLType,
    396     kHalf3_GrSLType,
    397     kHalf4_GrSLType,
    398     kHalf2x2_GrSLType,
    399     kHalf3x3_GrSLType,
    400     kHalf4x4_GrSLType,
    401     kInt_GrSLType,
    402     kInt2_GrSLType,
    403     kInt3_GrSLType,
    404     kInt4_GrSLType,
    405     kUint_GrSLType,
    406     kUint2_GrSLType,
    407     kTexture2DSampler_GrSLType,
    408     kTextureExternalSampler_GrSLType,
    409     kTexture2DRectSampler_GrSLType,
    410 
    411     kLast_GrSLType = kTexture2DRectSampler_GrSLType
    412 };
    413 static const int kGrSLTypeCount = kLast_GrSLType + 1;
    414 
    415 /**
    416  * The type of texture. Backends other than GL currently only use the 2D value but the type must
    417  * still be known at the API-neutral layer as it used to determine whether MIP maps, renderability,
    418  * and sampling parameters are legal for proxies that will be instantiated with wrapped textures.
    419  */
    420 enum class GrTextureType {
    421     k2D,
    422     /* Rectangle uses unnormalized texture coordinates. */
    423     kRectangle,
    424     kExternal
    425 };
    426 
    427 enum GrShaderType {
    428     kVertex_GrShaderType,
    429     kGeometry_GrShaderType,
    430     kFragment_GrShaderType,
    431 
    432     kLastkFragment_GrShaderType = kFragment_GrShaderType
    433 };
    434 static const int kGrShaderTypeCount = kLastkFragment_GrShaderType + 1;
    435 
    436 enum GrShaderFlags {
    437     kNone_GrShaderFlags = 0,
    438     kVertex_GrShaderFlag = 1 << kVertex_GrShaderType,
    439     kGeometry_GrShaderFlag = 1 << kGeometry_GrShaderType,
    440     kFragment_GrShaderFlag = 1 << kFragment_GrShaderType
    441 };
    442 GR_MAKE_BITFIELD_OPS(GrShaderFlags)
    443 
    444 /**
    445  * Precisions of shader language variables. Not all shading languages support precisions or actually
    446  * vary the internal precision based on the qualifiers. These currently only apply to float types (
    447  * including float vectors and matrices).
    448  */
    449 enum GrSLPrecision : int {
    450     kLow_GrSLPrecision,
    451     kMedium_GrSLPrecision,
    452     kHigh_GrSLPrecision,
    453 
    454     // Default precision is a special tag that means "whatever the default for the program/type
    455     // combination is". In other words, it maps to the empty string in shader code. There are some
    456     // scenarios where kDefault is not allowed (as the default precision for a program, or for
    457     // varyings, for example).
    458     kDefault_GrSLPrecision,
    459 
    460     // We only consider the "real" precisions here
    461     kLast_GrSLPrecision = kHigh_GrSLPrecision,
    462 };
    463 
    464 static const int kGrSLPrecisionCount = kLast_GrSLPrecision + 1;
    465 
    466 /** Is the shading language type float (including vectors/matrices)? */
    467 static inline bool GrSLTypeIsFloatType(GrSLType type) {
    468     switch (type) {
    469         case kFloat_GrSLType:
    470         case kFloat2_GrSLType:
    471         case kFloat3_GrSLType:
    472         case kFloat4_GrSLType:
    473         case kFloat2x2_GrSLType:
    474         case kFloat3x3_GrSLType:
    475         case kFloat4x4_GrSLType:
    476         case kHalf_GrSLType:
    477         case kHalf2_GrSLType:
    478         case kHalf3_GrSLType:
    479         case kHalf4_GrSLType:
    480         case kHalf2x2_GrSLType:
    481         case kHalf3x3_GrSLType:
    482         case kHalf4x4_GrSLType:
    483             return true;
    484 
    485         case kVoid_GrSLType:
    486         case kTexture2DSampler_GrSLType:
    487         case kTextureExternalSampler_GrSLType:
    488         case kTexture2DRectSampler_GrSLType:
    489         case kBool_GrSLType:
    490         case kByte_GrSLType:
    491         case kByte2_GrSLType:
    492         case kByte3_GrSLType:
    493         case kByte4_GrSLType:
    494         case kUByte_GrSLType:
    495         case kUByte2_GrSLType:
    496         case kUByte3_GrSLType:
    497         case kUByte4_GrSLType:
    498         case kShort_GrSLType:
    499         case kShort2_GrSLType:
    500         case kShort3_GrSLType:
    501         case kShort4_GrSLType:
    502         case kUShort_GrSLType:
    503         case kUShort2_GrSLType:
    504         case kUShort3_GrSLType:
    505         case kUShort4_GrSLType:
    506         case kInt_GrSLType:
    507         case kInt2_GrSLType:
    508         case kInt3_GrSLType:
    509         case kInt4_GrSLType:
    510         case kUint_GrSLType:
    511         case kUint2_GrSLType:
    512             return false;
    513     }
    514     SK_ABORT("Unexpected type");
    515     return false;
    516 }
    517 
    518 /** If the type represents a single value or vector return the vector length, else -1. */
    519 static inline int GrSLTypeVecLength(GrSLType type) {
    520     switch (type) {
    521         case kFloat_GrSLType:
    522         case kHalf_GrSLType:
    523         case kBool_GrSLType:
    524         case kByte_GrSLType:
    525         case kUByte_GrSLType:
    526         case kShort_GrSLType:
    527         case kUShort_GrSLType:
    528         case kInt_GrSLType:
    529         case kUint_GrSLType:
    530             return 1;
    531 
    532         case kFloat2_GrSLType:
    533         case kHalf2_GrSLType:
    534         case kByte2_GrSLType:
    535         case kUByte2_GrSLType:
    536         case kShort2_GrSLType:
    537         case kUShort2_GrSLType:
    538         case kInt2_GrSLType:
    539         case kUint2_GrSLType:
    540             return 2;
    541 
    542         case kFloat3_GrSLType:
    543         case kHalf3_GrSLType:
    544         case kByte3_GrSLType:
    545         case kUByte3_GrSLType:
    546         case kShort3_GrSLType:
    547         case kUShort3_GrSLType:
    548         case kInt3_GrSLType:
    549             return 3;
    550 
    551         case kFloat4_GrSLType:
    552         case kHalf4_GrSLType:
    553         case kByte4_GrSLType:
    554         case kUByte4_GrSLType:
    555         case kShort4_GrSLType:
    556         case kUShort4_GrSLType:
    557         case kInt4_GrSLType:
    558             return 4;
    559 
    560         case kFloat2x2_GrSLType:
    561         case kFloat3x3_GrSLType:
    562         case kFloat4x4_GrSLType:
    563         case kHalf2x2_GrSLType:
    564         case kHalf3x3_GrSLType:
    565         case kHalf4x4_GrSLType:
    566         case kVoid_GrSLType:
    567         case kTexture2DSampler_GrSLType:
    568         case kTextureExternalSampler_GrSLType:
    569         case kTexture2DRectSampler_GrSLType:
    570             return -1;
    571     }
    572     SK_ABORT("Unexpected type");
    573     return -1;
    574 }
    575 
    576 static inline GrSLType GrSLCombinedSamplerTypeForTextureType(GrTextureType type) {
    577     switch (type) {
    578         case GrTextureType::k2D:
    579             return kTexture2DSampler_GrSLType;
    580         case GrTextureType::kRectangle:
    581             return kTexture2DRectSampler_GrSLType;
    582         case GrTextureType::kExternal:
    583             return kTextureExternalSampler_GrSLType;
    584     }
    585     SK_ABORT("Unexpected texture type");
    586     return kTexture2DSampler_GrSLType;
    587 }
    588 
    589 /** Rectangle and external textures ony support the clamp wrap mode and do not support MIP maps. */
    590 static inline bool GrTextureTypeHasRestrictedSampling(GrTextureType type) {
    591     switch (type) {
    592         case GrTextureType::k2D:
    593             return false;
    594         case GrTextureType::kRectangle:
    595             return true;
    596         case GrTextureType::kExternal:
    597             return true;
    598     }
    599     SK_ABORT("Unexpected texture type");
    600     return false;
    601 }
    602 
    603 static inline bool GrSLTypeIsCombinedSamplerType(GrSLType type) {
    604     switch (type) {
    605         case kTexture2DSampler_GrSLType:
    606         case kTextureExternalSampler_GrSLType:
    607         case kTexture2DRectSampler_GrSLType:
    608             return true;
    609 
    610         case kVoid_GrSLType:
    611         case kFloat_GrSLType:
    612         case kFloat2_GrSLType:
    613         case kFloat3_GrSLType:
    614         case kFloat4_GrSLType:
    615         case kFloat2x2_GrSLType:
    616         case kFloat3x3_GrSLType:
    617         case kFloat4x4_GrSLType:
    618         case kHalf_GrSLType:
    619         case kHalf2_GrSLType:
    620         case kHalf3_GrSLType:
    621         case kHalf4_GrSLType:
    622         case kHalf2x2_GrSLType:
    623         case kHalf3x3_GrSLType:
    624         case kHalf4x4_GrSLType:
    625         case kInt_GrSLType:
    626         case kInt2_GrSLType:
    627         case kInt3_GrSLType:
    628         case kInt4_GrSLType:
    629         case kUint_GrSLType:
    630         case kUint2_GrSLType:
    631         case kBool_GrSLType:
    632         case kByte_GrSLType:
    633         case kByte2_GrSLType:
    634         case kByte3_GrSLType:
    635         case kByte4_GrSLType:
    636         case kUByte_GrSLType:
    637         case kUByte2_GrSLType:
    638         case kUByte3_GrSLType:
    639         case kUByte4_GrSLType:
    640         case kShort_GrSLType:
    641         case kShort2_GrSLType:
    642         case kShort3_GrSLType:
    643         case kShort4_GrSLType:
    644         case kUShort_GrSLType:
    645         case kUShort2_GrSLType:
    646         case kUShort3_GrSLType:
    647         case kUShort4_GrSLType:
    648             return false;
    649     }
    650     SK_ABORT("Unexpected type");
    651     return false;
    652 }
    653 
    654 //////////////////////////////////////////////////////////////////////////////
    655 
    656 /**
    657  * Types used to describe format of vertices in arrays.
    658  */
    659 enum GrVertexAttribType {
    660     kFloat_GrVertexAttribType = 0,
    661     kFloat2_GrVertexAttribType,
    662     kFloat3_GrVertexAttribType,
    663     kFloat4_GrVertexAttribType,
    664     kHalf_GrVertexAttribType,
    665     kHalf2_GrVertexAttribType,
    666     kHalf3_GrVertexAttribType,
    667     kHalf4_GrVertexAttribType,
    668 
    669     kInt2_GrVertexAttribType,   // vector of 2 32-bit ints
    670     kInt3_GrVertexAttribType,   // vector of 3 32-bit ints
    671     kInt4_GrVertexAttribType,   // vector of 4 32-bit ints
    672 
    673 
    674     kByte_GrVertexAttribType,  // signed byte
    675     kByte2_GrVertexAttribType, // vector of 2 8-bit signed bytes
    676     kByte3_GrVertexAttribType, // vector of 3 8-bit signed bytes
    677     kByte4_GrVertexAttribType, // vector of 4 8-bit signed bytes
    678     kUByte_GrVertexAttribType,  // unsigned byte
    679     kUByte2_GrVertexAttribType, // vector of 2 8-bit unsigned bytes
    680     kUByte3_GrVertexAttribType, // vector of 3 8-bit unsigned bytes
    681     kUByte4_GrVertexAttribType, // vector of 4 8-bit unsigned bytes
    682 
    683     kUByte_norm_GrVertexAttribType,  // unsigned byte, e.g. coverage, 0 -> 0.0f, 255 -> 1.0f.
    684     kUByte4_norm_GrVertexAttribType, // vector of 4 unsigned bytes, e.g. colors, 0 -> 0.0f,
    685                                      // 255 -> 1.0f.
    686 
    687     kShort2_GrVertexAttribType,       // vector of 2 16-bit shorts.
    688     kShort4_GrVertexAttribType,       // vector of 4 16-bit shorts.
    689 
    690     kUShort2_GrVertexAttribType,      // vector of 2 unsigned shorts. 0 -> 0, 65535 -> 65535.
    691     kUShort2_norm_GrVertexAttribType, // vector of 2 unsigned shorts. 0 -> 0.0f, 65535 -> 1.0f.
    692 
    693     kInt_GrVertexAttribType,
    694     kUint_GrVertexAttribType,
    695 
    696     kLast_GrVertexAttribType = kUint_GrVertexAttribType
    697 };
    698 static const int kGrVertexAttribTypeCount = kLast_GrVertexAttribType + 1;
    699 
    700 //////////////////////////////////////////////////////////////////////////////
    701 
    702 static const int kGrClipEdgeTypeCnt = (int) GrClipEdgeType::kLast + 1;
    703 
    704 static inline bool GrProcessorEdgeTypeIsFill(const GrClipEdgeType edgeType) {
    705     return (GrClipEdgeType::kFillAA == edgeType || GrClipEdgeType::kFillBW == edgeType);
    706 }
    707 
    708 static inline bool GrProcessorEdgeTypeIsInverseFill(const GrClipEdgeType edgeType) {
    709     return (GrClipEdgeType::kInverseFillAA == edgeType ||
    710             GrClipEdgeType::kInverseFillBW == edgeType);
    711 }
    712 
    713 static inline bool GrProcessorEdgeTypeIsAA(const GrClipEdgeType edgeType) {
    714     return (GrClipEdgeType::kFillBW != edgeType &&
    715             GrClipEdgeType::kInverseFillBW != edgeType);
    716 }
    717 
    718 static inline GrClipEdgeType GrInvertProcessorEdgeType(const GrClipEdgeType edgeType) {
    719     switch (edgeType) {
    720         case GrClipEdgeType::kFillBW:
    721             return GrClipEdgeType::kInverseFillBW;
    722         case GrClipEdgeType::kFillAA:
    723             return GrClipEdgeType::kInverseFillAA;
    724         case GrClipEdgeType::kInverseFillBW:
    725             return GrClipEdgeType::kFillBW;
    726         case GrClipEdgeType::kInverseFillAA:
    727             return GrClipEdgeType::kFillAA;
    728         case GrClipEdgeType::kHairlineAA:
    729             SK_ABORT("Hairline fill isn't invertible.");
    730     }
    731     return GrClipEdgeType::kFillAA;  // suppress warning.
    732 }
    733 
    734 /**
    735  * Indicates the type of pending IO operations that can be recorded for gpu resources.
    736  */
    737 enum GrIOType {
    738     kRead_GrIOType,
    739     kWrite_GrIOType,
    740     kRW_GrIOType
    741 };
    742 
    743 /**
    744  * Indicates the type of data that a GPU buffer will be used for.
    745  */
    746 enum class GrGpuBufferType {
    747     kVertex,
    748     kIndex,
    749     kXferCpuToGpu,
    750     kXferGpuToCpu,
    751 };
    752 static const int kGrGpuBufferTypeCount = static_cast<int>(GrGpuBufferType::kXferGpuToCpu) + 1;
    753 
    754 /**
    755  * Provides a performance hint regarding the frequency at which a data store will be accessed.
    756  */
    757 enum GrAccessPattern {
    758     /** Data store will be respecified repeatedly and used many times. */
    759     kDynamic_GrAccessPattern,
    760     /** Data store will be specified once and used many times. (Thus disqualified from caching.) */
    761     kStatic_GrAccessPattern,
    762     /** Data store will be specified once and used at most a few times. (Also can't be cached.) */
    763     kStream_GrAccessPattern,
    764 
    765     kLast_GrAccessPattern = kStream_GrAccessPattern
    766 };
    767 
    768 // Flags shared between the GrSurface & GrSurfaceProxy class hierarchies
    769 enum class GrInternalSurfaceFlags {
    770     kNone                           = 0,
    771 
    772     // Surface-level
    773 
    774     kNoPendingIO                    = 1 << 0,
    775 
    776     kSurfaceMask                    = kNoPendingIO,
    777 
    778     // Texture-level
    779 
    780     // Means the pixels in the texture are read-only. Cannot also be a GrRenderTarget[Proxy].
    781     kReadOnly                       = 1 << 1,
    782 
    783     kTextureMask                    = kReadOnly,
    784 
    785     // RT-level
    786 
    787     // For internal resources:
    788     //    this is enabled whenever MSAA is enabled and GrCaps reports mixed samples are supported
    789     // For wrapped resources:
    790     //    this is disabled for FBO0
    791     //    but, otherwise, is enabled whenever MSAA is enabled and GrCaps reports mixed samples
    792     //        are supported
    793     kMixedSampled                   = 1 << 2,
    794 
    795     // This flag is for use with GL only. It tells us that the internal render target wraps FBO 0.
    796     kGLRTFBOIDIs0                   = 1 << 3,
    797 
    798     kRenderTargetMask               = kMixedSampled | kGLRTFBOIDIs0,
    799 };
    800 GR_MAKE_BITFIELD_CLASS_OPS(GrInternalSurfaceFlags)
    801 
    802 #ifdef SK_DEBUG
    803 // Takes a pointer to a GrCaps, and will suppress prints if required
    804 #define GrCapsDebugf(caps, ...)  if (!(caps)->suppressPrints()) SkDebugf(__VA_ARGS__)
    805 #else
    806 #define GrCapsDebugf(caps, ...) do {} while (0)
    807 #endif
    808 
    809 /**
    810  * Specifies if the holder owns the backend, OpenGL or Vulkan, object.
    811  */
    812 enum class GrBackendObjectOwnership : bool {
    813     /** Holder does not destroy the backend object. */
    814     kBorrowed = false,
    815     /** Holder destroys the backend object. */
    816     kOwned = true
    817 };
    818 
    819 template <typename T>
    820 T* const* unique_ptr_address_as_pointer_address(std::unique_ptr<T> const* up) {
    821     static_assert(sizeof(T*) == sizeof(std::unique_ptr<T>), "unique_ptr not expected size.");
    822     return reinterpret_cast<T* const*>(up);
    823 }
    824 
    825 /*
    826  * Object for CPU-GPU synchronization
    827  */
    828 typedef uint64_t GrFence;
    829 
    830 /**
    831  * Used to include or exclude specific GPU path renderers for testing purposes.
    832  */
    833 enum class GpuPathRenderers {
    834     kNone              = 0, // Always use sofware masks and/or GrDefaultPathRenderer.
    835     kDashLine          = 1 << 0,
    836     kStencilAndCover   = 1 << 1,
    837     kCoverageCounting  = 1 << 2,
    838     kAAHairline        = 1 << 3,
    839     kAAConvex          = 1 << 4,
    840     kAALinearizing     = 1 << 5,
    841     kSmall             = 1 << 6,
    842     kTessellating      = 1 << 7,
    843 
    844     kAll               = (kTessellating | (kTessellating - 1))
    845 };
    846 
    847 /**
    848  * Used to describe the current state of Mips on a GrTexture
    849  */
    850 enum class  GrMipMapsStatus {
    851     kNotAllocated, // Mips have not been allocated
    852     kDirty,        // Mips are allocated but the full mip tree does not have valid data
    853     kValid,        // All levels fully allocated and have valid data in them
    854 };
    855 
    856 GR_MAKE_BITFIELD_CLASS_OPS(GpuPathRenderers)
    857 
    858 /**
    859  * Refers to the encoding of a GPU buffer as it will be interpreted by the GPU when sampling and
    860  * blending.
    861  */
    862 enum class GrSRGBEncoded : bool { kNo = false, kYes = true };
    863 
    864 /**
    865  * Describes whether pixel data encoding should be converted to/from linear/sRGB encoding.
    866  */
    867 enum class GrSRGBConversion {
    868     kNone,
    869     kSRGBToLinear,
    870     kLinearToSRGB,
    871 };
    872 
    873 /**
    874  * Utility functions for GrPixelConfig
    875  */
    876 
    877 // Returns whether the config's color channels are sRGB encoded.
    878 static inline GrSRGBEncoded GrPixelConfigIsSRGBEncoded(GrPixelConfig config) {
    879     switch (config) {
    880         case kSRGBA_8888_GrPixelConfig:
    881         case kSBGRA_8888_GrPixelConfig:
    882             return GrSRGBEncoded::kYes;
    883         case kUnknown_GrPixelConfig:
    884         case kAlpha_8_GrPixelConfig:
    885         case kAlpha_8_as_Alpha_GrPixelConfig:
    886         case kAlpha_8_as_Red_GrPixelConfig:
    887         case kGray_8_GrPixelConfig:
    888         case kGray_8_as_Lum_GrPixelConfig:
    889         case kGray_8_as_Red_GrPixelConfig:
    890         case kRGB_565_GrPixelConfig:
    891         case kRGBA_4444_GrPixelConfig:
    892         case kRGB_888_GrPixelConfig:
    893         case kRGB_888X_GrPixelConfig:
    894         case kRG_88_GrPixelConfig:
    895         case kRGBA_8888_GrPixelConfig:
    896         case kBGRA_8888_GrPixelConfig:
    897         case kRGBA_1010102_GrPixelConfig:
    898         case kRGBA_float_GrPixelConfig:
    899         case kRG_float_GrPixelConfig:
    900         case kAlpha_half_GrPixelConfig:
    901         case kAlpha_half_as_Red_GrPixelConfig:
    902         case kRGBA_half_GrPixelConfig:
    903         case kRGBA_half_Clamped_GrPixelConfig:
    904         case kRGB_ETC1_GrPixelConfig:
    905             return GrSRGBEncoded::kNo;
    906     }
    907     SK_ABORT("Invalid pixel config");
    908     return GrSRGBEncoded::kNo;
    909 }
    910 
    911 static inline bool GrPixelConfigIsSRGB(GrPixelConfig config) {
    912     return GrSRGBEncoded::kYes == GrPixelConfigIsSRGBEncoded(config);
    913 }
    914 
    915 static inline size_t GrBytesPerPixel(GrPixelConfig config) {
    916     switch (config) {
    917         case kAlpha_8_GrPixelConfig:
    918         case kAlpha_8_as_Alpha_GrPixelConfig:
    919         case kAlpha_8_as_Red_GrPixelConfig:
    920         case kGray_8_GrPixelConfig:
    921         case kGray_8_as_Lum_GrPixelConfig:
    922         case kGray_8_as_Red_GrPixelConfig:
    923             return 1;
    924         case kRGB_565_GrPixelConfig:
    925         case kRGBA_4444_GrPixelConfig:
    926         case kRG_88_GrPixelConfig:
    927         case kAlpha_half_GrPixelConfig:
    928         case kAlpha_half_as_Red_GrPixelConfig:
    929             return 2;
    930         case kRGBA_8888_GrPixelConfig:
    931         case kRGB_888_GrPixelConfig:  // Assuming GPUs store this 4-byte aligned.
    932         case kRGB_888X_GrPixelConfig:
    933         case kBGRA_8888_GrPixelConfig:
    934         case kSRGBA_8888_GrPixelConfig:
    935         case kSBGRA_8888_GrPixelConfig:
    936         case kRGBA_1010102_GrPixelConfig:
    937             return 4;
    938         case kRGBA_half_GrPixelConfig:
    939         case kRGBA_half_Clamped_GrPixelConfig:
    940             return 8;
    941         case kRGBA_float_GrPixelConfig:
    942             return 16;
    943         case kRG_float_GrPixelConfig:
    944             return 8;
    945         case kUnknown_GrPixelConfig:
    946         case kRGB_ETC1_GrPixelConfig:
    947             return 0;
    948     }
    949     SK_ABORT("Invalid pixel config");
    950     return 0;
    951 }
    952 
    953 static inline bool GrPixelConfigIsOpaque(GrPixelConfig config) {
    954     switch (config) {
    955         case kRGB_565_GrPixelConfig:
    956         case kRGB_888_GrPixelConfig:
    957         case kRGB_888X_GrPixelConfig:
    958         case kRG_88_GrPixelConfig:
    959         case kGray_8_GrPixelConfig:
    960         case kGray_8_as_Lum_GrPixelConfig:
    961         case kGray_8_as_Red_GrPixelConfig:
    962         case kRG_float_GrPixelConfig:
    963         case kRGB_ETC1_GrPixelConfig:
    964             return true;
    965         case kAlpha_8_GrPixelConfig:
    966         case kAlpha_8_as_Alpha_GrPixelConfig:
    967         case kAlpha_8_as_Red_GrPixelConfig:
    968         case kRGBA_4444_GrPixelConfig:
    969         case kAlpha_half_GrPixelConfig:
    970         case kAlpha_half_as_Red_GrPixelConfig:
    971         case kRGBA_8888_GrPixelConfig:
    972         case kBGRA_8888_GrPixelConfig:
    973         case kSRGBA_8888_GrPixelConfig:
    974         case kSBGRA_8888_GrPixelConfig:
    975         case kRGBA_1010102_GrPixelConfig:
    976         case kRGBA_half_GrPixelConfig:
    977         case kRGBA_half_Clamped_GrPixelConfig:
    978         case kRGBA_float_GrPixelConfig:
    979         case kUnknown_GrPixelConfig:
    980             return false;
    981     }
    982     SK_ABORT("Invalid pixel config");
    983     return false;
    984 }
    985 
    986 static inline bool GrPixelConfigIsAlphaOnly(GrPixelConfig config) {
    987     switch (config) {
    988         case kAlpha_8_GrPixelConfig:
    989         case kAlpha_8_as_Alpha_GrPixelConfig:
    990         case kAlpha_8_as_Red_GrPixelConfig:
    991         case kAlpha_half_GrPixelConfig:
    992         case kAlpha_half_as_Red_GrPixelConfig:
    993             return true;
    994         case kUnknown_GrPixelConfig:
    995         case kGray_8_GrPixelConfig:
    996         case kGray_8_as_Lum_GrPixelConfig:
    997         case kGray_8_as_Red_GrPixelConfig:
    998         case kRGB_565_GrPixelConfig:
    999         case kRGBA_4444_GrPixelConfig:
   1000         case kRGBA_8888_GrPixelConfig:
   1001         case kRGB_888_GrPixelConfig:
   1002         case kRGB_888X_GrPixelConfig:
   1003         case kRG_88_GrPixelConfig:
   1004         case kBGRA_8888_GrPixelConfig:
   1005         case kSRGBA_8888_GrPixelConfig:
   1006         case kSBGRA_8888_GrPixelConfig:
   1007         case kRGBA_1010102_GrPixelConfig:
   1008         case kRGBA_float_GrPixelConfig:
   1009         case kRG_float_GrPixelConfig:
   1010         case kRGBA_half_GrPixelConfig:
   1011         case kRGBA_half_Clamped_GrPixelConfig:
   1012         case kRGB_ETC1_GrPixelConfig:
   1013             return false;
   1014     }
   1015     SK_ABORT("Invalid pixel config.");
   1016     return false;
   1017 }
   1018 
   1019 static inline bool GrPixelConfigIsFloatingPoint(GrPixelConfig config) {
   1020     switch (config) {
   1021         case kUnknown_GrPixelConfig:
   1022         case kAlpha_8_GrPixelConfig:
   1023         case kAlpha_8_as_Alpha_GrPixelConfig:
   1024         case kAlpha_8_as_Red_GrPixelConfig:
   1025         case kGray_8_GrPixelConfig:
   1026         case kGray_8_as_Lum_GrPixelConfig:
   1027         case kGray_8_as_Red_GrPixelConfig:
   1028         case kRGB_565_GrPixelConfig:
   1029         case kRGBA_4444_GrPixelConfig:
   1030         case kRGB_888_GrPixelConfig:
   1031         case kRGB_888X_GrPixelConfig:
   1032         case kRG_88_GrPixelConfig:
   1033         case kRGBA_8888_GrPixelConfig:
   1034         case kBGRA_8888_GrPixelConfig:
   1035         case kSRGBA_8888_GrPixelConfig:
   1036         case kSBGRA_8888_GrPixelConfig:
   1037         case kRGBA_1010102_GrPixelConfig:
   1038         case kRGB_ETC1_GrPixelConfig:
   1039             return false;
   1040         case kRGBA_float_GrPixelConfig:
   1041         case kRG_float_GrPixelConfig:
   1042         case kAlpha_half_GrPixelConfig:
   1043         case kAlpha_half_as_Red_GrPixelConfig:
   1044         case kRGBA_half_GrPixelConfig:
   1045         case kRGBA_half_Clamped_GrPixelConfig:
   1046             return true;
   1047     }
   1048     SK_ABORT("Invalid pixel config.");
   1049     return false;
   1050 }
   1051 
   1052 static inline GrClampType GrPixelConfigClampType(GrPixelConfig config) {
   1053     if (!GrPixelConfigIsFloatingPoint(config)) {
   1054         return GrClampType::kAuto;
   1055     }
   1056     return kRGBA_half_Clamped_GrPixelConfig == config ? GrClampType::kManual : GrClampType::kNone;
   1057 }
   1058 
   1059 /**
   1060  * Returns true if the pixel config is a GPU-specific compressed format
   1061  * representation.
   1062  */
   1063 static inline bool GrPixelConfigIsCompressed(GrPixelConfig config) {
   1064     switch (config) {
   1065         case kRGB_ETC1_GrPixelConfig:
   1066             return true;
   1067         case kUnknown_GrPixelConfig:
   1068         case kAlpha_8_GrPixelConfig:
   1069         case kAlpha_8_as_Alpha_GrPixelConfig:
   1070         case kAlpha_8_as_Red_GrPixelConfig:
   1071         case kGray_8_GrPixelConfig:
   1072         case kGray_8_as_Lum_GrPixelConfig:
   1073         case kGray_8_as_Red_GrPixelConfig:
   1074         case kRGB_565_GrPixelConfig:
   1075         case kRGBA_4444_GrPixelConfig:
   1076         case kRGB_888_GrPixelConfig:
   1077         case kRGB_888X_GrPixelConfig:
   1078         case kRG_88_GrPixelConfig:
   1079         case kRGBA_8888_GrPixelConfig:
   1080         case kBGRA_8888_GrPixelConfig:
   1081         case kSRGBA_8888_GrPixelConfig:
   1082         case kSBGRA_8888_GrPixelConfig:
   1083         case kRGBA_1010102_GrPixelConfig:
   1084         case kRGBA_float_GrPixelConfig:
   1085         case kRG_float_GrPixelConfig:
   1086         case kAlpha_half_GrPixelConfig:
   1087         case kAlpha_half_as_Red_GrPixelConfig:
   1088         case kRGBA_half_GrPixelConfig:
   1089         case kRGBA_half_Clamped_GrPixelConfig:
   1090             return false;
   1091     }
   1092     SK_ABORT("Invalid pixel config");
   1093     return false;
   1094 }
   1095 
   1096 /**
   1097  * If the pixel config is compressed, return an equivalent uncompressed format.
   1098  */
   1099 static inline GrPixelConfig GrMakePixelConfigUncompressed(GrPixelConfig config) {
   1100     switch (config) {
   1101         case kRGB_ETC1_GrPixelConfig:
   1102             return kRGBA_8888_GrPixelConfig;
   1103         case kUnknown_GrPixelConfig:
   1104         case kAlpha_8_GrPixelConfig:
   1105         case kAlpha_8_as_Alpha_GrPixelConfig:
   1106         case kAlpha_8_as_Red_GrPixelConfig:
   1107         case kGray_8_GrPixelConfig:
   1108         case kGray_8_as_Lum_GrPixelConfig:
   1109         case kGray_8_as_Red_GrPixelConfig:
   1110         case kRGB_565_GrPixelConfig:
   1111         case kRGBA_4444_GrPixelConfig:
   1112         case kRGB_888_GrPixelConfig:
   1113         case kRGB_888X_GrPixelConfig:
   1114         case kRG_88_GrPixelConfig:
   1115         case kRGBA_8888_GrPixelConfig:
   1116         case kBGRA_8888_GrPixelConfig:
   1117         case kSRGBA_8888_GrPixelConfig:
   1118         case kSBGRA_8888_GrPixelConfig:
   1119         case kRGBA_1010102_GrPixelConfig:
   1120         case kRGBA_float_GrPixelConfig:
   1121         case kRG_float_GrPixelConfig:
   1122         case kAlpha_half_GrPixelConfig:
   1123         case kAlpha_half_as_Red_GrPixelConfig:
   1124         case kRGBA_half_GrPixelConfig:
   1125         case kRGBA_half_Clamped_GrPixelConfig:
   1126             return config;
   1127         }
   1128     SK_ABORT("Invalid pixel config");
   1129     return config;
   1130 }
   1131 
   1132 /**
   1133  * Returns the data size for the given compressed pixel config
   1134  */
   1135 static inline size_t GrCompressedFormatDataSize(GrPixelConfig config,
   1136                                                 int width, int height) {
   1137     SkASSERT(GrPixelConfigIsCompressed(config));
   1138 
   1139     switch (config) {
   1140         case kRGB_ETC1_GrPixelConfig:
   1141             SkASSERT((width & 3) == 0);
   1142             SkASSERT((height & 3) == 0);
   1143             return (width >> 2) * (height >> 2) * 8;
   1144 
   1145         case kUnknown_GrPixelConfig:
   1146         case kAlpha_8_GrPixelConfig:
   1147         case kAlpha_8_as_Alpha_GrPixelConfig:
   1148         case kAlpha_8_as_Red_GrPixelConfig:
   1149         case kGray_8_GrPixelConfig:
   1150         case kGray_8_as_Lum_GrPixelConfig:
   1151         case kGray_8_as_Red_GrPixelConfig:
   1152         case kRGB_565_GrPixelConfig:
   1153         case kRGBA_4444_GrPixelConfig:
   1154         case kRGB_888_GrPixelConfig:
   1155         case kRGB_888X_GrPixelConfig:
   1156         case kRG_88_GrPixelConfig:
   1157         case kRGBA_8888_GrPixelConfig:
   1158         case kBGRA_8888_GrPixelConfig:
   1159         case kSRGBA_8888_GrPixelConfig:
   1160         case kSBGRA_8888_GrPixelConfig:
   1161         case kRGBA_1010102_GrPixelConfig:
   1162         case kRGBA_float_GrPixelConfig:
   1163         case kRG_float_GrPixelConfig:
   1164         case kAlpha_half_GrPixelConfig:
   1165         case kAlpha_half_as_Red_GrPixelConfig:
   1166         case kRGBA_half_GrPixelConfig:
   1167         case kRGBA_half_Clamped_GrPixelConfig:
   1168             SK_ABORT("Unknown compressed pixel config");
   1169             return 4 * width * height;
   1170     }
   1171 
   1172     SK_ABORT("Invalid pixel config");
   1173     return 4 * width * height;
   1174 }
   1175 
   1176 /**
   1177  * Precision qualifier that should be used with a sampler.
   1178  */
   1179 static inline GrSLPrecision GrSLSamplerPrecision(GrPixelConfig config) {
   1180     switch (config) {
   1181         case kUnknown_GrPixelConfig:
   1182         case kAlpha_8_GrPixelConfig:
   1183         case kAlpha_8_as_Alpha_GrPixelConfig:
   1184         case kAlpha_8_as_Red_GrPixelConfig:
   1185         case kGray_8_GrPixelConfig:
   1186         case kGray_8_as_Lum_GrPixelConfig:
   1187         case kGray_8_as_Red_GrPixelConfig:
   1188         case kRGB_565_GrPixelConfig:
   1189         case kRGBA_4444_GrPixelConfig:
   1190         case kRGBA_8888_GrPixelConfig:
   1191         case kRGB_888_GrPixelConfig:
   1192         case kRGB_888X_GrPixelConfig:
   1193         case kRG_88_GrPixelConfig:
   1194         case kBGRA_8888_GrPixelConfig:
   1195         case kSRGBA_8888_GrPixelConfig:
   1196         case kSBGRA_8888_GrPixelConfig:
   1197         case kRGB_ETC1_GrPixelConfig:
   1198             return kLow_GrSLPrecision;
   1199         case kRGBA_float_GrPixelConfig:
   1200         case kRG_float_GrPixelConfig:
   1201             return kHigh_GrSLPrecision;
   1202         case kAlpha_half_GrPixelConfig:
   1203         case kAlpha_half_as_Red_GrPixelConfig:
   1204         case kRGBA_half_GrPixelConfig:
   1205         case kRGBA_half_Clamped_GrPixelConfig:
   1206         case kRGBA_1010102_GrPixelConfig:
   1207             return kMedium_GrSLPrecision;
   1208     }
   1209     SK_ABORT("Unexpected type");
   1210     return kHigh_GrSLPrecision;
   1211 }
   1212 
   1213 /**
   1214  * Like SkColorType this describes a layout of pixel data in CPU memory. It specifies the channels,
   1215  * their type, and width. This exists so that the GPU backend can have private types that have no
   1216  * analog in the public facing SkColorType enum and omit types not implemented in the GPU backend.
   1217  * It does not refer to a texture format and the mapping to texture formats may be many-to-many.
   1218  * It does not specify the sRGB encoding of the stored values.
   1219  */
   1220 enum class GrColorType {
   1221     kUnknown,
   1222     kAlpha_8,
   1223     kRGB_565,
   1224     kABGR_4444,  // This name differs from SkColorType. kARGB_4444_SkColorType is misnamed.
   1225     kRGBA_8888,
   1226     kRGB_888x,
   1227     kRG_88,
   1228     kBGRA_8888,
   1229     kRGBA_1010102,
   1230     kGray_8,
   1231     kAlpha_F16,
   1232     kRGBA_F16,
   1233     kRGBA_F16_Clamped,
   1234     kRG_F32,
   1235     kRGBA_F32,
   1236     kRGB_ETC1,   // This type doesn't appear in SkColorType at all.
   1237 };
   1238 
   1239 static inline SkColorType GrColorTypeToSkColorType(GrColorType ct) {
   1240     switch (ct) {
   1241         case GrColorType::kUnknown:          return kUnknown_SkColorType;
   1242         case GrColorType::kAlpha_8:          return kAlpha_8_SkColorType;
   1243         case GrColorType::kRGB_565:          return kRGB_565_SkColorType;
   1244         case GrColorType::kABGR_4444:        return kARGB_4444_SkColorType;
   1245         case GrColorType::kRGBA_8888:        return kRGBA_8888_SkColorType;
   1246         case GrColorType::kRGB_888x:         return kRGB_888x_SkColorType;
   1247         case GrColorType::kRG_88:            return kUnknown_SkColorType;
   1248         case GrColorType::kBGRA_8888:        return kBGRA_8888_SkColorType;
   1249         case GrColorType::kRGBA_1010102:     return kRGBA_1010102_SkColorType;
   1250         case GrColorType::kGray_8:           return kGray_8_SkColorType;
   1251         case GrColorType::kAlpha_F16:        return kUnknown_SkColorType;
   1252         case GrColorType::kRGBA_F16:         return kRGBA_F16_SkColorType;
   1253         case GrColorType::kRGBA_F16_Clamped: return kRGBA_F16Norm_SkColorType;
   1254         case GrColorType::kRG_F32:           return kUnknown_SkColorType;
   1255         case GrColorType::kRGBA_F32:         return kRGBA_F32_SkColorType;
   1256         case GrColorType::kRGB_ETC1:         return kUnknown_SkColorType;
   1257     }
   1258     SK_ABORT("Invalid GrColorType");
   1259     return kUnknown_SkColorType;
   1260 }
   1261 
   1262 static inline GrColorType SkColorTypeToGrColorType(SkColorType ct) {
   1263     switch (ct) {
   1264         case kUnknown_SkColorType:      return GrColorType::kUnknown;
   1265         case kAlpha_8_SkColorType:      return GrColorType::kAlpha_8;
   1266         case kRGB_565_SkColorType:      return GrColorType::kRGB_565;
   1267         case kARGB_4444_SkColorType:    return GrColorType::kABGR_4444;
   1268         case kRGBA_8888_SkColorType:    return GrColorType::kRGBA_8888;
   1269         case kRGB_888x_SkColorType:     return GrColorType::kRGB_888x;
   1270         case kBGRA_8888_SkColorType:    return GrColorType::kBGRA_8888;
   1271         case kGray_8_SkColorType:       return GrColorType::kGray_8;
   1272         case kRGBA_F16Norm_SkColorType: return GrColorType::kRGBA_F16_Clamped;
   1273         case kRGBA_F16_SkColorType:     return GrColorType::kRGBA_F16;
   1274         case kRGBA_1010102_SkColorType: return GrColorType::kRGBA_1010102;
   1275         case kRGB_101010x_SkColorType:  return GrColorType::kUnknown;
   1276         case kRGBA_F32_SkColorType:     return GrColorType::kRGBA_F32;
   1277     }
   1278     SK_ABORT("Invalid SkColorType");
   1279     return GrColorType::kUnknown;
   1280 }
   1281 
   1282 static inline uint32_t GrColorTypeComponentFlags(GrColorType ct) {
   1283     switch (ct) {
   1284         case GrColorType::kUnknown:          return 0;
   1285         case GrColorType::kAlpha_8:          return kAlpha_SkColorTypeComponentFlag;
   1286         case GrColorType::kRGB_565:          return kRGB_SkColorTypeComponentFlags;
   1287         case GrColorType::kABGR_4444:        return kRGBA_SkColorTypeComponentFlags;
   1288         case GrColorType::kRGBA_8888:        return kRGBA_SkColorTypeComponentFlags;
   1289         case GrColorType::kRGB_888x:         return kRGB_SkColorTypeComponentFlags;
   1290         case GrColorType::kRG_88:            return kRed_SkColorTypeComponentFlag |
   1291                                                     kGreen_SkColorTypeComponentFlag;
   1292         case GrColorType::kBGRA_8888:        return kRGBA_SkColorTypeComponentFlags;
   1293         case GrColorType::kRGBA_1010102:     return kRGBA_SkColorTypeComponentFlags;
   1294         case GrColorType::kGray_8:           return kGray_SkColorTypeComponentFlag;
   1295         case GrColorType::kAlpha_F16:        return kAlpha_SkColorTypeComponentFlag;
   1296         case GrColorType::kRGBA_F16:         return kRGBA_SkColorTypeComponentFlags;
   1297         case GrColorType::kRGBA_F16_Clamped: return kRGBA_SkColorTypeComponentFlags;
   1298         case GrColorType::kRG_F32:           return kRed_SkColorTypeComponentFlag |
   1299                                                     kGreen_SkColorTypeComponentFlag;
   1300         case GrColorType::kRGBA_F32:         return kRGBA_SkColorTypeComponentFlags;
   1301         case GrColorType::kRGB_ETC1:         return kRGB_SkColorTypeComponentFlags;
   1302     }
   1303     SK_ABORT("Invalid GrColorType");
   1304     return kUnknown_SkColorType;
   1305 }
   1306 
   1307 static inline bool GrColorTypeIsAlphaOnly(GrColorType ct) {
   1308     return kAlpha_SkColorTypeComponentFlag == GrColorTypeComponentFlags(ct);
   1309 }
   1310 
   1311 static inline bool GrColorTypeHasAlpha(GrColorType ct) {
   1312     return kAlpha_SkColorTypeComponentFlag & GrColorTypeComponentFlags(ct);
   1313 }
   1314 
   1315 static inline int GrColorTypeBytesPerPixel(GrColorType ct) {
   1316     switch (ct) {
   1317         case GrColorType::kUnknown:          return 0;
   1318         case GrColorType::kRGB_ETC1:         return 0;
   1319         case GrColorType::kAlpha_8:          return 1;
   1320         case GrColorType::kRGB_565:          return 2;
   1321         case GrColorType::kABGR_4444:        return 2;
   1322         case GrColorType::kRGBA_8888:        return 4;
   1323         case GrColorType::kRGB_888x:         return 4;
   1324         case GrColorType::kRG_88:            return 2;
   1325         case GrColorType::kBGRA_8888:        return 4;
   1326         case GrColorType::kRGBA_1010102:     return 4;
   1327         case GrColorType::kGray_8:           return 1;
   1328         case GrColorType::kAlpha_F16:        return 2;
   1329         case GrColorType::kRGBA_F16:         return 8;
   1330         case GrColorType::kRGBA_F16_Clamped: return 8;
   1331         case GrColorType::kRG_F32:           return 8;
   1332         case GrColorType::kRGBA_F32:         return 16;
   1333     }
   1334     SK_ABORT("Invalid GrColorType");
   1335     return 0;
   1336 }
   1337 
   1338 static inline GrColorType GrPixelConfigToColorTypeAndEncoding(GrPixelConfig config,
   1339                                                               GrSRGBEncoded* srgbEncoded) {
   1340     SkASSERT(srgbEncoded);
   1341     switch (config) {
   1342         case kUnknown_GrPixelConfig:
   1343             return GrColorType::kUnknown;
   1344         case kAlpha_8_GrPixelConfig:
   1345             *srgbEncoded = GrSRGBEncoded::kNo;
   1346             return GrColorType::kAlpha_8;
   1347         case kGray_8_GrPixelConfig:
   1348             *srgbEncoded = GrSRGBEncoded::kNo;
   1349             return GrColorType::kGray_8;
   1350         case kRGB_565_GrPixelConfig:
   1351             *srgbEncoded = GrSRGBEncoded::kNo;
   1352             return GrColorType::kRGB_565;
   1353         case kRGBA_4444_GrPixelConfig:
   1354             *srgbEncoded = GrSRGBEncoded::kNo;
   1355             return GrColorType::kABGR_4444;
   1356         case kRGBA_8888_GrPixelConfig:
   1357             *srgbEncoded = GrSRGBEncoded::kNo;
   1358             return GrColorType::kRGBA_8888;
   1359         case kRGB_888_GrPixelConfig:
   1360             *srgbEncoded = GrSRGBEncoded::kNo;
   1361             return GrColorType::kRGB_888x;
   1362         case kRGB_888X_GrPixelConfig:
   1363             *srgbEncoded = GrSRGBEncoded::kNo;
   1364             return GrColorType::kRGB_888x;
   1365         case kRG_88_GrPixelConfig:
   1366             *srgbEncoded = GrSRGBEncoded::kNo;
   1367             return GrColorType::kRG_88;
   1368         case kBGRA_8888_GrPixelConfig:
   1369             *srgbEncoded = GrSRGBEncoded::kNo;
   1370             return GrColorType::kBGRA_8888;
   1371         case kSRGBA_8888_GrPixelConfig:
   1372             *srgbEncoded = GrSRGBEncoded::kYes;
   1373             return GrColorType::kRGBA_8888;
   1374         case kSBGRA_8888_GrPixelConfig:
   1375             *srgbEncoded = GrSRGBEncoded::kYes;
   1376             return GrColorType::kBGRA_8888;
   1377         case kRGBA_1010102_GrPixelConfig:
   1378             *srgbEncoded = GrSRGBEncoded::kNo;
   1379             return GrColorType::kRGBA_1010102;
   1380         case kRGBA_float_GrPixelConfig:
   1381             *srgbEncoded = GrSRGBEncoded::kNo;
   1382             return GrColorType::kRGBA_F32;
   1383         case kRG_float_GrPixelConfig:
   1384             *srgbEncoded = GrSRGBEncoded::kNo;
   1385             return GrColorType::kRG_F32;
   1386         case kAlpha_half_GrPixelConfig:
   1387             *srgbEncoded = GrSRGBEncoded::kNo;
   1388             return GrColorType::kAlpha_F16;
   1389         case kRGBA_half_GrPixelConfig:
   1390             *srgbEncoded = GrSRGBEncoded::kNo;
   1391             return GrColorType::kRGBA_F16;
   1392         case kRGBA_half_Clamped_GrPixelConfig:
   1393             *srgbEncoded = GrSRGBEncoded::kNo;
   1394             return GrColorType::kRGBA_F16_Clamped;
   1395         case kRGB_ETC1_GrPixelConfig:
   1396             *srgbEncoded = GrSRGBEncoded::kNo;
   1397             return GrColorType::kRGB_ETC1;
   1398         case kAlpha_8_as_Alpha_GrPixelConfig:
   1399             *srgbEncoded = GrSRGBEncoded::kNo;
   1400             return GrColorType::kAlpha_8;
   1401         case kAlpha_8_as_Red_GrPixelConfig:
   1402             *srgbEncoded = GrSRGBEncoded::kNo;
   1403             return GrColorType::kAlpha_8;
   1404         case kAlpha_half_as_Red_GrPixelConfig:
   1405             *srgbEncoded = GrSRGBEncoded::kNo;
   1406             return GrColorType::kAlpha_F16;
   1407         case kGray_8_as_Lum_GrPixelConfig:
   1408             *srgbEncoded = GrSRGBEncoded::kNo;
   1409             return GrColorType::kGray_8;
   1410         case kGray_8_as_Red_GrPixelConfig:
   1411             *srgbEncoded = GrSRGBEncoded::kNo;
   1412             return GrColorType::kGray_8;
   1413     }
   1414     SK_ABORT("Invalid GrPixelConfig");
   1415     return GrColorType::kUnknown;
   1416 }
   1417 
   1418 static inline GrColorType GrPixelConfigToColorType(GrPixelConfig config) {
   1419     GrSRGBEncoded bogusEncoded;
   1420     return GrPixelConfigToColorTypeAndEncoding(config, &bogusEncoded);
   1421 }
   1422 
   1423 static inline GrPixelConfig GrColorTypeToPixelConfig(GrColorType config,
   1424                                                      GrSRGBEncoded srgbEncoded) {
   1425     switch (config) {
   1426         case GrColorType::kUnknown:
   1427             return kUnknown_GrPixelConfig;
   1428         case GrColorType::kAlpha_8:
   1429             return (GrSRGBEncoded::kYes == srgbEncoded) ? kUnknown_GrPixelConfig
   1430                                                         : kAlpha_8_GrPixelConfig;
   1431 
   1432         case GrColorType::kGray_8:
   1433             return (GrSRGBEncoded::kYes == srgbEncoded) ? kUnknown_GrPixelConfig
   1434                                                         : kGray_8_GrPixelConfig;
   1435 
   1436         case GrColorType::kRGB_565:
   1437             return (GrSRGBEncoded::kYes == srgbEncoded) ? kUnknown_GrPixelConfig
   1438                                                         : kRGB_565_GrPixelConfig;
   1439 
   1440         case GrColorType::kABGR_4444:
   1441             return (GrSRGBEncoded::kYes == srgbEncoded) ? kUnknown_GrPixelConfig
   1442                                                         : kRGBA_4444_GrPixelConfig;
   1443 
   1444         case GrColorType::kRGBA_8888:
   1445             return (GrSRGBEncoded::kYes == srgbEncoded) ? kSRGBA_8888_GrPixelConfig
   1446                                                         : kRGBA_8888_GrPixelConfig;
   1447 
   1448         case GrColorType::kRGB_888x:
   1449             return (GrSRGBEncoded::kYes == srgbEncoded) ? kUnknown_GrPixelConfig
   1450                                                         : kRGB_888_GrPixelConfig;
   1451         case GrColorType::kRG_88:
   1452             return (GrSRGBEncoded::kYes == srgbEncoded) ? kUnknown_GrPixelConfig
   1453                                                         : kRG_88_GrPixelConfig;
   1454 
   1455         case GrColorType::kBGRA_8888:
   1456             return (GrSRGBEncoded::kYes == srgbEncoded) ? kSBGRA_8888_GrPixelConfig
   1457                                                         : kBGRA_8888_GrPixelConfig;
   1458 
   1459         case GrColorType::kRGBA_1010102:
   1460             return (GrSRGBEncoded::kYes == srgbEncoded) ? kUnknown_GrPixelConfig
   1461                                                         : kRGBA_1010102_GrPixelConfig;
   1462 
   1463         case GrColorType::kRGBA_F32:
   1464             return (GrSRGBEncoded::kYes == srgbEncoded) ? kUnknown_GrPixelConfig
   1465                                                         : kRGBA_float_GrPixelConfig;
   1466 
   1467         case GrColorType::kRG_F32:
   1468             return (GrSRGBEncoded::kYes == srgbEncoded) ? kUnknown_GrPixelConfig
   1469                                                         : kRG_float_GrPixelConfig;
   1470 
   1471         case GrColorType::kAlpha_F16:
   1472             return (GrSRGBEncoded::kYes == srgbEncoded) ? kUnknown_GrPixelConfig
   1473                                                         : kAlpha_half_GrPixelConfig;
   1474 
   1475         case GrColorType::kRGBA_F16:
   1476             return (GrSRGBEncoded::kYes == srgbEncoded) ? kUnknown_GrPixelConfig
   1477                                                         : kRGBA_half_GrPixelConfig;
   1478 
   1479         case GrColorType::kRGBA_F16_Clamped:
   1480             return (GrSRGBEncoded::kYes == srgbEncoded) ? kUnknown_GrPixelConfig
   1481                                                         : kRGBA_half_Clamped_GrPixelConfig;
   1482 
   1483         case GrColorType::kRGB_ETC1:
   1484             return (GrSRGBEncoded::kYes == srgbEncoded) ? kUnknown_GrPixelConfig
   1485                                                         : kRGB_ETC1_GrPixelConfig;
   1486     }
   1487     SK_ABORT("Invalid GrColorType");
   1488     return kUnknown_GrPixelConfig;
   1489 }
   1490 
   1491 /**
   1492  * Ref-counted object that calls a callback from its destructor. These can be chained together. Any
   1493  * owner can cancel calling the callback via abandon().
   1494  */
   1495 class GrRefCntedCallback : public SkRefCnt {
   1496 public:
   1497     using Context = void*;
   1498     using Callback = void (*)(Context);
   1499 
   1500     GrRefCntedCallback(Callback proc, Context ctx) : fReleaseProc(proc), fReleaseCtx(ctx) {
   1501         SkASSERT(proc);
   1502     }
   1503     ~GrRefCntedCallback() override { fReleaseProc ? fReleaseProc(fReleaseCtx) : void(); }
   1504 
   1505     /**
   1506      * After abandon is called the release proc will no longer be called in the destructor. This
   1507      * does not recurse on child release procs or unref them.
   1508      */
   1509     void abandon() {
   1510         fReleaseProc = nullptr;
   1511         fReleaseCtx = nullptr;
   1512     }
   1513 
   1514     /** Adds another GrRefCntedCallback that this will unref in its destructor. */
   1515     void addChild(sk_sp<GrRefCntedCallback> next) {
   1516         if (!fNext) {
   1517             fNext = std::move(next);
   1518             return;
   1519         }
   1520         fNext->addChild(std::move(next));
   1521     }
   1522 
   1523     Context context() const { return fReleaseCtx; }
   1524 
   1525 private:
   1526     sk_sp<GrRefCntedCallback> fNext;
   1527     Callback fReleaseProc;
   1528     Context fReleaseCtx;
   1529 };
   1530 
   1531 #endif
   1532