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