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 "GrTypes.h"
     13 #include "SkRefCnt.h"
     14 #include "GrSharedEnums.h"
     15 
     16 class GrCaps;
     17 
     18 // The old libstdc++ uses the draft name "monotonic_clock" rather than "steady_clock". This might
     19 // not actually be monotonic, depending on how libstdc++ was built. However, this is only currently
     20 // used for idle resource purging so it shouldn't cause a correctness problem.
     21 #if defined(__GLIBCXX__) && (__GLIBCXX__ < 20130000)
     22 using GrStdSteadyClock = std::chrono::monotonic_clock;
     23 #else
     24 using GrStdSteadyClock = std::chrono::steady_clock;
     25 #endif
     26 
     27 /** This enum is used to specify the load operation to be used when an
     28  *  opList/GrGpuCommandBuffer begins execution.
     29  */
     30 enum class GrLoadOp {
     31     kLoad,
     32     kClear,
     33     kDiscard,
     34 };
     35 
     36 /** This enum is used to specify the store operation to be used when an
     37  *  opList/GrGpuCommandBuffer ends execution.
     38  */
     39 enum class GrStoreOp {
     40     kStore,
     41     kDiscard,
     42 };
     43 
     44 /** This enum indicates the type of antialiasing to be performed. */
     45 enum class GrAAType : unsigned {
     46     /** No antialiasing */
     47     kNone,
     48     /** Use fragment shader code to compute a fractional pixel coverage. */
     49     kCoverage,
     50     /** Use normal MSAA. */
     51     kMSAA,
     52     /**
     53      * Use "mixed samples" MSAA such that the stencil buffer is multisampled but the color buffer is
     54      * not.
     55      */
     56     kMixedSamples
     57 };
     58 
     59 static inline bool GrAATypeIsHW(GrAAType type) {
     60     switch (type) {
     61         case GrAAType::kNone:
     62             return false;
     63         case GrAAType::kCoverage:
     64             return false;
     65         case GrAAType::kMSAA:
     66             return true;
     67         case GrAAType::kMixedSamples:
     68             return true;
     69     }
     70     SK_ABORT("Unknown AA Type");
     71     return false;
     72 }
     73 
     74 /** The type of full scene antialiasing supported by a render target. */
     75 enum class GrFSAAType {
     76     /** No FSAA */
     77     kNone,
     78     /** Regular MSAA where each attachment has the same sample count. */
     79     kUnifiedMSAA,
     80     /** One color sample, N stencil samples. */
     81     kMixedSamples,
     82 };
     83 
     84 /**
     85  * Not all drawing code paths support using mixed samples when available and instead use
     86  * coverage-based aa.
     87  */
     88 enum class GrAllowMixedSamples : bool { kNo = false, kYes = true };
     89 
     90 GrAAType GrChooseAAType(GrAA, GrFSAAType, GrAllowMixedSamples, const GrCaps&);
     91 
     92 /**
     93  * Some pixel configs are inherently clamped to [0,1], while others can hold values outside of that
     94  * range. This is important for blending - the latter category may require manual clamping.
     95  */
     96 enum class GrPixelConfigIsClamped : bool {
     97     kNo = false,   // F16 or F32
     98     kYes = true,  // Any UNORM type
     99 };
    100 
    101 /**
    102  * Types of shader-language-specific boxed variables we can create. (Currently only GrGLShaderVars,
    103  * but should be applicable to other shader languages.)
    104  */
    105 enum GrSLType {
    106     kVoid_GrSLType,
    107     kBool_GrSLType,
    108     kShort_GrSLType,
    109     kShort2_GrSLType,
    110     kShort3_GrSLType,
    111     kShort4_GrSLType,
    112     kUShort_GrSLType,
    113     kUShort2_GrSLType,
    114     kUShort3_GrSLType,
    115     kUShort4_GrSLType,
    116     kFloat_GrSLType,
    117     kFloat2_GrSLType,
    118     kFloat3_GrSLType,
    119     kFloat4_GrSLType,
    120     kFloat2x2_GrSLType,
    121     kFloat3x3_GrSLType,
    122     kFloat4x4_GrSLType,
    123     kHalf_GrSLType,
    124     kHalf2_GrSLType,
    125     kHalf3_GrSLType,
    126     kHalf4_GrSLType,
    127     kHalf2x2_GrSLType,
    128     kHalf3x3_GrSLType,
    129     kHalf4x4_GrSLType,
    130     kInt_GrSLType,
    131     kInt2_GrSLType,
    132     kInt3_GrSLType,
    133     kInt4_GrSLType,
    134     kUint_GrSLType,
    135     kUint2_GrSLType,
    136     kTexture2DSampler_GrSLType,
    137     kITexture2DSampler_GrSLType,
    138     kTextureExternalSampler_GrSLType,
    139     kTexture2DRectSampler_GrSLType,
    140     kBufferSampler_GrSLType,
    141     kTexture2D_GrSLType,
    142     kSampler_GrSLType,
    143 };
    144 
    145 enum GrShaderType {
    146     kVertex_GrShaderType,
    147     kGeometry_GrShaderType,
    148     kFragment_GrShaderType,
    149 
    150     kLastkFragment_GrShaderType = kFragment_GrShaderType
    151 };
    152 static const int kGrShaderTypeCount = kLastkFragment_GrShaderType + 1;
    153 
    154 enum GrShaderFlags {
    155     kNone_GrShaderFlags = 0,
    156     kVertex_GrShaderFlag = 1 << kVertex_GrShaderType,
    157     kGeometry_GrShaderFlag = 1 << kGeometry_GrShaderType,
    158     kFragment_GrShaderFlag = 1 << kFragment_GrShaderType
    159 };
    160 GR_MAKE_BITFIELD_OPS(GrShaderFlags);
    161 
    162 /**
    163  * Precisions of shader language variables. Not all shading languages support precisions or actually
    164  * vary the internal precision based on the qualifiers. These currently only apply to float types (
    165  * including float vectors and matrices).
    166  */
    167 enum GrSLPrecision {
    168     kLow_GrSLPrecision,
    169     kMedium_GrSLPrecision,
    170     kHigh_GrSLPrecision,
    171 
    172     // Default precision is a special tag that means "whatever the default for the program/type
    173     // combination is". In other words, it maps to the empty string in shader code. There are some
    174     // scenarios where kDefault is not allowed (as the default precision for a program, or for
    175     // varyings, for example).
    176     kDefault_GrSLPrecision,
    177 
    178     // We only consider the "real" precisions here
    179     kLast_GrSLPrecision = kHigh_GrSLPrecision,
    180 };
    181 
    182 static const int kGrSLPrecisionCount = kLast_GrSLPrecision + 1;
    183 
    184 /** Is the shading language type float (including vectors/matrices)? */
    185 static inline bool GrSLTypeIsFloatType(GrSLType type) {
    186     switch (type) {
    187         case kFloat_GrSLType:
    188         case kFloat2_GrSLType:
    189         case kFloat3_GrSLType:
    190         case kFloat4_GrSLType:
    191         case kFloat2x2_GrSLType:
    192         case kFloat3x3_GrSLType:
    193         case kFloat4x4_GrSLType:
    194         case kHalf_GrSLType:
    195         case kHalf2_GrSLType:
    196         case kHalf3_GrSLType:
    197         case kHalf4_GrSLType:
    198         case kHalf2x2_GrSLType:
    199         case kHalf3x3_GrSLType:
    200         case kHalf4x4_GrSLType:
    201             return true;
    202 
    203         case kVoid_GrSLType:
    204         case kTexture2DSampler_GrSLType:
    205         case kITexture2DSampler_GrSLType:
    206         case kTextureExternalSampler_GrSLType:
    207         case kTexture2DRectSampler_GrSLType:
    208         case kBufferSampler_GrSLType:
    209         case kBool_GrSLType:
    210         case kShort_GrSLType:
    211         case kShort2_GrSLType:
    212         case kShort3_GrSLType:
    213         case kShort4_GrSLType:
    214         case kUShort_GrSLType:
    215         case kUShort2_GrSLType:
    216         case kUShort3_GrSLType:
    217         case kUShort4_GrSLType:
    218         case kInt_GrSLType:
    219         case kInt2_GrSLType:
    220         case kInt3_GrSLType:
    221         case kInt4_GrSLType:
    222         case kUint_GrSLType:
    223         case kUint2_GrSLType:
    224         case kTexture2D_GrSLType:
    225         case kSampler_GrSLType:
    226             return false;
    227     }
    228     SK_ABORT("Unexpected type");
    229     return false;
    230 }
    231 
    232 /** If the type represents a single value or vector return the vector length, else -1. */
    233 static inline int GrSLTypeVecLength(GrSLType type) {
    234     switch (type) {
    235         case kFloat_GrSLType:
    236         case kHalf_GrSLType:
    237         case kBool_GrSLType:
    238         case kShort_GrSLType:
    239         case kUShort_GrSLType:
    240         case kInt_GrSLType:
    241         case kUint_GrSLType:
    242             return 1;
    243 
    244         case kFloat2_GrSLType:
    245         case kHalf2_GrSLType:
    246         case kShort2_GrSLType:
    247         case kUShort2_GrSLType:
    248         case kInt2_GrSLType:
    249         case kUint2_GrSLType:
    250             return 2;
    251 
    252         case kFloat3_GrSLType:
    253         case kHalf3_GrSLType:
    254         case kShort3_GrSLType:
    255         case kUShort3_GrSLType:
    256         case kInt3_GrSLType:
    257             return 3;
    258 
    259         case kFloat4_GrSLType:
    260         case kHalf4_GrSLType:
    261         case kShort4_GrSLType:
    262         case kUShort4_GrSLType:
    263         case kInt4_GrSLType:
    264             return 4;
    265 
    266         case kFloat2x2_GrSLType:
    267         case kFloat3x3_GrSLType:
    268         case kFloat4x4_GrSLType:
    269         case kHalf2x2_GrSLType:
    270         case kHalf3x3_GrSLType:
    271         case kHalf4x4_GrSLType:
    272         case kVoid_GrSLType:
    273         case kTexture2DSampler_GrSLType:
    274         case kITexture2DSampler_GrSLType:
    275         case kTextureExternalSampler_GrSLType:
    276         case kTexture2DRectSampler_GrSLType:
    277         case kBufferSampler_GrSLType:
    278         case kTexture2D_GrSLType:
    279         case kSampler_GrSLType:
    280             return -1;
    281     }
    282     SK_ABORT("Unexpected type");
    283     return -1;
    284 }
    285 
    286 static inline bool GrSLTypeIs2DCombinedSamplerType(GrSLType type) {
    287     switch (type) {
    288         case kTexture2DSampler_GrSLType:
    289         case kITexture2DSampler_GrSLType:
    290         case kTextureExternalSampler_GrSLType:
    291         case kTexture2DRectSampler_GrSLType:
    292             return true;
    293 
    294         case kVoid_GrSLType:
    295         case kFloat_GrSLType:
    296         case kFloat2_GrSLType:
    297         case kFloat3_GrSLType:
    298         case kFloat4_GrSLType:
    299         case kFloat2x2_GrSLType:
    300         case kFloat3x3_GrSLType:
    301         case kFloat4x4_GrSLType:
    302         case kHalf_GrSLType:
    303         case kHalf2_GrSLType:
    304         case kHalf3_GrSLType:
    305         case kHalf4_GrSLType:
    306         case kHalf2x2_GrSLType:
    307         case kHalf3x3_GrSLType:
    308         case kHalf4x4_GrSLType:
    309         case kInt_GrSLType:
    310         case kInt2_GrSLType:
    311         case kInt3_GrSLType:
    312         case kInt4_GrSLType:
    313         case kUint_GrSLType:
    314         case kUint2_GrSLType:
    315         case kBufferSampler_GrSLType:
    316         case kBool_GrSLType:
    317         case kShort_GrSLType:
    318         case kShort2_GrSLType:
    319         case kShort3_GrSLType:
    320         case kShort4_GrSLType:
    321         case kUShort_GrSLType:
    322         case kUShort2_GrSLType:
    323         case kUShort3_GrSLType:
    324         case kUShort4_GrSLType:
    325         case kTexture2D_GrSLType:
    326         case kSampler_GrSLType:
    327             return false;
    328     }
    329     SK_ABORT("Unexpected type");
    330     return false;
    331 }
    332 
    333 static inline bool GrSLTypeIsCombinedSamplerType(GrSLType type) {
    334     switch (type) {
    335         case kTexture2DSampler_GrSLType:
    336         case kITexture2DSampler_GrSLType:
    337         case kTextureExternalSampler_GrSLType:
    338         case kTexture2DRectSampler_GrSLType:
    339         case kBufferSampler_GrSLType:
    340             return true;
    341 
    342         case kVoid_GrSLType:
    343         case kFloat_GrSLType:
    344         case kFloat2_GrSLType:
    345         case kFloat3_GrSLType:
    346         case kFloat4_GrSLType:
    347         case kFloat2x2_GrSLType:
    348         case kFloat3x3_GrSLType:
    349         case kFloat4x4_GrSLType:
    350         case kHalf_GrSLType:
    351         case kHalf2_GrSLType:
    352         case kHalf3_GrSLType:
    353         case kHalf4_GrSLType:
    354         case kHalf2x2_GrSLType:
    355         case kHalf3x3_GrSLType:
    356         case kHalf4x4_GrSLType:
    357         case kInt_GrSLType:
    358         case kInt2_GrSLType:
    359         case kInt3_GrSLType:
    360         case kInt4_GrSLType:
    361         case kUint_GrSLType:
    362         case kUint2_GrSLType:
    363         case kBool_GrSLType:
    364         case kShort_GrSLType:
    365         case kShort2_GrSLType:
    366         case kShort3_GrSLType:
    367         case kShort4_GrSLType:
    368         case kUShort_GrSLType:
    369         case kUShort2_GrSLType:
    370         case kUShort3_GrSLType:
    371         case kUShort4_GrSLType:
    372         case kTexture2D_GrSLType:
    373         case kSampler_GrSLType:
    374             return false;
    375     }
    376     SK_ABORT("Unexpected type");
    377     return false;
    378 }
    379 
    380 static inline bool GrSLTypeAcceptsPrecision(GrSLType type) {
    381     switch (type) {
    382         case kTexture2DSampler_GrSLType:
    383         case kITexture2DSampler_GrSLType:
    384         case kTextureExternalSampler_GrSLType:
    385         case kTexture2DRectSampler_GrSLType:
    386         case kBufferSampler_GrSLType:
    387         case kTexture2D_GrSLType:
    388         case kSampler_GrSLType:
    389             return true;
    390 
    391         case kVoid_GrSLType:
    392         case kBool_GrSLType:
    393         case kShort_GrSLType:
    394         case kShort2_GrSLType:
    395         case kShort3_GrSLType:
    396         case kShort4_GrSLType:
    397         case kUShort_GrSLType:
    398         case kUShort2_GrSLType:
    399         case kUShort3_GrSLType:
    400         case kUShort4_GrSLType:
    401         case kFloat_GrSLType:
    402         case kFloat2_GrSLType:
    403         case kFloat3_GrSLType:
    404         case kFloat4_GrSLType:
    405         case kFloat2x2_GrSLType:
    406         case kFloat3x3_GrSLType:
    407         case kFloat4x4_GrSLType:
    408         case kHalf_GrSLType:
    409         case kHalf2_GrSLType:
    410         case kHalf3_GrSLType:
    411         case kHalf4_GrSLType:
    412         case kHalf2x2_GrSLType:
    413         case kHalf3x3_GrSLType:
    414         case kHalf4x4_GrSLType:
    415         case kInt_GrSLType:
    416         case kInt2_GrSLType:
    417         case kInt3_GrSLType:
    418         case kInt4_GrSLType:
    419         case kUint_GrSLType:
    420         case kUint2_GrSLType:
    421             return false;
    422     }
    423     SK_ABORT("Unexpected type");
    424     return false;
    425 }
    426 
    427 // temporarily accepting (but ignoring) precision modifiers on the new types; this will be killed
    428 // in a future CL
    429 static inline bool GrSLTypeTemporarilyAcceptsPrecision(GrSLType type) {
    430     switch (type) {
    431         case kShort_GrSLType:
    432         case kUShort_GrSLType:
    433         case kFloat_GrSLType:
    434         case kFloat2_GrSLType:
    435         case kFloat3_GrSLType:
    436         case kFloat4_GrSLType:
    437         case kFloat2x2_GrSLType:
    438         case kFloat3x3_GrSLType:
    439         case kFloat4x4_GrSLType:
    440         case kHalf_GrSLType:
    441         case kHalf2_GrSLType:
    442         case kHalf3_GrSLType:
    443         case kHalf4_GrSLType:
    444         case kHalf2x2_GrSLType:
    445         case kHalf3x3_GrSLType:
    446         case kHalf4x4_GrSLType:
    447         case kInt_GrSLType:
    448         case kInt2_GrSLType:
    449         case kInt3_GrSLType:
    450         case kInt4_GrSLType:
    451         case kUint_GrSLType:
    452         case kUint2_GrSLType:
    453         case kTexture2DSampler_GrSLType:
    454         case kITexture2DSampler_GrSLType:
    455         case kTextureExternalSampler_GrSLType:
    456         case kTexture2DRectSampler_GrSLType:
    457         case kBufferSampler_GrSLType:
    458         case kTexture2D_GrSLType:
    459         case kSampler_GrSLType:
    460             return true;
    461 
    462         case kVoid_GrSLType:
    463         case kBool_GrSLType:
    464         case kShort2_GrSLType:
    465         case kShort3_GrSLType:
    466         case kShort4_GrSLType:
    467         case kUShort2_GrSLType:
    468         case kUShort3_GrSLType:
    469         case kUShort4_GrSLType:
    470             return false;
    471     }
    472     SK_ABORT("Unexpected type");
    473     return false;
    474 }
    475 
    476 //////////////////////////////////////////////////////////////////////////////
    477 
    478 /**
    479  * Types used to describe format of vertices in arrays.
    480  */
    481 enum GrVertexAttribType {
    482     kFloat_GrVertexAttribType = 0,
    483     kFloat2_GrVertexAttribType,
    484     kFloat3_GrVertexAttribType,
    485     kFloat4_GrVertexAttribType,
    486     kHalf_GrVertexAttribType,
    487     kHalf2_GrVertexAttribType,
    488     kHalf3_GrVertexAttribType,
    489     kHalf4_GrVertexAttribType,
    490 
    491     kInt2_GrVertexAttribType,   // vector of 2 32-bit ints
    492     kInt3_GrVertexAttribType,   // vector of 3 32-bit ints
    493     kInt4_GrVertexAttribType,   // vector of 4 32-bit ints
    494 
    495     kUByte_norm_GrVertexAttribType,  // unsigned byte, e.g. coverage, 0 -> 0.0f, 255 -> 1.0f.
    496     kUByte4_norm_GrVertexAttribType, // vector of 4 unsigned bytes, e.g. colors, 0 -> 0.0f,
    497                                      // 255 -> 1.0f.
    498 
    499     kShort2_GrVertexAttribType,       // vector of 2 16-bit shorts.
    500     kUShort2_GrVertexAttribType,      // vector of 2 unsigned shorts. 0 -> 0, 65535 -> 65535.
    501     kUShort2_norm_GrVertexAttribType, // vector of 2 unsigned shorts. 0 -> 0.0f, 65535 -> 1.0f.
    502 
    503     kInt_GrVertexAttribType,
    504     kUint_GrVertexAttribType,
    505 
    506     kLast_GrVertexAttribType = kUint_GrVertexAttribType
    507 };
    508 static const int kGrVertexAttribTypeCount = kLast_GrVertexAttribType + 1;
    509 
    510 /**
    511  * Returns the size of the attrib type in bytes.
    512  */
    513 static inline size_t GrVertexAttribTypeSize(GrVertexAttribType type) {
    514     switch (type) {
    515         case kFloat_GrVertexAttribType:
    516             return sizeof(float);
    517         case kFloat2_GrVertexAttribType:
    518             return 2 * sizeof(float);
    519         case kFloat3_GrVertexAttribType:
    520             return 3 * sizeof(float);
    521         case kFloat4_GrVertexAttribType:
    522             return 4 * sizeof(float);
    523         case kHalf_GrVertexAttribType:
    524             return sizeof(float);
    525         case kHalf2_GrVertexAttribType:
    526             return 2 * sizeof(float);
    527         case kHalf3_GrVertexAttribType:
    528             return 3 * sizeof(float);
    529         case kHalf4_GrVertexAttribType:
    530             return 4 * sizeof(float);
    531         case kInt2_GrVertexAttribType:
    532             return 2 * sizeof(int32_t);
    533         case kInt3_GrVertexAttribType:
    534             return 3 * sizeof(int32_t);
    535         case kInt4_GrVertexAttribType:
    536             return 4 * sizeof(int32_t);
    537         case kUByte_norm_GrVertexAttribType:
    538             return 1 * sizeof(char);
    539         case kUByte4_norm_GrVertexAttribType:
    540             return 4 * sizeof(char);
    541         case kShort2_GrVertexAttribType:
    542             return 2 * sizeof(int16_t);
    543         case kUShort2_GrVertexAttribType: // fall through
    544         case kUShort2_norm_GrVertexAttribType:
    545             return 2 * sizeof(uint16_t);
    546         case kInt_GrVertexAttribType:
    547             return sizeof(int32_t);
    548         case kUint_GrVertexAttribType:
    549             return sizeof(uint32_t);
    550     }
    551     SK_ABORT("Unexpected attribute type");
    552     return 0;
    553 }
    554 
    555 /**
    556  * converts a GrVertexAttribType to a GrSLType
    557  */
    558 static inline GrSLType GrVertexAttribTypeToSLType(GrVertexAttribType type) {
    559     switch (type) {
    560         case kShort2_GrVertexAttribType:
    561             return kShort2_GrSLType;
    562         case kUShort2_GrVertexAttribType:
    563             return kUShort2_GrSLType;
    564         case kUShort2_norm_GrVertexAttribType:
    565             return kFloat2_GrSLType;
    566         case kUByte_norm_GrVertexAttribType:   // fall through
    567         case kFloat_GrVertexAttribType:
    568             return kFloat_GrSLType;
    569         case kFloat2_GrVertexAttribType:
    570             return kFloat2_GrSLType;
    571         case kFloat3_GrVertexAttribType:
    572             return kFloat3_GrSLType;
    573         case kFloat4_GrVertexAttribType:
    574             return kFloat4_GrSLType;
    575         case kHalf_GrVertexAttribType:
    576             return kHalf_GrSLType;
    577         case kHalf2_GrVertexAttribType:
    578             return kHalf2_GrSLType;
    579         case kHalf3_GrVertexAttribType:
    580             return kHalf3_GrSLType;
    581         case kHalf4_GrVertexAttribType:
    582         case kUByte4_norm_GrVertexAttribType:
    583             return kHalf4_GrSLType;
    584         case kInt2_GrVertexAttribType:
    585             return kInt2_GrSLType;
    586         case kInt3_GrVertexAttribType:
    587             return kInt3_GrSLType;
    588         case kInt4_GrVertexAttribType:
    589             return kInt4_GrSLType;
    590         case kInt_GrVertexAttribType:
    591             return kInt_GrSLType;
    592         case kUint_GrVertexAttribType:
    593             return kUint_GrSLType;
    594     }
    595     SK_ABORT("Unsupported type conversion");
    596     return kVoid_GrSLType;
    597 }
    598 
    599 //////////////////////////////////////////////////////////////////////////////
    600 
    601 static const int kGrClipEdgeTypeCnt = (int) GrClipEdgeType::kLast + 1;
    602 
    603 static inline bool GrProcessorEdgeTypeIsFill(const GrClipEdgeType edgeType) {
    604     return (GrClipEdgeType::kFillAA == edgeType || GrClipEdgeType::kFillBW == edgeType);
    605 }
    606 
    607 static inline bool GrProcessorEdgeTypeIsInverseFill(const GrClipEdgeType edgeType) {
    608     return (GrClipEdgeType::kInverseFillAA == edgeType ||
    609             GrClipEdgeType::kInverseFillBW == edgeType);
    610 }
    611 
    612 static inline bool GrProcessorEdgeTypeIsAA(const GrClipEdgeType edgeType) {
    613     return (GrClipEdgeType::kFillBW != edgeType &&
    614             GrClipEdgeType::kInverseFillBW != edgeType);
    615 }
    616 
    617 static inline GrClipEdgeType GrInvertProcessorEdgeType(const GrClipEdgeType edgeType) {
    618     switch (edgeType) {
    619         case GrClipEdgeType::kFillBW:
    620             return GrClipEdgeType::kInverseFillBW;
    621         case GrClipEdgeType::kFillAA:
    622             return GrClipEdgeType::kInverseFillAA;
    623         case GrClipEdgeType::kInverseFillBW:
    624             return GrClipEdgeType::kFillBW;
    625         case GrClipEdgeType::kInverseFillAA:
    626             return GrClipEdgeType::kFillAA;
    627         case GrClipEdgeType::kHairlineAA:
    628             SK_ABORT("Hairline fill isn't invertible.");
    629     }
    630     return GrClipEdgeType::kFillAA;  // suppress warning.
    631 }
    632 
    633 /**
    634  * Indicates the type of pending IO operations that can be recorded for gpu resources.
    635  */
    636 enum GrIOType {
    637     kRead_GrIOType,
    638     kWrite_GrIOType,
    639     kRW_GrIOType
    640 };
    641 
    642 /**
    643  * Indicates the type of data that a GPU buffer will be used for.
    644  */
    645 enum GrBufferType {
    646     kVertex_GrBufferType,
    647     kIndex_GrBufferType,
    648     kTexel_GrBufferType,
    649     kDrawIndirect_GrBufferType,
    650     kXferCpuToGpu_GrBufferType,
    651     kXferGpuToCpu_GrBufferType,
    652 
    653     kLast_GrBufferType = kXferGpuToCpu_GrBufferType
    654 };
    655 static const int kGrBufferTypeCount = kLast_GrBufferType + 1;
    656 
    657 static inline bool GrBufferTypeIsVertexOrIndex(GrBufferType type) {
    658     SkASSERT(type >= 0 && type < kGrBufferTypeCount);
    659     return type <= kIndex_GrBufferType;
    660 
    661     GR_STATIC_ASSERT(0 == kVertex_GrBufferType);
    662     GR_STATIC_ASSERT(1 == kIndex_GrBufferType);
    663 }
    664 
    665 /**
    666  * Provides a performance hint regarding the frequency at which a data store will be accessed.
    667  */
    668 enum GrAccessPattern {
    669     /** Data store will be respecified repeatedly and used many times. */
    670     kDynamic_GrAccessPattern,
    671     /** Data store will be specified once and used many times. (Thus disqualified from caching.) */
    672     kStatic_GrAccessPattern,
    673     /** Data store will be specified once and used at most a few times. (Also can't be cached.) */
    674     kStream_GrAccessPattern,
    675 
    676     kLast_GrAccessPattern = kStream_GrAccessPattern
    677 };
    678 
    679 // Flags shared between GrRenderTarget and GrRenderTargetProxy
    680 enum class GrRenderTargetFlags {
    681     kNone               = 0,
    682 
    683     // For internal resources:
    684     //    this is enabled whenever MSAA is enabled and GrCaps reports mixed samples are supported
    685     // For wrapped resources:
    686     //    this is disabled for FBO0
    687     //    but, otherwise, is enabled whenever MSAA is enabled and GrCaps reports mixed samples
    688     //        are supported
    689     kMixedSampled       = 1 << 0,
    690 
    691     // For internal resources:
    692     //    this is enabled whenever GrCaps reports window rect support
    693     // For wrapped resources1
    694     //    this is disabled for FBO0
    695     //    but, otherwise, is enabled whenever GrCaps reports window rect support
    696     kWindowRectsSupport = 1 << 1
    697 };
    698 GR_MAKE_BITFIELD_CLASS_OPS(GrRenderTargetFlags)
    699 
    700 #ifdef SK_DEBUG
    701 // Takes a pointer to a GrCaps, and will suppress prints if required
    702 #define GrCapsDebugf(caps, ...)      \
    703     if (!(caps)->suppressPrints()) { \
    704         SkDebugf(__VA_ARGS__);       \
    705     }
    706 #else
    707 #define GrCapsDebugf(caps, ...)
    708 #endif
    709 
    710 /**
    711  * Specifies if the holder owns the backend, OpenGL or Vulkan, object.
    712  */
    713 enum class GrBackendObjectOwnership : bool {
    714     /** Holder does not destroy the backend object. */
    715     kBorrowed = false,
    716     /** Holder destroys the backend object. */
    717     kOwned = true
    718 };
    719 
    720 template <typename T>
    721 T* const* unique_ptr_address_as_pointer_address(std::unique_ptr<T> const* up) {
    722     static_assert(sizeof(T*) == sizeof(std::unique_ptr<T>), "unique_ptr not expected size.");
    723     return reinterpret_cast<T* const*>(up);
    724 }
    725 
    726 /*
    727  * Object for CPU-GPU synchronization
    728  */
    729 typedef uint64_t GrFence;
    730 
    731 /**
    732  * Used to include or exclude specific GPU path renderers for testing purposes.
    733  */
    734 enum class GpuPathRenderers {
    735     kNone              = 0, // Always use sofware masks and/or GrDefaultPathRenderer.
    736     kDashLine          = 1 << 0,
    737     kStencilAndCover   = 1 << 1,
    738     kMSAA              = 1 << 2,
    739     kAAConvex          = 1 << 3,
    740     kAALinearizing     = 1 << 4,
    741     kSmall             = 1 << 5,
    742     kCoverageCounting  = 1 << 6,
    743     kTessellating      = 1 << 7,
    744 
    745     kAll               = (kTessellating | (kTessellating - 1)),
    746     kDefault           = kAll
    747 };
    748 
    749 /**
    750  * Used to describe the current state of Mips on a GrTexture
    751  */
    752 enum class  GrMipMapsStatus {
    753     kNotAllocated, // Mips have not been allocated
    754     kDirty,        // Mips are allocated but the full mip tree does not have valid data
    755     kValid,        // All levels fully allocated and have valid data in them
    756 };
    757 
    758 GR_MAKE_BITFIELD_CLASS_OPS(GpuPathRenderers)
    759 
    760 /**
    761  * We want to extend the GrPixelConfig enum to add cases for dealing with alpha_8 which is
    762  * internally either alpha8 or red8. Also for Gray_8 which can be luminance_8 or red_8.
    763  */
    764 static constexpr GrPixelConfig kAlpha_8_as_Alpha_GrPixelConfig = kPrivateConfig1_GrPixelConfig;
    765 static constexpr GrPixelConfig kAlpha_8_as_Red_GrPixelConfig = kPrivateConfig2_GrPixelConfig;
    766 static constexpr GrPixelConfig kAlpha_half_as_Red_GrPixelConfig = kPrivateConfig3_GrPixelConfig;
    767 static constexpr GrPixelConfig kGray_8_as_Lum_GrPixelConfig = kPrivateConfig4_GrPixelConfig;
    768 static constexpr GrPixelConfig kGray_8_as_Red_GrPixelConfig = kPrivateConfig5_GrPixelConfig;
    769 
    770 /**
    771  * Utility functions for GrPixelConfig
    772  */
    773 // Returns true if the pixel config is 32 bits per pixel
    774 static inline bool GrPixelConfigIs8888Unorm(GrPixelConfig config) {
    775     switch (config) {
    776         case kRGBA_8888_GrPixelConfig:
    777         case kBGRA_8888_GrPixelConfig:
    778         case kSRGBA_8888_GrPixelConfig:
    779         case kSBGRA_8888_GrPixelConfig:
    780             return true;
    781         case kUnknown_GrPixelConfig:
    782         case kAlpha_8_GrPixelConfig:
    783         case kAlpha_8_as_Alpha_GrPixelConfig:
    784         case kAlpha_8_as_Red_GrPixelConfig:
    785         case kGray_8_GrPixelConfig:
    786         case kGray_8_as_Lum_GrPixelConfig:
    787         case kGray_8_as_Red_GrPixelConfig:
    788         case kRGB_565_GrPixelConfig:
    789         case kRGBA_4444_GrPixelConfig:
    790         case kRGBA_8888_sint_GrPixelConfig:
    791         case kRGBA_float_GrPixelConfig:
    792         case kRG_float_GrPixelConfig:
    793         case kAlpha_half_GrPixelConfig:
    794         case kAlpha_half_as_Red_GrPixelConfig:
    795         case kRGBA_half_GrPixelConfig:
    796             return false;
    797     }
    798     SK_ABORT("Invalid pixel config");
    799     return false;
    800 }
    801 
    802 // Returns true if the color (non-alpha) components represent sRGB values. It does NOT indicate that
    803 // all three color components are present in the config or anything about their order.
    804 static inline bool GrPixelConfigIsSRGB(GrPixelConfig config) {
    805     switch (config) {
    806         case kSRGBA_8888_GrPixelConfig:
    807         case kSBGRA_8888_GrPixelConfig:
    808             return true;
    809         case kUnknown_GrPixelConfig:
    810         case kAlpha_8_GrPixelConfig:
    811         case kAlpha_8_as_Alpha_GrPixelConfig:
    812         case kAlpha_8_as_Red_GrPixelConfig:
    813         case kGray_8_GrPixelConfig:
    814         case kGray_8_as_Lum_GrPixelConfig:
    815         case kGray_8_as_Red_GrPixelConfig:
    816         case kRGB_565_GrPixelConfig:
    817         case kRGBA_4444_GrPixelConfig:
    818         case kRGBA_8888_GrPixelConfig:
    819         case kBGRA_8888_GrPixelConfig:
    820         case kRGBA_8888_sint_GrPixelConfig:
    821         case kRGBA_float_GrPixelConfig:
    822         case kRG_float_GrPixelConfig:
    823         case kAlpha_half_GrPixelConfig:
    824         case kAlpha_half_as_Red_GrPixelConfig:
    825         case kRGBA_half_GrPixelConfig:
    826             return false;
    827     }
    828     SK_ABORT("Invalid pixel config");
    829     return false;
    830 }
    831 
    832 // Takes a config and returns the equivalent config with the R and B order
    833 // swapped if such a config exists. Otherwise, kUnknown_GrPixelConfig
    834 static inline GrPixelConfig GrPixelConfigSwapRAndB(GrPixelConfig config) {
    835     switch (config) {
    836         case kBGRA_8888_GrPixelConfig:
    837             return kRGBA_8888_GrPixelConfig;
    838         case kRGBA_8888_GrPixelConfig:
    839             return kBGRA_8888_GrPixelConfig;
    840         case kSBGRA_8888_GrPixelConfig:
    841             return kSRGBA_8888_GrPixelConfig;
    842         case kSRGBA_8888_GrPixelConfig:
    843             return kSBGRA_8888_GrPixelConfig;
    844         case kUnknown_GrPixelConfig:
    845         case kAlpha_8_GrPixelConfig:
    846         case kAlpha_8_as_Alpha_GrPixelConfig:
    847         case kAlpha_8_as_Red_GrPixelConfig:
    848         case kGray_8_GrPixelConfig:
    849         case kGray_8_as_Lum_GrPixelConfig:
    850         case kGray_8_as_Red_GrPixelConfig:
    851         case kRGB_565_GrPixelConfig:
    852         case kRGBA_4444_GrPixelConfig:
    853         case kRGBA_8888_sint_GrPixelConfig:
    854         case kRGBA_float_GrPixelConfig:
    855         case kRG_float_GrPixelConfig:
    856         case kAlpha_half_GrPixelConfig:
    857         case kAlpha_half_as_Red_GrPixelConfig:
    858         case kRGBA_half_GrPixelConfig:
    859             return kUnknown_GrPixelConfig;
    860     }
    861     SK_ABORT("Invalid pixel config");
    862     return kUnknown_GrPixelConfig;
    863 }
    864 
    865 static inline size_t GrBytesPerPixel(GrPixelConfig config) {
    866     switch (config) {
    867         case kAlpha_8_GrPixelConfig:
    868         case kAlpha_8_as_Alpha_GrPixelConfig:
    869         case kAlpha_8_as_Red_GrPixelConfig:
    870         case kGray_8_GrPixelConfig:
    871         case kGray_8_as_Lum_GrPixelConfig:
    872         case kGray_8_as_Red_GrPixelConfig:
    873             return 1;
    874         case kRGB_565_GrPixelConfig:
    875         case kRGBA_4444_GrPixelConfig:
    876         case kAlpha_half_GrPixelConfig:
    877         case kAlpha_half_as_Red_GrPixelConfig:
    878             return 2;
    879         case kRGBA_8888_GrPixelConfig:
    880         case kBGRA_8888_GrPixelConfig:
    881         case kSRGBA_8888_GrPixelConfig:
    882         case kSBGRA_8888_GrPixelConfig:
    883         case kRGBA_8888_sint_GrPixelConfig:
    884             return 4;
    885         case kRGBA_half_GrPixelConfig:
    886             return 8;
    887         case kRGBA_float_GrPixelConfig:
    888             return 16;
    889         case kRG_float_GrPixelConfig:
    890             return 8;
    891         case kUnknown_GrPixelConfig:
    892             return 0;
    893     }
    894     SK_ABORT("Invalid pixel config");
    895     return 0;
    896 }
    897 
    898 static inline bool GrPixelConfigIsOpaque(GrPixelConfig config) {
    899     switch (config) {
    900         case kRGB_565_GrPixelConfig:
    901         case kGray_8_GrPixelConfig:
    902         case kGray_8_as_Lum_GrPixelConfig:
    903         case kGray_8_as_Red_GrPixelConfig:
    904         case kRG_float_GrPixelConfig:
    905             return true;
    906         case kAlpha_8_GrPixelConfig:
    907         case kAlpha_8_as_Alpha_GrPixelConfig:
    908         case kAlpha_8_as_Red_GrPixelConfig:
    909         case kRGBA_4444_GrPixelConfig:
    910         case kAlpha_half_GrPixelConfig:
    911         case kAlpha_half_as_Red_GrPixelConfig:
    912         case kRGBA_8888_GrPixelConfig:
    913         case kBGRA_8888_GrPixelConfig:
    914         case kSRGBA_8888_GrPixelConfig:
    915         case kSBGRA_8888_GrPixelConfig:
    916         case kRGBA_8888_sint_GrPixelConfig:
    917         case kRGBA_half_GrPixelConfig:
    918         case kRGBA_float_GrPixelConfig:
    919         case kUnknown_GrPixelConfig:
    920             return false;
    921     }
    922     SK_ABORT("Invalid pixel config");
    923     return false;
    924 }
    925 
    926 static inline bool GrPixelConfigIsAlphaOnly(GrPixelConfig config) {
    927     switch (config) {
    928         case kAlpha_8_GrPixelConfig:
    929         case kAlpha_8_as_Alpha_GrPixelConfig:
    930         case kAlpha_8_as_Red_GrPixelConfig:
    931         case kAlpha_half_GrPixelConfig:
    932         case kAlpha_half_as_Red_GrPixelConfig:
    933             return true;
    934         case kUnknown_GrPixelConfig:
    935         case kGray_8_GrPixelConfig:
    936         case kGray_8_as_Lum_GrPixelConfig:
    937         case kGray_8_as_Red_GrPixelConfig:
    938         case kRGB_565_GrPixelConfig:
    939         case kRGBA_4444_GrPixelConfig:
    940         case kRGBA_8888_GrPixelConfig:
    941         case kBGRA_8888_GrPixelConfig:
    942         case kSRGBA_8888_GrPixelConfig:
    943         case kSBGRA_8888_GrPixelConfig:
    944         case kRGBA_8888_sint_GrPixelConfig:
    945         case kRGBA_float_GrPixelConfig:
    946         case kRG_float_GrPixelConfig:
    947         case kRGBA_half_GrPixelConfig:
    948             return false;
    949     }
    950     SK_ABORT("Invalid pixel config.");
    951     return false;
    952 }
    953 
    954 static inline bool GrPixelConfigIsFloatingPoint(GrPixelConfig config) {
    955     switch (config) {
    956         case kRGBA_float_GrPixelConfig:
    957         case kRG_float_GrPixelConfig:
    958         case kAlpha_half_GrPixelConfig:
    959         case kAlpha_half_as_Red_GrPixelConfig:
    960         case kRGBA_half_GrPixelConfig:
    961             return true;
    962         case kUnknown_GrPixelConfig:
    963         case kAlpha_8_GrPixelConfig:
    964         case kAlpha_8_as_Alpha_GrPixelConfig:
    965         case kAlpha_8_as_Red_GrPixelConfig:
    966         case kGray_8_GrPixelConfig:
    967         case kGray_8_as_Lum_GrPixelConfig:
    968         case kGray_8_as_Red_GrPixelConfig:
    969         case kRGB_565_GrPixelConfig:
    970         case kRGBA_4444_GrPixelConfig:
    971         case kRGBA_8888_GrPixelConfig:
    972         case kBGRA_8888_GrPixelConfig:
    973         case kSRGBA_8888_GrPixelConfig:
    974         case kSBGRA_8888_GrPixelConfig:
    975         case kRGBA_8888_sint_GrPixelConfig:
    976             return false;
    977     }
    978     SK_ABORT("Invalid pixel config");
    979     return false;
    980 }
    981 
    982 static inline bool GrPixelConfigIsSint(GrPixelConfig config) {
    983     return config == kRGBA_8888_sint_GrPixelConfig;
    984 }
    985 
    986 static inline bool GrPixelConfigIsUnorm(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 kGray_8_GrPixelConfig:
    992         case kGray_8_as_Lum_GrPixelConfig:
    993         case kGray_8_as_Red_GrPixelConfig:
    994         case kRGB_565_GrPixelConfig:
    995         case kRGBA_4444_GrPixelConfig:
    996         case kRGBA_8888_GrPixelConfig:
    997         case kBGRA_8888_GrPixelConfig:
    998         case kSRGBA_8888_GrPixelConfig:
    999         case kSBGRA_8888_GrPixelConfig:
   1000             return true;
   1001         case kUnknown_GrPixelConfig:
   1002         case kAlpha_half_GrPixelConfig:
   1003         case kAlpha_half_as_Red_GrPixelConfig:
   1004         case kRGBA_8888_sint_GrPixelConfig:
   1005         case kRGBA_float_GrPixelConfig:
   1006         case kRG_float_GrPixelConfig:
   1007         case kRGBA_half_GrPixelConfig:
   1008             return false;
   1009     }
   1010     SK_ABORT("Invalid pixel config.");
   1011     return false;
   1012 }
   1013 
   1014 /**
   1015  * Precision qualifier that should be used with a sampler.
   1016  */
   1017 static inline GrSLPrecision GrSLSamplerPrecision(GrPixelConfig config) {
   1018     switch (config) {
   1019         case kUnknown_GrPixelConfig:
   1020         case kAlpha_8_GrPixelConfig:
   1021         case kAlpha_8_as_Alpha_GrPixelConfig:
   1022         case kAlpha_8_as_Red_GrPixelConfig:
   1023         case kGray_8_GrPixelConfig:
   1024         case kGray_8_as_Lum_GrPixelConfig:
   1025         case kGray_8_as_Red_GrPixelConfig:
   1026         case kRGB_565_GrPixelConfig:
   1027         case kRGBA_4444_GrPixelConfig:
   1028         case kRGBA_8888_GrPixelConfig:
   1029         case kBGRA_8888_GrPixelConfig:
   1030         case kSRGBA_8888_GrPixelConfig:
   1031         case kSBGRA_8888_GrPixelConfig:
   1032         case kRGBA_8888_sint_GrPixelConfig:
   1033             return kLow_GrSLPrecision;
   1034         case kRGBA_float_GrPixelConfig:
   1035         case kRG_float_GrPixelConfig:
   1036             return kHigh_GrSLPrecision;
   1037         case kAlpha_half_GrPixelConfig:
   1038         case kAlpha_half_as_Red_GrPixelConfig:
   1039         case kRGBA_half_GrPixelConfig:
   1040             return kMedium_GrSLPrecision;
   1041     }
   1042     SK_ABORT("Unexpected type");
   1043     return kHigh_GrSLPrecision;
   1044 }
   1045 
   1046 static inline GrPixelConfigIsClamped GrGetPixelConfigIsClamped(GrPixelConfig config) {
   1047     return GrPixelConfigIsFloatingPoint(config) ? GrPixelConfigIsClamped::kNo
   1048                                                 : GrPixelConfigIsClamped::kYes;
   1049 }
   1050 
   1051 class GrReleaseProcHelper : public SkRefCnt {
   1052 public:
   1053     // These match the definitions in SkImage, from whence they came
   1054     typedef void* ReleaseCtx;
   1055     typedef void (*ReleaseProc)(ReleaseCtx);
   1056 
   1057     GrReleaseProcHelper(ReleaseProc proc, ReleaseCtx ctx) : fReleaseProc(proc), fReleaseCtx(ctx) {}
   1058     ~GrReleaseProcHelper() override {
   1059         fReleaseProc(fReleaseCtx);
   1060     }
   1061 
   1062 private:
   1063     ReleaseProc fReleaseProc;
   1064     ReleaseCtx  fReleaseCtx;
   1065 };
   1066 
   1067 #endif
   1068