• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "include/core/SkImage.h"
13 #include "include/core/SkImageInfo.h"
14 #include "include/core/SkPath.h"
15 #include "include/core/SkRefCnt.h"
16 #include "include/gpu/GrTypes.h"
17 #include "include/private/SkImageInfoPriv.h"
18 #include "include/private/SkMacros.h"
19 
20 class GrBackendFormat;
21 class GrCaps;
22 class GrSurfaceProxy;
23 
24 // The old libstdc++ uses the draft name "monotonic_clock" rather than "steady_clock". This might
25 // not actually be monotonic, depending on how libstdc++ was built. However, this is only currently
26 // used for idle resource purging so it shouldn't cause a correctness problem.
27 #if defined(__GLIBCXX__) && (__GLIBCXX__ < 20130000)
28 using GrStdSteadyClock = std::chrono::monotonic_clock;
29 #else
30 using GrStdSteadyClock = std::chrono::steady_clock;
31 #endif
32 
33 /**
34  *  divide, rounding up
35  */
36 
GrSizeDivRoundUp(size_t x,size_t y)37 static inline constexpr size_t GrSizeDivRoundUp(size_t x, size_t y) { return (x + (y - 1)) / y; }
38 
39 /**
40  * Geometric primitives used for drawing.
41  */
42 enum class GrPrimitiveType : uint8_t {
43     kTriangles,
44     kTriangleStrip,
45     kPoints,
46     kLines,          // 1 pix wide only
47     kLineStrip,      // 1 pix wide only
48     kPatches,
49     kPath
50 };
51 static constexpr int kNumGrPrimitiveTypes = (int)GrPrimitiveType::kPath + 1;
52 
GrIsPrimTypeLines(GrPrimitiveType type)53 static constexpr bool GrIsPrimTypeLines(GrPrimitiveType type) {
54     return GrPrimitiveType::kLines == type || GrPrimitiveType::kLineStrip == type;
55 }
56 
57 enum class GrPrimitiveRestart : bool {
58     kNo = false,
59     kYes = true
60 };
61 
62 /**
63  * Should a created surface be texturable?
64  */
65 enum class GrTexturable : bool {
66     kNo = false,
67     kYes = true
68 };
69 
70 // A DDL recorder has its own proxy provider and proxy cache. This enum indicates if
71 // a given proxy provider is one of these special ones.
72 enum class GrDDLProvider : bool {
73     kNo = false,
74     kYes = true
75 };
76 
77 /**
78  *  Formats for masks, used by the font cache. Important that these are 0-based.
79  */
80 enum GrMaskFormat {
81     kA8_GrMaskFormat,    //!< 1-byte per pixel
82     kA565_GrMaskFormat,  //!< 2-bytes per pixel, RGB represent 3-channel LCD coverage
83     kARGB_GrMaskFormat,  //!< 4-bytes per pixel, color format
84 
85     kLast_GrMaskFormat = kARGB_GrMaskFormat
86 };
87 static const int kMaskFormatCount = kLast_GrMaskFormat + 1;
88 
89 /**
90  *  Return the number of bytes-per-pixel for the specified mask format.
91  */
GrMaskFormatBytesPerPixel(GrMaskFormat format)92 inline constexpr int GrMaskFormatBytesPerPixel(GrMaskFormat format) {
93     SkASSERT(format < kMaskFormatCount);
94     // kA8   (0) -> 1
95     // kA565 (1) -> 2
96     // kARGB (2) -> 4
97     static_assert(kA8_GrMaskFormat == 0, "enum_order_dependency");
98     static_assert(kA565_GrMaskFormat == 1, "enum_order_dependency");
99     static_assert(kARGB_GrMaskFormat == 2, "enum_order_dependency");
100 
101     return SkTo<int>(1u << format);
102 }
103 
104 /** Ownership rules for external GPU resources imported into Skia. */
105 enum GrWrapOwnership {
106     /** Skia will assume the client will keep the resource alive and Skia will not free it. */
107     kBorrow_GrWrapOwnership,
108 
109     /** Skia will assume ownership of the resource and free it. */
110     kAdopt_GrWrapOwnership,
111 };
112 
113 enum class GrWrapCacheable : bool {
114     /**
115      * The wrapped resource will be removed from the cache as soon as it becomes purgeable. It may
116      * still be assigned and found by a unique key, but the presence of the key will not be used to
117      * keep the resource alive when it has no references.
118      */
119     kNo = false,
120     /**
121      * The wrapped resource is allowed to remain in the GrResourceCache when it has no references
122      * but has a unique key. Such resources should only be given unique keys when it is known that
123      * the key will eventually be removed from the resource or invalidated via the message bus.
124      */
125     kYes = true
126 };
127 
128 enum class GrBudgetedType : uint8_t {
129     /** The resource is budgeted and is subject to purging under budget pressure. */
130     kBudgeted,
131     /**
132      * The resource is unbudgeted and is purged as soon as it has no refs regardless of whether
133      * it has a unique or scratch key.
134      */
135     kUnbudgetedUncacheable,
136     /**
137      * The resource is unbudgeted and is allowed to remain in the cache with no refs if it
138      * has a unique key. Scratch keys are ignored.
139      */
140     kUnbudgetedCacheable,
141 };
142 
143 enum class GrScissorTest : bool {
144     kDisabled = false,
145     kEnabled = true
146 };
147 
148 /*
149  * Used to say whether texture is backed by memory.
150  */
151 enum class GrMemoryless : bool {
152     /**
153      * The texture will be allocated normally and will affect memory budgets.
154      */
155     kNo = false,
156     /**
157      * The texture will be not use GPU memory and will not affect memory budgets.
158      */
159     kYes = true
160 };
161 
162 struct GrMipLevel {
163     const void* fPixels = nullptr;
164     size_t fRowBytes = 0;
165     // This may be used to keep fPixels from being freed while a GrMipLevel exists.
166     sk_sp<SkData> fOptionalStorage;
167 };
168 
169 enum class GrSemaphoreWrapType {
170     kWillSignal,
171     kWillWait,
172 };
173 
174 /**
175  * This enum is used to specify the load operation to be used when an OpsTask/GrOpsRenderPass
176  * begins execution.
177  */
178 enum class GrLoadOp {
179     kLoad,
180     kClear,
181     kDiscard,
182 };
183 
184 /**
185  * This enum is used to specify the store operation to be used when an OpsTask/GrOpsRenderPass
186  * ends execution.
187  */
188 enum class GrStoreOp {
189     kStore,
190     kDiscard,
191 };
192 
193 /**
194  * Used to control antialiasing in draw calls.
195  */
196 enum class GrAA : bool {
197     kNo = false,
198     kYes = true
199 };
200 
201 enum class GrFillRule : bool {
202     kNonzero,
203     kEvenOdd
204 };
205 
GrFillRuleForPathFillType(SkPathFillType fillType)206 inline GrFillRule GrFillRuleForPathFillType(SkPathFillType fillType) {
207     switch (fillType) {
208         case SkPathFillType::kWinding:
209         case SkPathFillType::kInverseWinding:
210             return GrFillRule::kNonzero;
211         case SkPathFillType::kEvenOdd:
212         case SkPathFillType::kInverseEvenOdd:
213             return GrFillRule::kEvenOdd;
214     }
215     SkUNREACHABLE;
216 }
217 
GrFillRuleForSkPath(const SkPath & path)218 inline GrFillRule GrFillRuleForSkPath(const SkPath& path) {
219     return GrFillRuleForPathFillType(path.getFillType());
220 }
221 
222 /** This enum indicates the type of antialiasing to be performed. */
223 enum class GrAAType : unsigned {
224     /** No antialiasing */
225     kNone,
226     /** Use fragment shader code to blend with a fractional pixel coverage. */
227     kCoverage,
228     /** Use normal MSAA. */
229     kMSAA,
230 
231     kLast = kMSAA
232 };
233 static const int kGrAATypeCount = static_cast<int>(GrAAType::kLast) + 1;
234 
GrAATypeIsHW(GrAAType type)235 static constexpr bool GrAATypeIsHW(GrAAType type) {
236     switch (type) {
237         case GrAAType::kNone:
238             return false;
239         case GrAAType::kCoverage:
240             return false;
241         case GrAAType::kMSAA:
242             return true;
243     }
244     SkUNREACHABLE;
245 }
246 
247 /**
248  * Some pixel configs are inherently clamped to [0,1], some are allowed to go outside that range,
249  * and some are FP but manually clamped in the XP.
250  */
251 enum class GrClampType {
252     kAuto,    // Normalized, fixed-point configs
253     kManual,  // Clamped FP configs
254     kNone,    // Normal (unclamped) FP configs
255 };
256 
257 /**
258  * A number of rectangle/quadrilateral drawing APIs can control anti-aliasing on a per edge basis.
259  * These masks specify which edges are AA'ed. The intent for this is to support tiling with seamless
260  * boundaries, where the inner edges are non-AA and the outer edges are AA. Regular draws (where AA
261  * is specified by GrAA) is almost equivalent to kNone or kAll, with the exception of how MSAA is
262  * handled.
263  *
264  * When tiling and there is MSAA, mixed edge rectangles are processed with MSAA, so in order for the
265  * tiled edges to remain seamless, inner tiles with kNone must also be processed with MSAA. In
266  * regular drawing, however, kNone should disable MSAA (if it's supported) to match the expected
267  * appearance.
268  *
269  * Therefore, APIs that use per-edge AA flags also take a GrAA value so that they can differentiate
270  * between the regular and tiling use case behaviors. Tiling operations should always pass
271  * GrAA::kYes while regular options should pass GrAA based on the SkPaint's anti-alias state.
272  *
273  * These values are identical to SkCanvas::QuadAAFlags.
274  */
275 enum class GrQuadAAFlags {
276     kLeft   = 0b0001,
277     kTop    = 0b0010,
278     kRight  = 0b0100,
279     kBottom = 0b1000,
280 
281     kNone = 0b0000,
282     kAll  = 0b1111,
283 };
284 
GR_MAKE_BITFIELD_CLASS_OPS(GrQuadAAFlags)285 GR_MAKE_BITFIELD_CLASS_OPS(GrQuadAAFlags)
286 
287 static inline GrQuadAAFlags SkToGrQuadAAFlags(unsigned flags) {
288     return static_cast<GrQuadAAFlags>(flags);
289 }
290 
291 /**
292  * Types of shader-language-specific boxed variables we can create.
293  */
294 enum GrSLType {
295     kVoid_GrSLType,
296     kBool_GrSLType,
297     kBool2_GrSLType,
298     kBool3_GrSLType,
299     kBool4_GrSLType,
300     kShort_GrSLType,
301     kShort2_GrSLType,
302     kShort3_GrSLType,
303     kShort4_GrSLType,
304     kUShort_GrSLType,
305     kUShort2_GrSLType,
306     kUShort3_GrSLType,
307     kUShort4_GrSLType,
308     kFloat_GrSLType,
309     kFloat2_GrSLType,
310     kFloat3_GrSLType,
311     kFloat4_GrSLType,
312     kFloat2x2_GrSLType,
313     kFloat3x3_GrSLType,
314     kFloat4x4_GrSLType,
315     kHalf_GrSLType,
316     kHalf2_GrSLType,
317     kHalf3_GrSLType,
318     kHalf4_GrSLType,
319     kHalf2x2_GrSLType,
320     kHalf3x3_GrSLType,
321     kHalf4x4_GrSLType,
322     kInt_GrSLType,
323     kInt2_GrSLType,
324     kInt3_GrSLType,
325     kInt4_GrSLType,
326     kUInt_GrSLType,
327     kUInt2_GrSLType,
328     kUInt3_GrSLType,
329     kUInt4_GrSLType,
330     kTexture2DSampler_GrSLType,
331     kTextureExternalSampler_GrSLType,
332     kTexture2DRectSampler_GrSLType,
333     kTexture2D_GrSLType,
334     kSampler_GrSLType,
335     kInput_GrSLType,
336 
337     kLast_GrSLType = kInput_GrSLType
338 };
339 static const int kGrSLTypeCount = kLast_GrSLType + 1;
340 
341 /**
342  * The type of texture. Backends other than GL currently only use the 2D value but the type must
343  * still be known at the API-neutral layer as it used to determine whether MIP maps, renderability,
344  * and sampling parameters are legal for proxies that will be instantiated with wrapped textures.
345  */
346 enum class GrTextureType {
347     kNone,
348     k2D,
349     /* Rectangle uses unnormalized texture coordinates. */
350     kRectangle,
351     kExternal
352 };
353 
354 enum GrShaderType {
355     kVertex_GrShaderType,
356     kFragment_GrShaderType,
357 
358     kLastkFragment_GrShaderType = kFragment_GrShaderType
359 };
360 static const int kGrShaderTypeCount = kLastkFragment_GrShaderType + 1;
361 
362 enum GrShaderFlags {
363     kNone_GrShaderFlags          = 0,
364     kVertex_GrShaderFlag         = 1 << 0,
365     kTessControl_GrShaderFlag    = 1 << 1,
366     kTessEvaluation_GrShaderFlag = 1 << 2,
367     kFragment_GrShaderFlag       = 1 << 3
368 };
SK_MAKE_BITFIELD_OPS(GrShaderFlags)369 SK_MAKE_BITFIELD_OPS(GrShaderFlags)
370 
371 /** Is the shading language type float (including vectors/matrices)? */
372 static constexpr bool GrSLTypeIsFloatType(GrSLType type) {
373     switch (type) {
374         case kFloat_GrSLType:
375         case kFloat2_GrSLType:
376         case kFloat3_GrSLType:
377         case kFloat4_GrSLType:
378         case kFloat2x2_GrSLType:
379         case kFloat3x3_GrSLType:
380         case kFloat4x4_GrSLType:
381         case kHalf_GrSLType:
382         case kHalf2_GrSLType:
383         case kHalf3_GrSLType:
384         case kHalf4_GrSLType:
385         case kHalf2x2_GrSLType:
386         case kHalf3x3_GrSLType:
387         case kHalf4x4_GrSLType:
388             return true;
389 
390         case kVoid_GrSLType:
391         case kTexture2DSampler_GrSLType:
392         case kTextureExternalSampler_GrSLType:
393         case kTexture2DRectSampler_GrSLType:
394         case kBool_GrSLType:
395         case kBool2_GrSLType:
396         case kBool3_GrSLType:
397         case kBool4_GrSLType:
398         case kShort_GrSLType:
399         case kShort2_GrSLType:
400         case kShort3_GrSLType:
401         case kShort4_GrSLType:
402         case kUShort_GrSLType:
403         case kUShort2_GrSLType:
404         case kUShort3_GrSLType:
405         case kUShort4_GrSLType:
406         case kInt_GrSLType:
407         case kInt2_GrSLType:
408         case kInt3_GrSLType:
409         case kInt4_GrSLType:
410         case kUInt_GrSLType:
411         case kUInt2_GrSLType:
412         case kUInt3_GrSLType:
413         case kUInt4_GrSLType:
414         case kTexture2D_GrSLType:
415         case kSampler_GrSLType:
416         case kInput_GrSLType:
417             return false;
418     }
419     SkUNREACHABLE;
420 }
421 
422 /** Is the shading language type integral (including vectors)? */
GrSLTypeIsIntegralType(GrSLType type)423 static constexpr bool GrSLTypeIsIntegralType(GrSLType type) {
424     switch (type) {
425         case kShort_GrSLType:
426         case kShort2_GrSLType:
427         case kShort3_GrSLType:
428         case kShort4_GrSLType:
429         case kUShort_GrSLType:
430         case kUShort2_GrSLType:
431         case kUShort3_GrSLType:
432         case kUShort4_GrSLType:
433         case kInt_GrSLType:
434         case kInt2_GrSLType:
435         case kInt3_GrSLType:
436         case kInt4_GrSLType:
437         case kUInt_GrSLType:
438         case kUInt2_GrSLType:
439         case kUInt3_GrSLType:
440         case kUInt4_GrSLType:
441             return true;
442 
443         case kFloat_GrSLType:
444         case kFloat2_GrSLType:
445         case kFloat3_GrSLType:
446         case kFloat4_GrSLType:
447         case kFloat2x2_GrSLType:
448         case kFloat3x3_GrSLType:
449         case kFloat4x4_GrSLType:
450         case kHalf_GrSLType:
451         case kHalf2_GrSLType:
452         case kHalf3_GrSLType:
453         case kHalf4_GrSLType:
454         case kHalf2x2_GrSLType:
455         case kHalf3x3_GrSLType:
456         case kHalf4x4_GrSLType:
457         case kVoid_GrSLType:
458         case kTexture2DSampler_GrSLType:
459         case kTextureExternalSampler_GrSLType:
460         case kTexture2DRectSampler_GrSLType:
461         case kBool_GrSLType:
462         case kBool2_GrSLType:
463         case kBool3_GrSLType:
464         case kBool4_GrSLType:
465         case kTexture2D_GrSLType:
466         case kSampler_GrSLType:
467         case kInput_GrSLType:
468             return false;
469     }
470     SkUNREACHABLE;
471 }
472 
473 /**
474  * Is the shading language type supported as a uniform (ie, does it have a corresponding set
475  * function on GrGLSLProgramDataManager)?
476  */
GrSLTypeCanBeUniformValue(GrSLType type)477 static constexpr bool GrSLTypeCanBeUniformValue(GrSLType type) {
478     return GrSLTypeIsFloatType(type) || GrSLTypeIsIntegralType(type);
479 }
480 
481 /** If the type represents a single value or vector return the vector length, else -1. */
GrSLTypeVecLength(GrSLType type)482 static constexpr int GrSLTypeVecLength(GrSLType type) {
483     switch (type) {
484         case kFloat_GrSLType:
485         case kHalf_GrSLType:
486         case kBool_GrSLType:
487         case kShort_GrSLType:
488         case kUShort_GrSLType:
489         case kInt_GrSLType:
490         case kUInt_GrSLType:
491             return 1;
492 
493         case kFloat2_GrSLType:
494         case kHalf2_GrSLType:
495         case kBool2_GrSLType:
496         case kShort2_GrSLType:
497         case kUShort2_GrSLType:
498         case kInt2_GrSLType:
499         case kUInt2_GrSLType:
500             return 2;
501 
502         case kFloat3_GrSLType:
503         case kHalf3_GrSLType:
504         case kBool3_GrSLType:
505         case kShort3_GrSLType:
506         case kUShort3_GrSLType:
507         case kInt3_GrSLType:
508         case kUInt3_GrSLType:
509             return 3;
510 
511         case kFloat4_GrSLType:
512         case kHalf4_GrSLType:
513         case kBool4_GrSLType:
514         case kShort4_GrSLType:
515         case kUShort4_GrSLType:
516         case kInt4_GrSLType:
517         case kUInt4_GrSLType:
518             return 4;
519 
520         case kFloat2x2_GrSLType:
521         case kFloat3x3_GrSLType:
522         case kFloat4x4_GrSLType:
523         case kHalf2x2_GrSLType:
524         case kHalf3x3_GrSLType:
525         case kHalf4x4_GrSLType:
526         case kVoid_GrSLType:
527         case kTexture2DSampler_GrSLType:
528         case kTextureExternalSampler_GrSLType:
529         case kTexture2DRectSampler_GrSLType:
530         case kTexture2D_GrSLType:
531         case kSampler_GrSLType:
532         case kInput_GrSLType:
533             return -1;
534     }
535     SkUNREACHABLE;
536 }
537 
GrSLCombinedSamplerTypeForTextureType(GrTextureType type)538 static inline GrSLType GrSLCombinedSamplerTypeForTextureType(GrTextureType type) {
539     switch (type) {
540         case GrTextureType::k2D:
541             return kTexture2DSampler_GrSLType;
542         case GrTextureType::kRectangle:
543             return kTexture2DRectSampler_GrSLType;
544         case GrTextureType::kExternal:
545             return kTextureExternalSampler_GrSLType;
546         default:
547             SK_ABORT("Unexpected texture type");
548     }
549 }
550 
551 /** Rectangle and external textures only support the clamp wrap mode and do not support
552  *  MIP maps.
553  */
GrTextureTypeHasRestrictedSampling(GrTextureType type)554 static inline bool GrTextureTypeHasRestrictedSampling(GrTextureType type) {
555     switch (type) {
556         case GrTextureType::k2D:
557             return false;
558         case GrTextureType::kRectangle:
559             return true;
560         case GrTextureType::kExternal:
561             return true;
562         default:
563             SK_ABORT("Unexpected texture type");
564     }
565 }
566 
GrSLTypeIsCombinedSamplerType(GrSLType type)567 static constexpr bool GrSLTypeIsCombinedSamplerType(GrSLType type) {
568     switch (type) {
569         case kTexture2DSampler_GrSLType:
570         case kTextureExternalSampler_GrSLType:
571         case kTexture2DRectSampler_GrSLType:
572             return true;
573 
574         case kVoid_GrSLType:
575         case kFloat_GrSLType:
576         case kFloat2_GrSLType:
577         case kFloat3_GrSLType:
578         case kFloat4_GrSLType:
579         case kFloat2x2_GrSLType:
580         case kFloat3x3_GrSLType:
581         case kFloat4x4_GrSLType:
582         case kHalf_GrSLType:
583         case kHalf2_GrSLType:
584         case kHalf3_GrSLType:
585         case kHalf4_GrSLType:
586         case kHalf2x2_GrSLType:
587         case kHalf3x3_GrSLType:
588         case kHalf4x4_GrSLType:
589         case kInt_GrSLType:
590         case kInt2_GrSLType:
591         case kInt3_GrSLType:
592         case kInt4_GrSLType:
593         case kUInt_GrSLType:
594         case kUInt2_GrSLType:
595         case kUInt3_GrSLType:
596         case kUInt4_GrSLType:
597         case kBool_GrSLType:
598         case kBool2_GrSLType:
599         case kBool3_GrSLType:
600         case kBool4_GrSLType:
601         case kShort_GrSLType:
602         case kShort2_GrSLType:
603         case kShort3_GrSLType:
604         case kShort4_GrSLType:
605         case kUShort_GrSLType:
606         case kUShort2_GrSLType:
607         case kUShort3_GrSLType:
608         case kUShort4_GrSLType:
609         case kTexture2D_GrSLType:
610         case kSampler_GrSLType:
611         case kInput_GrSLType:
612             return false;
613     }
614     SkUNREACHABLE;
615 }
616 
617 //////////////////////////////////////////////////////////////////////////////
618 
619 /**
620  * Types used to describe format of vertices in arrays.
621  */
622 enum GrVertexAttribType {
623     kFloat_GrVertexAttribType = 0,
624     kFloat2_GrVertexAttribType,
625     kFloat3_GrVertexAttribType,
626     kFloat4_GrVertexAttribType,
627     kHalf_GrVertexAttribType,
628     kHalf2_GrVertexAttribType,
629     kHalf4_GrVertexAttribType,
630 
631     kInt2_GrVertexAttribType,   // vector of 2 32-bit ints
632     kInt3_GrVertexAttribType,   // vector of 3 32-bit ints
633     kInt4_GrVertexAttribType,   // vector of 4 32-bit ints
634 
635 
636     kByte_GrVertexAttribType,  // signed byte
637     kByte2_GrVertexAttribType, // vector of 2 8-bit signed bytes
638     kByte4_GrVertexAttribType, // vector of 4 8-bit signed bytes
639     kUByte_GrVertexAttribType,  // unsigned byte
640     kUByte2_GrVertexAttribType, // vector of 2 8-bit unsigned bytes
641     kUByte4_GrVertexAttribType, // vector of 4 8-bit unsigned bytes
642 
643     kUByte_norm_GrVertexAttribType,  // unsigned byte, e.g. coverage, 0 -> 0.0f, 255 -> 1.0f.
644     kUByte4_norm_GrVertexAttribType, // vector of 4 unsigned bytes, e.g. colors, 0 -> 0.0f,
645                                      // 255 -> 1.0f.
646 
647     kShort2_GrVertexAttribType,       // vector of 2 16-bit shorts.
648     kShort4_GrVertexAttribType,       // vector of 4 16-bit shorts.
649 
650     kUShort2_GrVertexAttribType,      // vector of 2 unsigned shorts. 0 -> 0, 65535 -> 65535.
651     kUShort2_norm_GrVertexAttribType, // vector of 2 unsigned shorts. 0 -> 0.0f, 65535 -> 1.0f.
652 
653     kInt_GrVertexAttribType,
654     kUInt_GrVertexAttribType,
655 
656     kUShort_norm_GrVertexAttribType,
657 
658     kUShort4_norm_GrVertexAttribType, // vector of 4 unsigned shorts. 0 -> 0.0f, 65535 -> 1.0f.
659 
660     kLast_GrVertexAttribType = kUShort4_norm_GrVertexAttribType
661 };
662 static const int kGrVertexAttribTypeCount = kLast_GrVertexAttribType + 1;
663 
664 //////////////////////////////////////////////////////////////////////////////
665 
666 /**
667  * We have coverage effects that clip rendering to the edge of some geometric primitive.
668  * This enum specifies how that clipping is performed. Not all factories that take a
669  * GrClipEdgeType will succeed with all values and it is up to the caller to verify success.
670  */
671 enum class GrClipEdgeType {
672     kFillBW,
673     kFillAA,
674     kInverseFillBW,
675     kInverseFillAA,
676 
677     kLast = kInverseFillAA
678 };
679 static const int kGrClipEdgeTypeCnt = (int) GrClipEdgeType::kLast + 1;
680 
GrClipEdgeTypeIsFill(const GrClipEdgeType edgeType)681 static constexpr bool GrClipEdgeTypeIsFill(const GrClipEdgeType edgeType) {
682     return (GrClipEdgeType::kFillAA == edgeType || GrClipEdgeType::kFillBW == edgeType);
683 }
684 
GrClipEdgeTypeIsInverseFill(const GrClipEdgeType edgeType)685 static constexpr bool GrClipEdgeTypeIsInverseFill(const GrClipEdgeType edgeType) {
686     return (GrClipEdgeType::kInverseFillAA == edgeType ||
687             GrClipEdgeType::kInverseFillBW == edgeType);
688 }
689 
GrClipEdgeTypeIsAA(const GrClipEdgeType edgeType)690 static constexpr bool GrClipEdgeTypeIsAA(const GrClipEdgeType edgeType) {
691     return (GrClipEdgeType::kFillBW != edgeType &&
692             GrClipEdgeType::kInverseFillBW != edgeType);
693 }
694 
GrInvertClipEdgeType(const GrClipEdgeType edgeType)695 static inline GrClipEdgeType GrInvertClipEdgeType(const GrClipEdgeType edgeType) {
696     switch (edgeType) {
697         case GrClipEdgeType::kFillBW:
698             return GrClipEdgeType::kInverseFillBW;
699         case GrClipEdgeType::kFillAA:
700             return GrClipEdgeType::kInverseFillAA;
701         case GrClipEdgeType::kInverseFillBW:
702             return GrClipEdgeType::kFillBW;
703         case GrClipEdgeType::kInverseFillAA:
704             return GrClipEdgeType::kFillAA;
705     }
706     SkUNREACHABLE;
707 }
708 
709 /**
710  * Indicates the type of pending IO operations that can be recorded for gpu resources.
711  */
712 enum GrIOType {
713     kRead_GrIOType,
714     kWrite_GrIOType,
715     kRW_GrIOType
716 };
717 
718 /**
719  * Indicates the type of data that a GPU buffer will be used for.
720  */
721 enum class GrGpuBufferType {
722     kVertex,
723     kIndex,
724     kDrawIndirect,
725     kXferCpuToGpu,
726     kXferGpuToCpu,
727     kUniform,
728 };
729 static const int kGrGpuBufferTypeCount = static_cast<int>(GrGpuBufferType::kUniform) + 1;
730 
731 /**
732  * Provides a performance hint regarding the frequency at which a data store will be accessed.
733  */
734 enum GrAccessPattern {
735     /** Data store will be respecified repeatedly and used many times. */
736     kDynamic_GrAccessPattern,
737     /** Data store will be specified once and used many times. (Thus disqualified from caching.) */
738     kStatic_GrAccessPattern,
739     /** Data store will be specified once and used at most a few times. (Also can't be cached.) */
740     kStream_GrAccessPattern,
741 
742     kLast_GrAccessPattern = kStream_GrAccessPattern
743 };
744 
745 // Flags shared between the GrSurface & GrSurfaceProxy class hierarchies
746 enum class GrInternalSurfaceFlags {
747     kNone                           = 0,
748 
749     // Texture-level
750 
751     // Means the pixels in the texture are read-only. Cannot also be a GrRenderTarget[Proxy].
752     kReadOnly                       = 1 << 0,
753 
754     // RT-level
755 
756     // This flag is for use with GL only. It tells us that the internal render target wraps FBO 0.
757     kGLRTFBOIDIs0                   = 1 << 1,
758 
759     // This means the render target is multisampled, and internally holds a non-msaa texture for
760     // resolving into. The render target resolves itself by blitting into this internal texture.
761     // (asTexture() might or might not return the internal texture, but if it does, we always
762     // resolve the render target before accessing this texture's data.)
763     kRequiresManualMSAAResolve      = 1 << 2,
764 
765     // This means the pixels in the render target are write-only. This is used for Dawn and Metal
766     // swap chain targets which can be rendered to, but not read or copied.
767     kFramebufferOnly                = 1 << 3,
768 
769     // This is a Vulkan only flag. If set the surface can be used as an input attachment in a
770     // shader. This is used for doing in shader blending where we want to sample from the same
771     // image we are drawing to.
772     kVkRTSupportsInputAttachment    = 1 << 4,
773 };
774 
775 GR_MAKE_BITFIELD_CLASS_OPS(GrInternalSurfaceFlags)
776 
777 // 'GR_MAKE_BITFIELD_CLASS_OPS' defines the & operator on GrInternalSurfaceFlags to return bool.
778 // We want to find the bitwise & with these masks, so we declare them as ints.
779 constexpr static int kGrInternalTextureFlagsMask = static_cast<int>(
780         GrInternalSurfaceFlags::kReadOnly);
781 
782 // We don't include kVkRTSupportsInputAttachment in this mask since we check it manually. We don't
783 // require that both the surface and proxy have matching values for this flag. Instead we require
784 // if the proxy has it set then the surface must also have it set. All other flags listed here must
785 // match on the proxy and surface.
786 // TODO: Add back kFramebufferOnly flag here once we update SkSurfaceCharacterization to take it
787 // as a flag. skbug.com/10672
788 constexpr static int kGrInternalRenderTargetFlagsMask = static_cast<int>(
789         GrInternalSurfaceFlags::kGLRTFBOIDIs0 |
790         GrInternalSurfaceFlags::kRequiresManualMSAAResolve/* |
791         GrInternalSurfaceFlags::kFramebufferOnly*/);
792 
793 constexpr static int kGrInternalTextureRenderTargetFlagsMask =
794         kGrInternalTextureFlagsMask | kGrInternalRenderTargetFlagsMask;
795 
796 #ifdef SK_DEBUG
797 // Takes a pointer to a GrCaps, and will suppress prints if required
798 #define GrCapsDebugf(caps, ...)  if (!(caps)->suppressPrints()) SkDebugf(__VA_ARGS__)
799 #else
800 #define GrCapsDebugf(caps, ...) do {} while (0)
801 #endif
802 
803 /**
804  * Specifies if the holder owns the backend, OpenGL or Vulkan, object.
805  */
806 enum class GrBackendObjectOwnership : bool {
807     /** Holder does not destroy the backend object. */
808     kBorrowed = false,
809     /** Holder destroys the backend object. */
810     kOwned = true
811 };
812 
813 /*
814  * Object for CPU-GPU synchronization
815  */
816 typedef uint64_t GrFence;
817 
818 /**
819  * Used to include or exclude specific GPU path renderers for testing purposes.
820  */
821 enum class GpuPathRenderers {
822     kNone              =   0,  // Always use software masks and/or DefaultPathRenderer.
823     kDashLine          =   1 << 0,
824     kAtlas             =   1 << 1,
825     kTessellation      =   1 << 2,
826     kCoverageCounting  =   1 << 3,
827     kAAHairline        =   1 << 4,
828     kAAConvex          =   1 << 5,
829     kAALinearizing     =   1 << 6,
830     kSmall             =   1 << 7,
831     kTriangulating     =   1 << 8,
832     kDefault           = ((1 << 9) - 1)  // All path renderers.
833 };
834 
835 /**
836  * Used to describe the current state of Mips on a GrTexture
837  */
838 enum class GrMipmapStatus {
839     kNotAllocated, // Mips have not been allocated
840     kDirty,        // Mips are allocated but the full mip tree does not have valid data
841     kValid,        // All levels fully allocated and have valid data in them
842 };
843 
844 GR_MAKE_BITFIELD_CLASS_OPS(GpuPathRenderers)
845 
846 /**
847  * Like SkColorType this describes a layout of pixel data in CPU memory. It specifies the channels,
848  * their type, and width. This exists so that the GPU backend can have private types that have no
849  * analog in the public facing SkColorType enum and omit types not implemented in the GPU backend.
850  * It does not refer to a texture format and the mapping to texture formats may be many-to-many.
851  * It does not specify the sRGB encoding of the stored values. The components are listed in order of
852  * where they appear in memory. In other words the first component listed is in the low bits and
853  * the last component in the high bits.
854  */
855 enum class GrColorType {
856     kUnknown,
857     kAlpha_8,
858     kBGR_565,
859     kABGR_4444,  // This name differs from SkColorType. kARGB_4444_SkColorType is misnamed.
860     kRGBA_8888,
861     kRGBA_8888_SRGB,
862     kRGB_888x,
863     kRG_88,
864     kBGRA_8888,
865     kRGBA_1010102,
866     kBGRA_1010102,
867     kGray_8,
868     kGrayAlpha_88,
869     kAlpha_F16,
870     kRGBA_F16,
871     kRGBA_F16_Clamped,
872     kRGBA_F32,
873 
874     kAlpha_16,
875     kRG_1616,
876     kRG_F16,
877     kRGBA_16161616,
878 
879     // Unusual types that come up after reading back in cases where we are reassigning the meaning
880     // of a texture format's channels to use for a particular color format but have to read back the
881     // data to a full RGBA quadruple. (e.g. using a R8 texture format as A8 color type but the API
882     // only supports reading to RGBA8.) None of these have SkColorType equivalents.
883     kAlpha_8xxx,
884     kAlpha_F32xxx,
885     kGray_8xxx,
886 
887     // Types used to initialize backend textures.
888     kRGB_888,
889     kR_8,
890     kR_16,
891     kR_F16,
892     kGray_F16,
893     kBGRA_4444,
894     kARGB_4444,
895 
896     kLast = kARGB_4444
897 };
898 
899 static const int kGrColorTypeCnt = static_cast<int>(GrColorType::kLast) + 1;
900 
GrColorTypeToSkColorType(GrColorType ct)901 static constexpr SkColorType GrColorTypeToSkColorType(GrColorType ct) {
902     switch (ct) {
903         case GrColorType::kUnknown:          return kUnknown_SkColorType;
904         case GrColorType::kAlpha_8:          return kAlpha_8_SkColorType;
905         case GrColorType::kBGR_565:          return kRGB_565_SkColorType;
906         case GrColorType::kABGR_4444:        return kARGB_4444_SkColorType;
907         case GrColorType::kRGBA_8888:        return kRGBA_8888_SkColorType;
908         case GrColorType::kRGBA_8888_SRGB:   return kSRGBA_8888_SkColorType;
909         case GrColorType::kRGB_888x:         return kRGB_888x_SkColorType;
910         case GrColorType::kRG_88:            return kR8G8_unorm_SkColorType;
911         case GrColorType::kBGRA_8888:        return kBGRA_8888_SkColorType;
912         case GrColorType::kRGBA_1010102:     return kRGBA_1010102_SkColorType;
913         case GrColorType::kBGRA_1010102:     return kBGRA_1010102_SkColorType;
914         case GrColorType::kGray_8:           return kGray_8_SkColorType;
915         case GrColorType::kGrayAlpha_88:     return kUnknown_SkColorType;
916         case GrColorType::kAlpha_F16:        return kA16_float_SkColorType;
917         case GrColorType::kRGBA_F16:         return kRGBA_F16_SkColorType;
918         case GrColorType::kRGBA_F16_Clamped: return kRGBA_F16Norm_SkColorType;
919         case GrColorType::kRGBA_F32:         return kRGBA_F32_SkColorType;
920         case GrColorType::kAlpha_8xxx:       return kUnknown_SkColorType;
921         case GrColorType::kAlpha_F32xxx:     return kUnknown_SkColorType;
922         case GrColorType::kGray_8xxx:        return kUnknown_SkColorType;
923         case GrColorType::kAlpha_16:         return kA16_unorm_SkColorType;
924         case GrColorType::kRG_1616:          return kR16G16_unorm_SkColorType;
925         case GrColorType::kRGBA_16161616:    return kR16G16B16A16_unorm_SkColorType;
926         case GrColorType::kRG_F16:           return kR16G16_float_SkColorType;
927         case GrColorType::kRGB_888:          return kUnknown_SkColorType;
928         case GrColorType::kR_8:              return kUnknown_SkColorType;
929         case GrColorType::kR_16:             return kUnknown_SkColorType;
930         case GrColorType::kR_F16:            return kUnknown_SkColorType;
931         case GrColorType::kGray_F16:         return kUnknown_SkColorType;
932         case GrColorType::kARGB_4444:        return kUnknown_SkColorType;
933         case GrColorType::kBGRA_4444:        return kUnknown_SkColorType;
934     }
935     SkUNREACHABLE;
936 }
937 
SkColorTypeToGrColorType(SkColorType ct)938 static constexpr GrColorType SkColorTypeToGrColorType(SkColorType ct) {
939     switch (ct) {
940         case kUnknown_SkColorType:            return GrColorType::kUnknown;
941         case kAlpha_8_SkColorType:            return GrColorType::kAlpha_8;
942         case kRGB_565_SkColorType:            return GrColorType::kBGR_565;
943         case kARGB_4444_SkColorType:          return GrColorType::kABGR_4444;
944         case kRGBA_8888_SkColorType:          return GrColorType::kRGBA_8888;
945         case kSRGBA_8888_SkColorType:         return GrColorType::kRGBA_8888_SRGB;
946         case kRGB_888x_SkColorType:           return GrColorType::kRGB_888x;
947         case kBGRA_8888_SkColorType:          return GrColorType::kBGRA_8888;
948         case kGray_8_SkColorType:             return GrColorType::kGray_8;
949         case kRGBA_F16Norm_SkColorType:       return GrColorType::kRGBA_F16_Clamped;
950         case kRGBA_F16_SkColorType:           return GrColorType::kRGBA_F16;
951         case kRGBA_1010102_SkColorType:       return GrColorType::kRGBA_1010102;
952         case kRGB_101010x_SkColorType:        return GrColorType::kUnknown;
953         case kBGRA_1010102_SkColorType:       return GrColorType::kBGRA_1010102;
954         case kBGR_101010x_SkColorType:        return GrColorType::kUnknown;
955         case kRGBA_F32_SkColorType:           return GrColorType::kRGBA_F32;
956         case kR8G8_unorm_SkColorType:         return GrColorType::kRG_88;
957         case kA16_unorm_SkColorType:          return GrColorType::kAlpha_16;
958         case kR16G16_unorm_SkColorType:       return GrColorType::kRG_1616;
959         case kA16_float_SkColorType:          return GrColorType::kAlpha_F16;
960         case kR16G16_float_SkColorType:       return GrColorType::kRG_F16;
961         case kR16G16B16A16_unorm_SkColorType: return GrColorType::kRGBA_16161616;
962     }
963     SkUNREACHABLE;
964 }
965 
GrColorTypeChannelFlags(GrColorType ct)966 static constexpr uint32_t GrColorTypeChannelFlags(GrColorType ct) {
967     switch (ct) {
968         case GrColorType::kUnknown:          return 0;
969         case GrColorType::kAlpha_8:          return kAlpha_SkColorChannelFlag;
970         case GrColorType::kBGR_565:          return kRGB_SkColorChannelFlags;
971         case GrColorType::kABGR_4444:        return kRGBA_SkColorChannelFlags;
972         case GrColorType::kRGBA_8888:        return kRGBA_SkColorChannelFlags;
973         case GrColorType::kRGBA_8888_SRGB:   return kRGBA_SkColorChannelFlags;
974         case GrColorType::kRGB_888x:         return kRGB_SkColorChannelFlags;
975         case GrColorType::kRG_88:            return kRG_SkColorChannelFlags;
976         case GrColorType::kBGRA_8888:        return kRGBA_SkColorChannelFlags;
977         case GrColorType::kRGBA_1010102:     return kRGBA_SkColorChannelFlags;
978         case GrColorType::kBGRA_1010102:     return kRGBA_SkColorChannelFlags;
979         case GrColorType::kGray_8:           return kGray_SkColorChannelFlag;
980         case GrColorType::kGrayAlpha_88:     return kGrayAlpha_SkColorChannelFlags;
981         case GrColorType::kAlpha_F16:        return kAlpha_SkColorChannelFlag;
982         case GrColorType::kRGBA_F16:         return kRGBA_SkColorChannelFlags;
983         case GrColorType::kRGBA_F16_Clamped: return kRGBA_SkColorChannelFlags;
984         case GrColorType::kRGBA_F32:         return kRGBA_SkColorChannelFlags;
985         case GrColorType::kAlpha_8xxx:       return kAlpha_SkColorChannelFlag;
986         case GrColorType::kAlpha_F32xxx:     return kAlpha_SkColorChannelFlag;
987         case GrColorType::kGray_8xxx:        return kGray_SkColorChannelFlag;
988         case GrColorType::kAlpha_16:         return kAlpha_SkColorChannelFlag;
989         case GrColorType::kRG_1616:          return kRG_SkColorChannelFlags;
990         case GrColorType::kRGBA_16161616:    return kRGBA_SkColorChannelFlags;
991         case GrColorType::kRG_F16:           return kRG_SkColorChannelFlags;
992         case GrColorType::kRGB_888:          return kRGB_SkColorChannelFlags;
993         case GrColorType::kR_8:              return kRed_SkColorChannelFlag;
994         case GrColorType::kR_16:             return kRed_SkColorChannelFlag;
995         case GrColorType::kR_F16:            return kRed_SkColorChannelFlag;
996         case GrColorType::kGray_F16:         return kGray_SkColorChannelFlag;
997         case GrColorType::kARGB_4444:        return kRGBA_SkColorChannelFlags;
998         case GrColorType::kBGRA_4444:        return kRGBA_SkColorChannelFlags;
999     }
1000     SkUNREACHABLE;
1001 }
1002 
1003 /**
1004  * Describes the encoding of channel data in a GrColorType.
1005  */
1006 enum class GrColorTypeEncoding {
1007     kUnorm,
1008     kSRGBUnorm,
1009     // kSnorm,
1010     kFloat,
1011     // kSint
1012     // kUint
1013 };
1014 
1015 /**
1016  * Describes a GrColorType by how many bits are used for each color component and how they are
1017  * encoded. Currently all the non-zero channels share a single GrColorTypeEncoding. This could be
1018  * expanded to store separate encodings and to indicate which bits belong to which components.
1019  */
1020 class GrColorFormatDesc {
1021 public:
MakeRGBA(int rgba,GrColorTypeEncoding e)1022     static constexpr GrColorFormatDesc MakeRGBA(int rgba, GrColorTypeEncoding e) {
1023         return {rgba, rgba, rgba, rgba, 0, e};
1024     }
1025 
MakeRGBA(int rgb,int a,GrColorTypeEncoding e)1026     static constexpr GrColorFormatDesc MakeRGBA(int rgb, int a, GrColorTypeEncoding e) {
1027         return {rgb, rgb, rgb, a, 0, e};
1028     }
1029 
MakeRGB(int rgb,GrColorTypeEncoding e)1030     static constexpr GrColorFormatDesc MakeRGB(int rgb, GrColorTypeEncoding e) {
1031         return {rgb, rgb, rgb, 0, 0, e};
1032     }
1033 
MakeRGB(int r,int g,int b,GrColorTypeEncoding e)1034     static constexpr GrColorFormatDesc MakeRGB(int r, int g, int b, GrColorTypeEncoding e) {
1035         return {r, g, b, 0, 0, e};
1036     }
1037 
MakeAlpha(int a,GrColorTypeEncoding e)1038     static constexpr GrColorFormatDesc MakeAlpha(int a, GrColorTypeEncoding e) {
1039         return {0, 0, 0, a, 0, e};
1040     }
1041 
MakeR(int r,GrColorTypeEncoding e)1042     static constexpr GrColorFormatDesc MakeR(int r, GrColorTypeEncoding e) {
1043         return {r, 0, 0, 0, 0, e};
1044     }
1045 
MakeRG(int rg,GrColorTypeEncoding e)1046     static constexpr GrColorFormatDesc MakeRG(int rg, GrColorTypeEncoding e) {
1047         return {rg, rg, 0, 0, 0, e};
1048     }
1049 
MakeGray(int grayBits,GrColorTypeEncoding e)1050     static constexpr GrColorFormatDesc MakeGray(int grayBits, GrColorTypeEncoding e) {
1051         return {0, 0, 0, 0, grayBits, e};
1052     }
1053 
MakeGrayAlpha(int grayAlpha,GrColorTypeEncoding e)1054     static constexpr GrColorFormatDesc MakeGrayAlpha(int grayAlpha, GrColorTypeEncoding e) {
1055         return {0, 0, 0, 0, grayAlpha, e};
1056     }
1057 
MakeInvalid()1058     static constexpr GrColorFormatDesc MakeInvalid() { return {}; }
1059 
r()1060     constexpr int r() const { return fRBits; }
g()1061     constexpr int g() const { return fGBits; }
b()1062     constexpr int b() const { return fBBits; }
a()1063     constexpr int a() const { return fABits; }
1064     constexpr int operator[](int c) const {
1065         switch (c) {
1066             case 0: return this->r();
1067             case 1: return this->g();
1068             case 2: return this->b();
1069             case 3: return this->a();
1070         }
1071         SkUNREACHABLE;
1072     }
1073 
gray()1074     constexpr int gray() const { return fGrayBits; }
1075 
encoding()1076     constexpr GrColorTypeEncoding encoding() const { return fEncoding; }
1077 
1078 private:
1079     int fRBits = 0;
1080     int fGBits = 0;
1081     int fBBits = 0;
1082     int fABits = 0;
1083     int fGrayBits = 0;
1084     GrColorTypeEncoding fEncoding = GrColorTypeEncoding::kUnorm;
1085 
1086     constexpr GrColorFormatDesc() = default;
1087 
GrColorFormatDesc(int r,int g,int b,int a,int gray,GrColorTypeEncoding encoding)1088     constexpr GrColorFormatDesc(int r, int g, int b, int a, int gray, GrColorTypeEncoding encoding)
1089             : fRBits(r), fGBits(g), fBBits(b), fABits(a), fGrayBits(gray), fEncoding(encoding) {
1090         SkASSERT(r >= 0 && g >= 0 && b >= 0 && a >= 0 && gray >= 0);
1091         SkASSERT(!gray || (!r && !g && !b));
1092         SkASSERT(r || g || b || a || gray);
1093     }
1094 };
1095 
GrGetColorTypeDesc(GrColorType ct)1096 static constexpr GrColorFormatDesc GrGetColorTypeDesc(GrColorType ct) {
1097     switch (ct) {
1098         case GrColorType::kUnknown:
1099             return GrColorFormatDesc::MakeInvalid();
1100         case GrColorType::kAlpha_8:
1101             return GrColorFormatDesc::MakeAlpha(8, GrColorTypeEncoding::kUnorm);
1102         case GrColorType::kBGR_565:
1103             return GrColorFormatDesc::MakeRGB(5, 6, 5, GrColorTypeEncoding::kUnorm);
1104         case GrColorType::kABGR_4444:
1105             return GrColorFormatDesc::MakeRGBA(4, GrColorTypeEncoding::kUnorm);
1106         case GrColorType::kRGBA_8888:
1107             return GrColorFormatDesc::MakeRGBA(8, GrColorTypeEncoding::kUnorm);
1108         case GrColorType::kRGBA_8888_SRGB:
1109             return GrColorFormatDesc::MakeRGBA(8, GrColorTypeEncoding::kSRGBUnorm);
1110         case GrColorType::kRGB_888x:
1111             return GrColorFormatDesc::MakeRGB(8, GrColorTypeEncoding::kUnorm);
1112         case GrColorType::kRG_88:
1113             return GrColorFormatDesc::MakeRG(8, GrColorTypeEncoding::kUnorm);
1114         case GrColorType::kBGRA_8888:
1115             return GrColorFormatDesc::MakeRGBA(8, GrColorTypeEncoding::kUnorm);
1116         case GrColorType::kRGBA_1010102:
1117             return GrColorFormatDesc::MakeRGBA(10, 2, GrColorTypeEncoding::kUnorm);
1118         case GrColorType::kBGRA_1010102:
1119             return GrColorFormatDesc::MakeRGBA(10, 2, GrColorTypeEncoding::kUnorm);
1120         case GrColorType::kGray_8:
1121             return GrColorFormatDesc::MakeGray(8, GrColorTypeEncoding::kUnorm);
1122         case GrColorType::kGrayAlpha_88:
1123             return GrColorFormatDesc::MakeGrayAlpha(8, GrColorTypeEncoding::kUnorm);
1124         case GrColorType::kAlpha_F16:
1125             return GrColorFormatDesc::MakeAlpha(16, GrColorTypeEncoding::kFloat);
1126         case GrColorType::kRGBA_F16:
1127             return GrColorFormatDesc::MakeRGBA(16, GrColorTypeEncoding::kFloat);
1128         case GrColorType::kRGBA_F16_Clamped:
1129             return GrColorFormatDesc::MakeRGBA(16, GrColorTypeEncoding::kFloat);
1130         case GrColorType::kRGBA_F32:
1131             return GrColorFormatDesc::MakeRGBA(32, GrColorTypeEncoding::kFloat);
1132         case GrColorType::kAlpha_8xxx:
1133             return GrColorFormatDesc::MakeAlpha(8, GrColorTypeEncoding::kUnorm);
1134         case GrColorType::kAlpha_F32xxx:
1135             return GrColorFormatDesc::MakeAlpha(32, GrColorTypeEncoding::kFloat);
1136         case GrColorType::kGray_8xxx:
1137             return GrColorFormatDesc::MakeGray(8, GrColorTypeEncoding::kUnorm);
1138         case GrColorType::kAlpha_16:
1139             return GrColorFormatDesc::MakeAlpha(16, GrColorTypeEncoding::kUnorm);
1140         case GrColorType::kRG_1616:
1141             return GrColorFormatDesc::MakeRG(16, GrColorTypeEncoding::kUnorm);
1142         case GrColorType::kRGBA_16161616:
1143             return GrColorFormatDesc::MakeRGBA(16, GrColorTypeEncoding::kUnorm);
1144         case GrColorType::kRG_F16:
1145             return GrColorFormatDesc::MakeRG(16, GrColorTypeEncoding::kFloat);
1146         case GrColorType::kRGB_888:
1147             return GrColorFormatDesc::MakeRGB(8, GrColorTypeEncoding::kUnorm);
1148         case GrColorType::kR_8:
1149             return GrColorFormatDesc::MakeR(8, GrColorTypeEncoding::kUnorm);
1150         case GrColorType::kR_16:
1151             return GrColorFormatDesc::MakeR(16, GrColorTypeEncoding::kUnorm);
1152         case GrColorType::kR_F16:
1153             return GrColorFormatDesc::MakeR(16, GrColorTypeEncoding::kFloat);
1154         case GrColorType::kGray_F16:
1155             return GrColorFormatDesc::MakeGray(16, GrColorTypeEncoding::kFloat);
1156         case GrColorType::kARGB_4444:
1157             return GrColorFormatDesc::MakeRGBA(4, GrColorTypeEncoding::kUnorm);
1158         case GrColorType::kBGRA_4444:
1159             return GrColorFormatDesc::MakeRGBA(4, GrColorTypeEncoding::kUnorm);
1160     }
1161     SkUNREACHABLE;
1162 }
1163 
GrColorTypeClampType(GrColorType colorType)1164 static constexpr GrClampType GrColorTypeClampType(GrColorType colorType) {
1165     if (GrGetColorTypeDesc(colorType).encoding() == GrColorTypeEncoding::kUnorm ||
1166         GrGetColorTypeDesc(colorType).encoding() == GrColorTypeEncoding::kSRGBUnorm) {
1167         return GrClampType::kAuto;
1168     }
1169     return GrColorType::kRGBA_F16_Clamped == colorType ? GrClampType::kManual : GrClampType::kNone;
1170 }
1171 
1172 // Consider a color type "wider" than n if it has more than n bits for any its representable
1173 // channels.
GrColorTypeIsWiderThan(GrColorType colorType,int n)1174 static constexpr bool GrColorTypeIsWiderThan(GrColorType colorType, int n) {
1175     SkASSERT(n > 0);
1176     auto desc = GrGetColorTypeDesc(colorType);
1177     return (desc.r() && desc.r() > n )||
1178            (desc.g() && desc.g() > n) ||
1179            (desc.b() && desc.b() > n) ||
1180            (desc.a() && desc.a() > n) ||
1181            (desc.gray() && desc.gray() > n);
1182 }
1183 
GrColorTypeIsAlphaOnly(GrColorType ct)1184 static constexpr bool GrColorTypeIsAlphaOnly(GrColorType ct) {
1185     return GrColorTypeChannelFlags(ct) == kAlpha_SkColorChannelFlag;
1186 }
1187 
GrColorTypeHasAlpha(GrColorType ct)1188 static constexpr bool GrColorTypeHasAlpha(GrColorType ct) {
1189     return GrColorTypeChannelFlags(ct) & kAlpha_SkColorChannelFlag;
1190 }
1191 
GrColorTypeBytesPerPixel(GrColorType ct)1192 static constexpr size_t GrColorTypeBytesPerPixel(GrColorType ct) {
1193     switch (ct) {
1194         case GrColorType::kUnknown:          return 0;
1195         case GrColorType::kAlpha_8:          return 1;
1196         case GrColorType::kBGR_565:          return 2;
1197         case GrColorType::kABGR_4444:        return 2;
1198         case GrColorType::kRGBA_8888:        return 4;
1199         case GrColorType::kRGBA_8888_SRGB:   return 4;
1200         case GrColorType::kRGB_888x:         return 4;
1201         case GrColorType::kRG_88:            return 2;
1202         case GrColorType::kBGRA_8888:        return 4;
1203         case GrColorType::kRGBA_1010102:     return 4;
1204         case GrColorType::kBGRA_1010102:     return 4;
1205         case GrColorType::kGray_8:           return 1;
1206         case GrColorType::kGrayAlpha_88:     return 2;
1207         case GrColorType::kAlpha_F16:        return 2;
1208         case GrColorType::kRGBA_F16:         return 8;
1209         case GrColorType::kRGBA_F16_Clamped: return 8;
1210         case GrColorType::kRGBA_F32:         return 16;
1211         case GrColorType::kAlpha_8xxx:       return 4;
1212         case GrColorType::kAlpha_F32xxx:     return 16;
1213         case GrColorType::kGray_8xxx:        return 4;
1214         case GrColorType::kAlpha_16:         return 2;
1215         case GrColorType::kRG_1616:          return 4;
1216         case GrColorType::kRGBA_16161616:    return 8;
1217         case GrColorType::kRG_F16:           return 4;
1218         case GrColorType::kRGB_888:          return 3;
1219         case GrColorType::kR_8:              return 1;
1220         case GrColorType::kR_16:             return 2;
1221         case GrColorType::kR_F16:            return 2;
1222         case GrColorType::kGray_F16:         return 2;
1223         case GrColorType::kARGB_4444:        return 2;
1224         case GrColorType::kBGRA_4444:        return 2;
1225     }
1226     SkUNREACHABLE;
1227 }
1228 
1229 // In general we try to not mix CompressionType and ColorType, but currently SkImage still requires
1230 // an SkColorType even for CompressedTypes so we need some conversion.
GrCompressionTypeToSkColorType(SkImage::CompressionType compression)1231 static constexpr SkColorType GrCompressionTypeToSkColorType(SkImage::CompressionType compression) {
1232     switch (compression) {
1233         case SkImage::CompressionType::kNone:            return kUnknown_SkColorType;
1234         case SkImage::CompressionType::kETC2_RGB8_UNORM: return kRGB_888x_SkColorType;
1235         case SkImage::CompressionType::kBC1_RGB8_UNORM:  return kRGB_888x_SkColorType;
1236         case SkImage::CompressionType::kBC1_RGBA8_UNORM: return kRGBA_8888_SkColorType;
1237     }
1238 
1239     SkUNREACHABLE;
1240 }
1241 
GrMaskFormatToColorType(GrMaskFormat format)1242 static constexpr GrColorType GrMaskFormatToColorType(GrMaskFormat format) {
1243     switch (format) {
1244         case kA8_GrMaskFormat:
1245             return GrColorType::kAlpha_8;
1246         case kA565_GrMaskFormat:
1247             return GrColorType::kBGR_565;
1248         case kARGB_GrMaskFormat:
1249             return GrColorType::kRGBA_8888;
1250     }
1251     SkUNREACHABLE;
1252 }
1253 
1254 /**
1255  * Ref-counted object that calls a callback from its destructor.
1256  */
1257 class GrRefCntedCallback : public SkNVRefCnt<GrRefCntedCallback> {
1258 public:
1259     using Context = void*;
1260     using Callback = void (*)(Context);
1261 
Make(Callback proc,Context ctx)1262     static sk_sp<GrRefCntedCallback> Make(Callback proc, Context ctx) {
1263         if (!proc) {
1264             return nullptr;
1265         }
1266         return sk_sp<GrRefCntedCallback>(new GrRefCntedCallback(proc, ctx));
1267     }
1268 
~GrRefCntedCallback()1269     ~GrRefCntedCallback() { fReleaseProc(fReleaseCtx); }
1270 
context()1271     Context context() const { return fReleaseCtx; }
1272 
1273 private:
GrRefCntedCallback(Callback proc,Context ctx)1274     GrRefCntedCallback(Callback proc, Context ctx) : fReleaseProc(proc), fReleaseCtx(ctx) {}
1275     GrRefCntedCallback(const GrRefCntedCallback&) = delete;
1276     GrRefCntedCallback(GrRefCntedCallback&&) = delete;
1277     GrRefCntedCallback& operator=(const GrRefCntedCallback&) = delete;
1278     GrRefCntedCallback& operator=(GrRefCntedCallback&&) = delete;
1279 
1280     Callback fReleaseProc;
1281     Context fReleaseCtx;
1282 };
1283 
1284 enum class GrDstSampleFlags {
1285     kNone = 0,
1286     kRequiresTextureBarrier =   1 << 0,
1287     kAsInputAttachment = 1 << 1,
1288 };
1289 GR_MAKE_BITFIELD_CLASS_OPS(GrDstSampleFlags)
1290 
1291 using GrVisitProxyFunc = std::function<void(GrSurfaceProxy*, GrMipmapped)>;
1292 
1293 #if defined(SK_DEBUG) || GR_TEST_UTILS || defined(SK_ENABLE_DUMP_GPU)
GrBackendApiToStr(GrBackendApi api)1294 static constexpr const char* GrBackendApiToStr(GrBackendApi api) {
1295     switch (api) {
1296         case GrBackendApi::kOpenGL:   return "OpenGL";
1297         case GrBackendApi::kVulkan:   return "Vulkan";
1298         case GrBackendApi::kMetal:    return "Metal";
1299         case GrBackendApi::kDirect3D: return "Direct3D";
1300         case GrBackendApi::kDawn:     return "Dawn";
1301         case GrBackendApi::kMock:     return "Mock";
1302     }
1303     SkUNREACHABLE;
1304 }
1305 
GrColorTypeToStr(GrColorType ct)1306 static constexpr const char* GrColorTypeToStr(GrColorType ct) {
1307     switch (ct) {
1308         case GrColorType::kUnknown:          return "kUnknown";
1309         case GrColorType::kAlpha_8:          return "kAlpha_8";
1310         case GrColorType::kBGR_565:          return "kRGB_565";
1311         case GrColorType::kABGR_4444:        return "kABGR_4444";
1312         case GrColorType::kRGBA_8888:        return "kRGBA_8888";
1313         case GrColorType::kRGBA_8888_SRGB:   return "kRGBA_8888_SRGB";
1314         case GrColorType::kRGB_888x:         return "kRGB_888x";
1315         case GrColorType::kRG_88:            return "kRG_88";
1316         case GrColorType::kBGRA_8888:        return "kBGRA_8888";
1317         case GrColorType::kRGBA_1010102:     return "kRGBA_1010102";
1318         case GrColorType::kBGRA_1010102:     return "kBGRA_1010102";
1319         case GrColorType::kGray_8:           return "kGray_8";
1320         case GrColorType::kGrayAlpha_88:     return "kGrayAlpha_88";
1321         case GrColorType::kAlpha_F16:        return "kAlpha_F16";
1322         case GrColorType::kRGBA_F16:         return "kRGBA_F16";
1323         case GrColorType::kRGBA_F16_Clamped: return "kRGBA_F16_Clamped";
1324         case GrColorType::kRGBA_F32:         return "kRGBA_F32";
1325         case GrColorType::kAlpha_8xxx:       return "kAlpha_8xxx";
1326         case GrColorType::kAlpha_F32xxx:     return "kAlpha_F32xxx";
1327         case GrColorType::kGray_8xxx:        return "kGray_8xxx";
1328         case GrColorType::kAlpha_16:         return "kAlpha_16";
1329         case GrColorType::kRG_1616:          return "kRG_1616";
1330         case GrColorType::kRGBA_16161616:    return "kRGBA_16161616";
1331         case GrColorType::kRG_F16:           return "kRG_F16";
1332         case GrColorType::kRGB_888:          return "kRGB_888";
1333         case GrColorType::kR_8:              return "kR_8";
1334         case GrColorType::kR_16:             return "kR_16";
1335         case GrColorType::kR_F16:            return "kR_F16";
1336         case GrColorType::kGray_F16:         return "kGray_F16";
1337         case GrColorType::kARGB_4444:        return "kARGB_4444";
1338         case GrColorType::kBGRA_4444:        return "kBGRA_4444";
1339     }
1340     SkUNREACHABLE;
1341 }
1342 
GrCompressionTypeToStr(SkImage::CompressionType compression)1343 static constexpr const char* GrCompressionTypeToStr(SkImage::CompressionType compression) {
1344     switch (compression) {
1345         case SkImage::CompressionType::kNone:            return "kNone";
1346         case SkImage::CompressionType::kETC2_RGB8_UNORM: return "kETC2_RGB8_UNORM";
1347         case SkImage::CompressionType::kBC1_RGB8_UNORM:  return "kBC1_RGB8_UNORM";
1348         case SkImage::CompressionType::kBC1_RGBA8_UNORM: return "kBC1_RGBA8_UNORM";
1349     }
1350     SkUNREACHABLE;
1351 }
1352 #endif
1353 
1354 #endif
1355