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