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