blob: ee6bfd8097bced21430a9f2a4eaa7681cbc3b9b5 [file] [log] [blame]
commit-bot@chromium.orgff6ea262013-03-12 12:26:08 +00001/*
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
Brian Salomon5e150852017-03-22 14:53:13 -040011#include <chrono>
Brian Salomonea26d6b2018-01-23 20:33:21 +000012#include "GrSharedEnums.h"
Brian Salomonc320b152018-02-20 14:05:36 -050013#include "GrTypes.h"
14#include "SkImageInfo.h"
Brian Salomon5fba7ad2018-03-22 10:01:16 -040015#include "SkImageInfoPriv.h"
16#include "SkRefCnt.h"
Greg Danielfcea56c2018-03-06 15:17:57 -050017#include "SkWeakRefCnt.h"
bsalomon@google.com31ec7982013-03-27 18:14:57 +000018
Brian Salomone225b562017-06-14 13:00:03 -040019class GrCaps;
20
Brian Salomon5e150852017-03-22 14:53:13 -040021// The old libstdc++ uses the draft name "monotonic_clock" rather than "steady_clock". This might
22// not actually be monotonic, depending on how libstdc++ was built. However, this is only currently
23// used for idle resource purging so it shouldn't cause a correctness problem.
24#if defined(__GLIBCXX__) && (__GLIBCXX__ < 20130000)
25using GrStdSteadyClock = std::chrono::monotonic_clock;
26#else
27using GrStdSteadyClock = std::chrono::steady_clock;
28#endif
29
Brian Salomonf4a00e42018-03-23 15:15:03 -040030/**
Brian Salomona6a3df72018-03-23 16:32:22 -040031 * Pixel configurations. This type conflates texture formats, CPU pixel formats, and
32 * premultipliedness. We are moving away from it towards SkColorType and backend API (GL, Vulkan)
33 * texture formats in the pulbic API. Right now this mostly refers to texture formats as we're
34 * migrating.
35 */
36enum GrPixelConfig {
37 kUnknown_GrPixelConfig,
38 kAlpha_8_GrPixelConfig,
39 kGray_8_GrPixelConfig,
40 kRGB_565_GrPixelConfig,
41 kRGBA_4444_GrPixelConfig,
42 kRGBA_8888_GrPixelConfig,
43 kRGB_888_GrPixelConfig,
44 kBGRA_8888_GrPixelConfig,
45 kSRGBA_8888_GrPixelConfig,
46 kSBGRA_8888_GrPixelConfig,
47 kRGBA_1010102_GrPixelConfig,
48 kRGBA_float_GrPixelConfig,
49 kRG_float_GrPixelConfig,
50 kAlpha_half_GrPixelConfig,
51 kRGBA_half_GrPixelConfig,
52
53 /** For internal usage. */
54 kPrivateConfig1_GrPixelConfig,
55 kPrivateConfig2_GrPixelConfig,
56 kPrivateConfig3_GrPixelConfig,
57 kPrivateConfig4_GrPixelConfig,
58 kPrivateConfig5_GrPixelConfig,
59
60 kLast_GrPixelConfig = kPrivateConfig5_GrPixelConfig
61};
62static const int kGrPixelConfigCnt = kLast_GrPixelConfig + 1;
63
64// Aliases for pixel configs that match skia's byte order.
65#ifndef SK_CPU_LENDIAN
66#error "Skia gpu currently assumes little endian"
67#endif
68#if SK_PMCOLOR_BYTE_ORDER(B,G,R,A)
69static const GrPixelConfig kSkia8888_GrPixelConfig = kBGRA_8888_GrPixelConfig;
70#elif SK_PMCOLOR_BYTE_ORDER(R,G,B,A)
71static const GrPixelConfig kSkia8888_GrPixelConfig = kRGBA_8888_GrPixelConfig;
72#else
73 #error "SK_*32_SHIFT values must correspond to GL_BGRA or GL_RGBA format."
74#endif
75
76/**
Brian Salomonf4a00e42018-03-23 15:15:03 -040077 * Geometric primitives used for drawing.
78 */
79enum class GrPrimitiveType {
80 kTriangles,
81 kTriangleStrip,
Brian Salomonf4a00e42018-03-23 15:15:03 -040082 kPoints,
83 kLines, // 1 pix wide only
84 kLineStrip, // 1 pix wide only
85 kLinesAdjacency // requires geometry shader support.
86};
87static constexpr int kNumGrPrimitiveTypes = (int)GrPrimitiveType::kLinesAdjacency + 1;
88
89static constexpr bool GrIsPrimTypeLines(GrPrimitiveType type) {
90 return GrPrimitiveType::kLines == type ||
91 GrPrimitiveType::kLineStrip == type ||
92 GrPrimitiveType::kLinesAdjacency == type;
93}
94
95static constexpr bool GrIsPrimTypeTris(GrPrimitiveType type) {
Brian Salomonfb68b3b2018-04-30 12:55:36 -040096 return GrPrimitiveType::kTriangles == type || GrPrimitiveType::kTriangleStrip == type;
Brian Salomonf4a00e42018-03-23 15:15:03 -040097}
98
99static constexpr bool GrPrimTypeRequiresGeometryShaderSupport(GrPrimitiveType type) {
100 return GrPrimitiveType::kLinesAdjacency == type;
101}
102
Brian Salomon802cb312018-06-08 18:05:20 -0400103enum class GrPrimitiveRestart : bool {
104 kNo = false,
105 kYes = true
106};
107
Brian Salomonf4a00e42018-03-23 15:15:03 -0400108/**
109 * Formats for masks, used by the font cache. Important that these are 0-based.
110 */
111enum GrMaskFormat {
112 kA8_GrMaskFormat, //!< 1-byte per pixel
113 kA565_GrMaskFormat, //!< 2-bytes per pixel, RGB represent 3-channel LCD coverage
114 kARGB_GrMaskFormat, //!< 4-bytes per pixel, color format
115
116 kLast_GrMaskFormat = kARGB_GrMaskFormat
117};
118static const int kMaskFormatCount = kLast_GrMaskFormat + 1;
119
120/**
121 * Return the number of bytes-per-pixel for the specified mask format.
122 */
123static inline int GrMaskFormatBytesPerPixel(GrMaskFormat format) {
124 SkASSERT(format < kMaskFormatCount);
125 // kA8 (0) -> 1
126 // kA565 (1) -> 2
127 // kARGB (2) -> 4
128 static const int sBytesPerPixel[] = {1, 2, 4};
129 static_assert(SK_ARRAY_COUNT(sBytesPerPixel) == kMaskFormatCount, "array_size_mismatch");
130 static_assert(kA8_GrMaskFormat == 0, "enum_order_dependency");
131 static_assert(kA565_GrMaskFormat == 1, "enum_order_dependency");
132 static_assert(kARGB_GrMaskFormat == 2, "enum_order_dependency");
133
134 return sBytesPerPixel[(int)format];
135}
136
137/**
138 * Optional bitfield flags that can be set on GrSurfaceDesc (below).
139 */
140enum GrSurfaceFlags {
141 kNone_GrSurfaceFlags = 0x0,
142 /**
143 * Creates a texture that can be rendered to as a GrRenderTarget. Use
144 * GrTexture::asRenderTarget() to access.
145 */
146 kRenderTarget_GrSurfaceFlag = 0x1,
147 /**
148 * Clears to zero on creation. It will cause creation failure if initial data is supplied to the
149 * texture. This only affects the base level if the texture is created with MIP levels.
150 */
151 kPerformInitialClear_GrSurfaceFlag = 0x2
152};
153GR_MAKE_BITFIELD_OPS(GrSurfaceFlags)
154
155typedef GrSurfaceFlags GrSurfaceDescFlags;
156
157/**
158 * Describes a surface to be created.
159 */
160struct GrSurfaceDesc {
161 GrSurfaceDesc()
162 : fFlags(kNone_GrSurfaceFlags)
163 , fWidth(0)
164 , fHeight(0)
165 , fConfig(kUnknown_GrPixelConfig)
166 , fSampleCnt(1) {}
167
168 GrSurfaceDescFlags fFlags; //!< bitfield of TextureFlags
169 int fWidth; //!< Width of the texture
170 int fHeight; //!< Height of the texture
171
172 /**
173 * Format of source data of the texture. Not guaranteed to be the same as
174 * internal format used by 3D API.
175 */
176 GrPixelConfig fConfig;
177
178 /**
179 * The number of samples per pixel. Zero is treated equivalently to 1. This only
180 * applies if the kRenderTarget_GrSurfaceFlag is set. The actual number
181 * of samples may not exactly match the request. The request will be rounded
182 * up to the next supported sample count. A value larger than the largest
183 * supported sample count will fail.
184 */
185 int fSampleCnt;
186};
187
188/** Ownership rules for external GPU resources imported into Skia. */
189enum GrWrapOwnership {
190 /** Skia will assume the client will keep the resource alive and Skia will not free it. */
191 kBorrow_GrWrapOwnership,
192
193 /** Skia will assume ownership of the resource and free it. */
194 kAdopt_GrWrapOwnership,
195};
196
197/**
198 * Clips are composed from these objects.
199 */
200enum GrClipType {
201 kRect_ClipType,
202 kPath_ClipType
203};
204
205struct GrMipLevel {
206 const void* fPixels;
207 size_t fRowBytes;
208};
209
210/**
211 * This enum is used to specify the load operation to be used when an opList/GrGpuCommandBuffer
212 * begins execution.
Robert Phillips6b47c7d2017-08-29 07:24:09 -0400213 */
214enum class GrLoadOp {
215 kLoad,
216 kClear,
217 kDiscard,
218};
219
Brian Salomonf4a00e42018-03-23 15:15:03 -0400220/**
221 * This enum is used to specify the store operation to be used when an opList/GrGpuCommandBuffer
222 * ends execution.
Robert Phillips6b47c7d2017-08-29 07:24:09 -0400223 */
224enum class GrStoreOp {
225 kStore,
226 kDiscard,
227};
228
Brian Salomonf4a00e42018-03-23 15:15:03 -0400229/**
230 * Used to control antialiasing in draw calls.
231 */
232enum class GrAA : bool {
233 kNo = false,
234 kYes = true
235};
236
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500237/** This enum indicates the type of antialiasing to be performed. */
Brian Salomonaf9847e2017-03-01 11:28:27 -0500238enum class GrAAType : unsigned {
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500239 /** No antialiasing */
240 kNone,
241 /** Use fragment shader code to compute a fractional pixel coverage. */
242 kCoverage,
243 /** Use normal MSAA. */
244 kMSAA,
245 /**
246 * Use "mixed samples" MSAA such that the stencil buffer is multisampled but the color buffer is
247 * not.
248 */
249 kMixedSamples
250};
251
Brian Salomon0abc8b42016-12-13 10:22:54 -0500252static inline bool GrAATypeIsHW(GrAAType type) {
253 switch (type) {
254 case GrAAType::kNone:
255 return false;
256 case GrAAType::kCoverage:
257 return false;
258 case GrAAType::kMSAA:
259 return true;
260 case GrAAType::kMixedSamples:
261 return true;
262 }
Ben Wagnerb4aab9a2017-08-16 10:53:04 -0400263 SK_ABORT("Unknown AA Type");
Brian Salomon0abc8b42016-12-13 10:22:54 -0500264 return false;
265}
266
Brian Salomon7c8460e2017-05-12 11:36:10 -0400267/** The type of full scene antialiasing supported by a render target. */
268enum class GrFSAAType {
269 /** No FSAA */
270 kNone,
271 /** Regular MSAA where each attachment has the same sample count. */
272 kUnifiedMSAA,
273 /** One color sample, N stencil samples. */
274 kMixedSamples,
275};
276
277/**
278 * Not all drawing code paths support using mixed samples when available and instead use
279 * coverage-based aa.
280 */
Chris Dalton3b51df12017-11-27 14:33:06 -0700281enum class GrAllowMixedSamples : bool { kNo = false, kYes = true };
Brian Salomon7c8460e2017-05-12 11:36:10 -0400282
Brian Salomonea26d6b2018-01-23 20:33:21 +0000283GrAAType GrChooseAAType(GrAA, GrFSAAType, GrAllowMixedSamples, const GrCaps&);
Brian Salomon7c8460e2017-05-12 11:36:10 -0400284
Brian Salomon0abc8b42016-12-13 10:22:54 -0500285/**
286 * Types of shader-language-specific boxed variables we can create. (Currently only GrGLShaderVars,
287 * but should be applicable to other shader languages.)
288 */
commit-bot@chromium.orgff6ea262013-03-12 12:26:08 +0000289enum GrSLType {
290 kVoid_GrSLType,
Brian Salomonfa26e662016-11-14 11:27:00 -0500291 kBool_GrSLType,
Ruiqi Maob609e6d2018-07-17 10:19:38 -0400292 kByte_GrSLType,
293 kByte2_GrSLType,
294 kByte3_GrSLType,
295 kByte4_GrSLType,
296 kUByte_GrSLType,
297 kUByte2_GrSLType,
298 kUByte3_GrSLType,
299 kUByte4_GrSLType,
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400300 kShort_GrSLType,
Chris Dalton51ebd662017-10-24 16:10:48 -0600301 kShort2_GrSLType,
302 kShort3_GrSLType,
303 kShort4_GrSLType,
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400304 kUShort_GrSLType,
Chris Dalton51ebd662017-10-24 16:10:48 -0600305 kUShort2_GrSLType,
306 kUShort3_GrSLType,
307 kUShort4_GrSLType,
Ethan Nicholas8aa45692017-09-20 11:24:15 -0400308 kFloat_GrSLType,
309 kFloat2_GrSLType,
310 kFloat3_GrSLType,
311 kFloat4_GrSLType,
312 kFloat2x2_GrSLType,
313 kFloat3x3_GrSLType,
314 kFloat4x4_GrSLType,
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400315 kHalf_GrSLType,
316 kHalf2_GrSLType,
317 kHalf3_GrSLType,
318 kHalf4_GrSLType,
319 kHalf2x2_GrSLType,
320 kHalf3x3_GrSLType,
321 kHalf4x4_GrSLType,
Ethan Nicholas88d99c62017-08-16 16:41:30 -0400322 kInt_GrSLType,
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400323 kInt2_GrSLType,
324 kInt3_GrSLType,
325 kInt4_GrSLType,
Brian Salomon1d816b92017-08-17 11:07:59 -0400326 kUint_GrSLType,
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400327 kUint2_GrSLType,
egdaniel990dbc82016-07-13 14:09:30 -0700328 kTexture2DSampler_GrSLType,
329 kTextureExternalSampler_GrSLType,
330 kTexture2DRectSampler_GrSLType,
csmartdalton22458032016-11-16 11:28:16 -0700331 kBufferSampler_GrSLType,
egdaniel990dbc82016-07-13 14:09:30 -0700332 kTexture2D_GrSLType,
333 kSampler_GrSLType,
commit-bot@chromium.orgff6ea262013-03-12 12:26:08 +0000334};
335
bsalomon17168df2014-12-09 09:00:49 -0800336enum GrShaderType {
337 kVertex_GrShaderType,
338 kGeometry_GrShaderType,
339 kFragment_GrShaderType,
340
341 kLastkFragment_GrShaderType = kFragment_GrShaderType
342};
343static const int kGrShaderTypeCount = kLastkFragment_GrShaderType + 1;
344
cdalton5e58cee2016-02-11 12:49:47 -0800345enum GrShaderFlags {
346 kNone_GrShaderFlags = 0,
347 kVertex_GrShaderFlag = 1 << kVertex_GrShaderType,
348 kGeometry_GrShaderFlag = 1 << kGeometry_GrShaderType,
349 kFragment_GrShaderFlag = 1 << kFragment_GrShaderType
350};
351GR_MAKE_BITFIELD_OPS(GrShaderFlags);
352
bsalomon@google.com31ec7982013-03-27 18:14:57 +0000353/**
bsalomonc0bd6482014-12-09 10:04:14 -0800354 * Precisions of shader language variables. Not all shading languages support precisions or actually
bsalomon422f56f2014-12-09 10:18:12 -0800355 * vary the internal precision based on the qualifiers. These currently only apply to float types (
356 * including float vectors and matrices).
bsalomonc0bd6482014-12-09 10:04:14 -0800357 */
358enum GrSLPrecision {
359 kLow_GrSLPrecision,
360 kMedium_GrSLPrecision,
361 kHigh_GrSLPrecision,
362
Brian Osman33aa2c72017-04-05 09:26:15 -0400363 // Default precision is a special tag that means "whatever the default for the program/type
364 // combination is". In other words, it maps to the empty string in shader code. There are some
365 // scenarios where kDefault is not allowed (as the default precision for a program, or for
366 // varyings, for example).
367 kDefault_GrSLPrecision,
bsalomonc0bd6482014-12-09 10:04:14 -0800368
Brian Osman33aa2c72017-04-05 09:26:15 -0400369 // We only consider the "real" precisions here
370 kLast_GrSLPrecision = kHigh_GrSLPrecision,
bsalomonc0bd6482014-12-09 10:04:14 -0800371};
372
373static const int kGrSLPrecisionCount = kLast_GrSLPrecision + 1;
374
ethannicholas22793252016-01-30 09:59:10 -0800375/** Is the shading language type float (including vectors/matrices)? */
bsalomon422f56f2014-12-09 10:18:12 -0800376static inline bool GrSLTypeIsFloatType(GrSLType type) {
Brian Salomonfa26e662016-11-14 11:27:00 -0500377 switch (type) {
Ethan Nicholas8aa45692017-09-20 11:24:15 -0400378 case kFloat_GrSLType:
379 case kFloat2_GrSLType:
380 case kFloat3_GrSLType:
381 case kFloat4_GrSLType:
382 case kFloat2x2_GrSLType:
383 case kFloat3x3_GrSLType:
384 case kFloat4x4_GrSLType:
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400385 case kHalf_GrSLType:
386 case kHalf2_GrSLType:
387 case kHalf3_GrSLType:
388 case kHalf4_GrSLType:
389 case kHalf2x2_GrSLType:
390 case kHalf3x3_GrSLType:
391 case kHalf4x4_GrSLType:
Brian Salomonfa26e662016-11-14 11:27:00 -0500392 return true;
bsalomon422f56f2014-12-09 10:18:12 -0800393
Brian Salomonfa26e662016-11-14 11:27:00 -0500394 case kVoid_GrSLType:
395 case kTexture2DSampler_GrSLType:
Brian Salomonfa26e662016-11-14 11:27:00 -0500396 case kTextureExternalSampler_GrSLType:
397 case kTexture2DRectSampler_GrSLType:
csmartdalton22458032016-11-16 11:28:16 -0700398 case kBufferSampler_GrSLType:
Brian Salomonfa26e662016-11-14 11:27:00 -0500399 case kBool_GrSLType:
Ruiqi Maob609e6d2018-07-17 10:19:38 -0400400 case kByte_GrSLType:
401 case kByte2_GrSLType:
402 case kByte3_GrSLType:
403 case kByte4_GrSLType:
404 case kUByte_GrSLType:
405 case kUByte2_GrSLType:
406 case kUByte3_GrSLType:
407 case kUByte4_GrSLType:
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400408 case kShort_GrSLType:
Chris Dalton51ebd662017-10-24 16:10:48 -0600409 case kShort2_GrSLType:
410 case kShort3_GrSLType:
411 case kShort4_GrSLType:
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400412 case kUShort_GrSLType:
Chris Dalton51ebd662017-10-24 16:10:48 -0600413 case kUShort2_GrSLType:
414 case kUShort3_GrSLType:
415 case kUShort4_GrSLType:
Ethan Nicholas88d99c62017-08-16 16:41:30 -0400416 case kInt_GrSLType:
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400417 case kInt2_GrSLType:
418 case kInt3_GrSLType:
419 case kInt4_GrSLType:
Brian Salomon1d816b92017-08-17 11:07:59 -0400420 case kUint_GrSLType:
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400421 case kUint2_GrSLType:
Brian Salomonfa26e662016-11-14 11:27:00 -0500422 case kTexture2D_GrSLType:
423 case kSampler_GrSLType:
424 return false;
425 }
Ben Wagnerb4aab9a2017-08-16 10:53:04 -0400426 SK_ABORT("Unexpected type");
Brian Salomonfa26e662016-11-14 11:27:00 -0500427 return false;
bsalomone5286e02016-01-14 09:24:09 -0800428}
429
Brian Salomon04460cc2017-12-06 14:47:42 -0500430/** If the type represents a single value or vector return the vector length, else -1. */
431static inline int GrSLTypeVecLength(GrSLType type) {
432 switch (type) {
433 case kFloat_GrSLType:
434 case kHalf_GrSLType:
435 case kBool_GrSLType:
Ruiqi Maob609e6d2018-07-17 10:19:38 -0400436 case kByte_GrSLType:
437 case kUByte_GrSLType:
Brian Salomon04460cc2017-12-06 14:47:42 -0500438 case kShort_GrSLType:
439 case kUShort_GrSLType:
440 case kInt_GrSLType:
441 case kUint_GrSLType:
442 return 1;
443
444 case kFloat2_GrSLType:
445 case kHalf2_GrSLType:
Ruiqi Maob609e6d2018-07-17 10:19:38 -0400446 case kByte2_GrSLType:
447 case kUByte2_GrSLType:
Brian Salomon04460cc2017-12-06 14:47:42 -0500448 case kShort2_GrSLType:
449 case kUShort2_GrSLType:
450 case kInt2_GrSLType:
451 case kUint2_GrSLType:
452 return 2;
453
454 case kFloat3_GrSLType:
455 case kHalf3_GrSLType:
Ruiqi Maob609e6d2018-07-17 10:19:38 -0400456 case kByte3_GrSLType:
457 case kUByte3_GrSLType:
Brian Salomon04460cc2017-12-06 14:47:42 -0500458 case kShort3_GrSLType:
459 case kUShort3_GrSLType:
460 case kInt3_GrSLType:
461 return 3;
462
463 case kFloat4_GrSLType:
464 case kHalf4_GrSLType:
Ruiqi Maob609e6d2018-07-17 10:19:38 -0400465 case kByte4_GrSLType:
466 case kUByte4_GrSLType:
Brian Salomon04460cc2017-12-06 14:47:42 -0500467 case kShort4_GrSLType:
468 case kUShort4_GrSLType:
469 case kInt4_GrSLType:
470 return 4;
471
472 case kFloat2x2_GrSLType:
473 case kFloat3x3_GrSLType:
474 case kFloat4x4_GrSLType:
475 case kHalf2x2_GrSLType:
476 case kHalf3x3_GrSLType:
477 case kHalf4x4_GrSLType:
478 case kVoid_GrSLType:
479 case kTexture2DSampler_GrSLType:
Brian Salomon04460cc2017-12-06 14:47:42 -0500480 case kTextureExternalSampler_GrSLType:
481 case kTexture2DRectSampler_GrSLType:
482 case kBufferSampler_GrSLType:
483 case kTexture2D_GrSLType:
484 case kSampler_GrSLType:
485 return -1;
486 }
487 SK_ABORT("Unexpected type");
488 return -1;
489}
490
egdaniel990dbc82016-07-13 14:09:30 -0700491static inline bool GrSLTypeIs2DCombinedSamplerType(GrSLType type) {
Brian Salomonfa26e662016-11-14 11:27:00 -0500492 switch (type) {
493 case kTexture2DSampler_GrSLType:
Brian Salomonfa26e662016-11-14 11:27:00 -0500494 case kTextureExternalSampler_GrSLType:
495 case kTexture2DRectSampler_GrSLType:
496 return true;
bsalomone5286e02016-01-14 09:24:09 -0800497
Brian Salomonfa26e662016-11-14 11:27:00 -0500498 case kVoid_GrSLType:
Ethan Nicholas8aa45692017-09-20 11:24:15 -0400499 case kFloat_GrSLType:
500 case kFloat2_GrSLType:
501 case kFloat3_GrSLType:
502 case kFloat4_GrSLType:
503 case kFloat2x2_GrSLType:
504 case kFloat3x3_GrSLType:
505 case kFloat4x4_GrSLType:
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400506 case kHalf_GrSLType:
507 case kHalf2_GrSLType:
508 case kHalf3_GrSLType:
509 case kHalf4_GrSLType:
510 case kHalf2x2_GrSLType:
511 case kHalf3x3_GrSLType:
512 case kHalf4x4_GrSLType:
Ethan Nicholas27185a92017-09-18 02:41:08 +0000513 case kInt_GrSLType:
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400514 case kInt2_GrSLType:
515 case kInt3_GrSLType:
516 case kInt4_GrSLType:
Ethan Nicholas27185a92017-09-18 02:41:08 +0000517 case kUint_GrSLType:
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400518 case kUint2_GrSLType:
519 case kBufferSampler_GrSLType:
Brian Salomonfa26e662016-11-14 11:27:00 -0500520 case kBool_GrSLType:
Ruiqi Maob609e6d2018-07-17 10:19:38 -0400521 case kByte_GrSLType:
522 case kByte2_GrSLType:
523 case kByte3_GrSLType:
524 case kByte4_GrSLType:
525 case kUByte_GrSLType:
526 case kUByte2_GrSLType:
527 case kUByte3_GrSLType:
528 case kUByte4_GrSLType:
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400529 case kShort_GrSLType:
Chris Dalton51ebd662017-10-24 16:10:48 -0600530 case kShort2_GrSLType:
531 case kShort3_GrSLType:
532 case kShort4_GrSLType:
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400533 case kUShort_GrSLType:
Chris Dalton51ebd662017-10-24 16:10:48 -0600534 case kUShort2_GrSLType:
535 case kUShort3_GrSLType:
536 case kUShort4_GrSLType:
Brian Salomonfa26e662016-11-14 11:27:00 -0500537 case kTexture2D_GrSLType:
538 case kSampler_GrSLType:
539 return false;
540 }
Ben Wagnerb4aab9a2017-08-16 10:53:04 -0400541 SK_ABORT("Unexpected type");
Brian Salomonfa26e662016-11-14 11:27:00 -0500542 return false;
egdanielfa896322016-01-13 12:19:30 -0800543}
544
egdaniel990dbc82016-07-13 14:09:30 -0700545static inline bool GrSLTypeIsCombinedSamplerType(GrSLType type) {
Brian Salomonfa26e662016-11-14 11:27:00 -0500546 switch (type) {
547 case kTexture2DSampler_GrSLType:
Brian Salomonfa26e662016-11-14 11:27:00 -0500548 case kTextureExternalSampler_GrSLType:
549 case kTexture2DRectSampler_GrSLType:
csmartdalton22458032016-11-16 11:28:16 -0700550 case kBufferSampler_GrSLType:
Brian Salomonfa26e662016-11-14 11:27:00 -0500551 return true;
cdalton74b8d322016-04-11 14:47:28 -0700552
Brian Salomonfa26e662016-11-14 11:27:00 -0500553 case kVoid_GrSLType:
Ethan Nicholas8aa45692017-09-20 11:24:15 -0400554 case kFloat_GrSLType:
555 case kFloat2_GrSLType:
556 case kFloat3_GrSLType:
557 case kFloat4_GrSLType:
558 case kFloat2x2_GrSLType:
559 case kFloat3x3_GrSLType:
560 case kFloat4x4_GrSLType:
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400561 case kHalf_GrSLType:
562 case kHalf2_GrSLType:
563 case kHalf3_GrSLType:
564 case kHalf4_GrSLType:
565 case kHalf2x2_GrSLType:
566 case kHalf3x3_GrSLType:
567 case kHalf4x4_GrSLType:
Brian Salomonfa26e662016-11-14 11:27:00 -0500568 case kInt_GrSLType:
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400569 case kInt2_GrSLType:
570 case kInt3_GrSLType:
571 case kInt4_GrSLType:
Brian Salomonfa26e662016-11-14 11:27:00 -0500572 case kUint_GrSLType:
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400573 case kUint2_GrSLType:
Brian Salomonfa26e662016-11-14 11:27:00 -0500574 case kBool_GrSLType:
Ruiqi Maob609e6d2018-07-17 10:19:38 -0400575 case kByte_GrSLType:
576 case kByte2_GrSLType:
577 case kByte3_GrSLType:
578 case kByte4_GrSLType:
579 case kUByte_GrSLType:
580 case kUByte2_GrSLType:
581 case kUByte3_GrSLType:
582 case kUByte4_GrSLType:
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400583 case kShort_GrSLType:
Chris Dalton51ebd662017-10-24 16:10:48 -0600584 case kShort2_GrSLType:
585 case kShort3_GrSLType:
586 case kShort4_GrSLType:
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400587 case kUShort_GrSLType:
Chris Dalton51ebd662017-10-24 16:10:48 -0600588 case kUShort2_GrSLType:
589 case kUShort3_GrSLType:
590 case kUShort4_GrSLType:
Brian Salomonfa26e662016-11-14 11:27:00 -0500591 case kTexture2D_GrSLType:
592 case kSampler_GrSLType:
593 return false;
594 }
Ben Wagnerb4aab9a2017-08-16 10:53:04 -0400595 SK_ABORT("Unexpected type");
Brian Salomonfa26e662016-11-14 11:27:00 -0500596 return false;
cdalton74b8d322016-04-11 14:47:28 -0700597}
598
cdalton5f2d8e22016-03-11 13:34:32 -0800599static inline bool GrSLTypeAcceptsPrecision(GrSLType type) {
Brian Salomonfa26e662016-11-14 11:27:00 -0500600 switch (type) {
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400601 case kTexture2DSampler_GrSLType:
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400602 case kTextureExternalSampler_GrSLType:
603 case kTexture2DRectSampler_GrSLType:
604 case kBufferSampler_GrSLType:
605 case kTexture2D_GrSLType:
606 case kSampler_GrSLType:
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400607 return true;
608
609 case kVoid_GrSLType:
610 case kBool_GrSLType:
Ruiqi Maob609e6d2018-07-17 10:19:38 -0400611 case kByte_GrSLType:
612 case kByte2_GrSLType:
613 case kByte3_GrSLType:
614 case kByte4_GrSLType:
615 case kUByte_GrSLType:
616 case kUByte2_GrSLType:
617 case kUByte3_GrSLType:
618 case kUByte4_GrSLType:
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400619 case kShort_GrSLType:
Chris Dalton51ebd662017-10-24 16:10:48 -0600620 case kShort2_GrSLType:
621 case kShort3_GrSLType:
622 case kShort4_GrSLType:
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400623 case kUShort_GrSLType:
Chris Dalton51ebd662017-10-24 16:10:48 -0600624 case kUShort2_GrSLType:
625 case kUShort3_GrSLType:
626 case kUShort4_GrSLType:
Ethan Nicholas8aa45692017-09-20 11:24:15 -0400627 case kFloat_GrSLType:
628 case kFloat2_GrSLType:
629 case kFloat3_GrSLType:
630 case kFloat4_GrSLType:
631 case kFloat2x2_GrSLType:
632 case kFloat3x3_GrSLType:
633 case kFloat4x4_GrSLType:
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400634 case kHalf_GrSLType:
635 case kHalf2_GrSLType:
636 case kHalf3_GrSLType:
637 case kHalf4_GrSLType:
638 case kHalf2x2_GrSLType:
639 case kHalf3x3_GrSLType:
640 case kHalf4x4_GrSLType:
Ethan Nicholas88d99c62017-08-16 16:41:30 -0400641 case kInt_GrSLType:
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400642 case kInt2_GrSLType:
643 case kInt3_GrSLType:
644 case kInt4_GrSLType:
Ethan Nicholas88d99c62017-08-16 16:41:30 -0400645 case kUint_GrSLType:
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400646 case kUint2_GrSLType:
647 return false;
648 }
649 SK_ABORT("Unexpected type");
650 return false;
651}
652
653// temporarily accepting (but ignoring) precision modifiers on the new types; this will be killed
654// in a future CL
655static inline bool GrSLTypeTemporarilyAcceptsPrecision(GrSLType type) {
656 switch (type) {
657 case kShort_GrSLType:
658 case kUShort_GrSLType:
Ethan Nicholas8aa45692017-09-20 11:24:15 -0400659 case kFloat_GrSLType:
660 case kFloat2_GrSLType:
661 case kFloat3_GrSLType:
662 case kFloat4_GrSLType:
663 case kFloat2x2_GrSLType:
664 case kFloat3x3_GrSLType:
665 case kFloat4x4_GrSLType:
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400666 case kHalf_GrSLType:
667 case kHalf2_GrSLType:
668 case kHalf3_GrSLType:
669 case kHalf4_GrSLType:
670 case kHalf2x2_GrSLType:
671 case kHalf3x3_GrSLType:
672 case kHalf4x4_GrSLType:
673 case kInt_GrSLType:
674 case kInt2_GrSLType:
675 case kInt3_GrSLType:
676 case kInt4_GrSLType:
677 case kUint_GrSLType:
678 case kUint2_GrSLType:
Brian Salomonfa26e662016-11-14 11:27:00 -0500679 case kTexture2DSampler_GrSLType:
Brian Salomonfa26e662016-11-14 11:27:00 -0500680 case kTextureExternalSampler_GrSLType:
681 case kTexture2DRectSampler_GrSLType:
csmartdalton22458032016-11-16 11:28:16 -0700682 case kBufferSampler_GrSLType:
Brian Salomonfa26e662016-11-14 11:27:00 -0500683 case kTexture2D_GrSLType:
684 case kSampler_GrSLType:
685 return true;
686
687 case kVoid_GrSLType:
688 case kBool_GrSLType:
Ruiqi Maob609e6d2018-07-17 10:19:38 -0400689 case kByte_GrSLType:
690 case kByte2_GrSLType:
691 case kByte3_GrSLType:
692 case kByte4_GrSLType:
693 case kUByte_GrSLType:
694 case kUByte2_GrSLType:
695 case kUByte3_GrSLType:
696 case kUByte4_GrSLType:
Chris Dalton51ebd662017-10-24 16:10:48 -0600697 case kShort2_GrSLType:
698 case kShort3_GrSLType:
699 case kShort4_GrSLType:
700 case kUShort2_GrSLType:
701 case kUShort3_GrSLType:
702 case kUShort4_GrSLType:
Brian Salomonfa26e662016-11-14 11:27:00 -0500703 return false;
704 }
Ben Wagnerb4aab9a2017-08-16 10:53:04 -0400705 SK_ABORT("Unexpected type");
Brian Salomonfa26e662016-11-14 11:27:00 -0500706 return false;
cdalton5f2d8e22016-03-11 13:34:32 -0800707}
708
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000709//////////////////////////////////////////////////////////////////////////////
710
jvanverth@google.com054ae992013-04-01 20:06:51 +0000711/**
712 * Types used to describe format of vertices in arrays.
Brian Salomonc5886032017-07-19 11:48:05 -0400713 */
bsalomon@google.com31ec7982013-03-27 18:14:57 +0000714enum GrVertexAttribType {
715 kFloat_GrVertexAttribType = 0,
Ethan Nicholasfa7ee242017-09-25 09:52:04 -0400716 kFloat2_GrVertexAttribType,
717 kFloat3_GrVertexAttribType,
718 kFloat4_GrVertexAttribType,
719 kHalf_GrVertexAttribType,
720 kHalf2_GrVertexAttribType,
721 kHalf3_GrVertexAttribType,
722 kHalf4_GrVertexAttribType,
egdaniel37b4d862014-11-03 10:07:07 -0800723
Ethan Nicholasfa7ee242017-09-25 09:52:04 -0400724 kInt2_GrVertexAttribType, // vector of 2 32-bit ints
725 kInt3_GrVertexAttribType, // vector of 3 32-bit ints
726 kInt4_GrVertexAttribType, // vector of 4 32-bit ints
csmartdaltonb37cb232017-02-08 14:56:27 -0500727
Ruiqi Maob609e6d2018-07-17 10:19:38 -0400728
729 kByte_GrVertexAttribType, // signed byte
730 kByte2_GrVertexAttribType, // vector of 2 8-bit signed bytes
731 kByte3_GrVertexAttribType, // vector of 3 8-bit signed bytes
732 kByte4_GrVertexAttribType, // vector of 4 8-bit signed bytes
733 kUByte_GrVertexAttribType, // unsigned byte
734 kUByte2_GrVertexAttribType, // vector of 2 8-bit unsigned bytes
735 kUByte3_GrVertexAttribType, // vector of 3 8-bit unsigned bytes
736 kUByte4_GrVertexAttribType, // vector of 4 8-bit unsigned bytes
737
Ethan Nicholasfa7ee242017-09-25 09:52:04 -0400738 kUByte_norm_GrVertexAttribType, // unsigned byte, e.g. coverage, 0 -> 0.0f, 255 -> 1.0f.
739 kUByte4_norm_GrVertexAttribType, // vector of 4 unsigned bytes, e.g. colors, 0 -> 0.0f,
740 // 255 -> 1.0f.
bsalomon@google.com31ec7982013-03-27 18:14:57 +0000741
Chris Daltona045eea2017-10-24 13:22:10 -0600742 kShort2_GrVertexAttribType, // vector of 2 16-bit shorts.
743 kUShort2_GrVertexAttribType, // vector of 2 unsigned shorts. 0 -> 0, 65535 -> 65535.
744 kUShort2_norm_GrVertexAttribType, // vector of 2 unsigned shorts. 0 -> 0.0f, 65535 -> 1.0f.
ethannicholas22793252016-01-30 09:59:10 -0800745
746 kInt_GrVertexAttribType,
cdalton793dc262016-02-08 10:11:47 -0800747 kUint_GrVertexAttribType,
egdaniel990dbc82016-07-13 14:09:30 -0700748
cdalton793dc262016-02-08 10:11:47 -0800749 kLast_GrVertexAttribType = kUint_GrVertexAttribType
bsalomon@google.com31ec7982013-03-27 18:14:57 +0000750};
751static const int kGrVertexAttribTypeCount = kLast_GrVertexAttribType + 1;
752
jvanverth@google.com054ae992013-04-01 20:06:51 +0000753/**
joshualitt2dd1ae02014-12-03 06:24:10 -0800754 * converts a GrVertexAttribType to a GrSLType
jvanverth@google.com054ae992013-04-01 20:06:51 +0000755 */
joshualitt2dd1ae02014-12-03 06:24:10 -0800756static inline GrSLType GrVertexAttribTypeToSLType(GrVertexAttribType type) {
757 switch (type) {
Chris Daltona045eea2017-10-24 13:22:10 -0600758 case kShort2_GrVertexAttribType:
759 return kShort2_GrSLType;
Ethan Nicholasfa7ee242017-09-25 09:52:04 -0400760 case kUShort2_GrVertexAttribType:
Chris Dalton51ebd662017-10-24 16:10:48 -0600761 return kUShort2_GrSLType;
Chris Daltona045eea2017-10-24 13:22:10 -0600762 case kUShort2_norm_GrVertexAttribType:
763 return kFloat2_GrSLType;
Ethan Nicholasfa7ee242017-09-25 09:52:04 -0400764 case kUByte_norm_GrVertexAttribType: // fall through
joshualitt2dd1ae02014-12-03 06:24:10 -0800765 case kFloat_GrVertexAttribType:
Ethan Nicholas8aa45692017-09-20 11:24:15 -0400766 return kFloat_GrSLType;
Ethan Nicholasfa7ee242017-09-25 09:52:04 -0400767 case kFloat2_GrVertexAttribType:
Ethan Nicholas8aa45692017-09-20 11:24:15 -0400768 return kFloat2_GrSLType;
Ethan Nicholasfa7ee242017-09-25 09:52:04 -0400769 case kFloat3_GrVertexAttribType:
Ethan Nicholas8aa45692017-09-20 11:24:15 -0400770 return kFloat3_GrSLType;
Ethan Nicholasfa7ee242017-09-25 09:52:04 -0400771 case kFloat4_GrVertexAttribType:
Ethan Nicholas8aa45692017-09-20 11:24:15 -0400772 return kFloat4_GrSLType;
Ethan Nicholasfa7ee242017-09-25 09:52:04 -0400773 case kHalf_GrVertexAttribType:
774 return kHalf_GrSLType;
775 case kHalf2_GrVertexAttribType:
776 return kHalf2_GrSLType;
777 case kHalf3_GrVertexAttribType:
778 return kHalf3_GrSLType;
779 case kHalf4_GrVertexAttribType:
780 case kUByte4_norm_GrVertexAttribType:
781 return kHalf4_GrSLType;
782 case kInt2_GrVertexAttribType:
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400783 return kInt2_GrSLType;
Ethan Nicholasfa7ee242017-09-25 09:52:04 -0400784 case kInt3_GrVertexAttribType:
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400785 return kInt3_GrSLType;
Ethan Nicholasfa7ee242017-09-25 09:52:04 -0400786 case kInt4_GrVertexAttribType:
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400787 return kInt4_GrSLType;
Ruiqi Maob609e6d2018-07-17 10:19:38 -0400788 case kByte_GrVertexAttribType:
789 return kByte_GrSLType;
790 case kByte2_GrVertexAttribType:
791 return kByte_GrSLType;
792 case kByte3_GrVertexAttribType:
793 return kByte_GrSLType;
794 case kByte4_GrVertexAttribType:
795 return kByte4_GrSLType;
796 case kUByte_GrVertexAttribType:
797 return kUByte_GrSLType;
798 case kUByte2_GrVertexAttribType:
799 return kUByte_GrSLType;
800 case kUByte3_GrVertexAttribType:
801 return kUByte_GrSLType;
802 case kUByte4_GrVertexAttribType:
803 return kUByte4_GrSLType;
ethannicholas22793252016-01-30 09:59:10 -0800804 case kInt_GrVertexAttribType:
805 return kInt_GrSLType;
cdalton793dc262016-02-08 10:11:47 -0800806 case kUint_GrVertexAttribType:
807 return kUint_GrSLType;
bsalomon@google.com31ec7982013-03-27 18:14:57 +0000808 }
Ben Wagnerb4aab9a2017-08-16 10:53:04 -0400809 SK_ABORT("Unsupported type conversion");
Brian Salomonfa26e662016-11-14 11:27:00 -0500810 return kVoid_GrSLType;
joshualitt2dd1ae02014-12-03 06:24:10 -0800811}
bsalomon@google.com31ec7982013-03-27 18:14:57 +0000812
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000813//////////////////////////////////////////////////////////////////////////////
814
Ethan Nicholas1706f842017-11-10 11:58:19 -0500815static const int kGrClipEdgeTypeCnt = (int) GrClipEdgeType::kLast + 1;
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000816
Ethan Nicholas0f3c7322017-11-09 14:51:17 -0500817static inline bool GrProcessorEdgeTypeIsFill(const GrClipEdgeType edgeType) {
Ethan Nicholas1706f842017-11-10 11:58:19 -0500818 return (GrClipEdgeType::kFillAA == edgeType || GrClipEdgeType::kFillBW == edgeType);
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000819}
820
Ethan Nicholas0f3c7322017-11-09 14:51:17 -0500821static inline bool GrProcessorEdgeTypeIsInverseFill(const GrClipEdgeType edgeType) {
Ethan Nicholas1706f842017-11-10 11:58:19 -0500822 return (GrClipEdgeType::kInverseFillAA == edgeType ||
823 GrClipEdgeType::kInverseFillBW == edgeType);
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000824}
825
Ethan Nicholas0f3c7322017-11-09 14:51:17 -0500826static inline bool GrProcessorEdgeTypeIsAA(const GrClipEdgeType edgeType) {
Ethan Nicholas1706f842017-11-10 11:58:19 -0500827 return (GrClipEdgeType::kFillBW != edgeType &&
828 GrClipEdgeType::kInverseFillBW != edgeType);
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000829}
830
Ethan Nicholas0f3c7322017-11-09 14:51:17 -0500831static inline GrClipEdgeType GrInvertProcessorEdgeType(const GrClipEdgeType edgeType) {
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000832 switch (edgeType) {
Ethan Nicholas1706f842017-11-10 11:58:19 -0500833 case GrClipEdgeType::kFillBW:
834 return GrClipEdgeType::kInverseFillBW;
835 case GrClipEdgeType::kFillAA:
836 return GrClipEdgeType::kInverseFillAA;
837 case GrClipEdgeType::kInverseFillBW:
838 return GrClipEdgeType::kFillBW;
839 case GrClipEdgeType::kInverseFillAA:
840 return GrClipEdgeType::kFillAA;
841 case GrClipEdgeType::kHairlineAA:
Ben Wagnerb4aab9a2017-08-16 10:53:04 -0400842 SK_ABORT("Hairline fill isn't invertible.");
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000843 }
Ethan Nicholas1706f842017-11-10 11:58:19 -0500844 return GrClipEdgeType::kFillAA; // suppress warning.
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000845}
846
bsalomonbcf0a522014-10-08 08:40:09 -0700847/**
848 * Indicates the type of pending IO operations that can be recorded for gpu resources.
849 */
850enum GrIOType {
851 kRead_GrIOType,
852 kWrite_GrIOType,
853 kRW_GrIOType
854};
855
jvanverth17aa0472016-01-05 10:41:27 -0800856/**
Brian Salomonc5886032017-07-19 11:48:05 -0400857 * Indicates the type of data that a GPU buffer will be used for.
858 */
cdalton397536c2016-03-25 12:15:03 -0700859enum GrBufferType {
860 kVertex_GrBufferType,
861 kIndex_GrBufferType,
cdaltone2e71c22016-04-07 18:13:29 -0700862 kTexel_GrBufferType,
863 kDrawIndirect_GrBufferType,
cdalton397536c2016-03-25 12:15:03 -0700864 kXferCpuToGpu_GrBufferType,
865 kXferGpuToCpu_GrBufferType,
866
867 kLast_GrBufferType = kXferGpuToCpu_GrBufferType
868};
cdaltone2e71c22016-04-07 18:13:29 -0700869static const int kGrBufferTypeCount = kLast_GrBufferType + 1;
870
871static inline bool GrBufferTypeIsVertexOrIndex(GrBufferType type) {
872 SkASSERT(type >= 0 && type < kGrBufferTypeCount);
873 return type <= kIndex_GrBufferType;
874
875 GR_STATIC_ASSERT(0 == kVertex_GrBufferType);
876 GR_STATIC_ASSERT(1 == kIndex_GrBufferType);
877}
cdalton397536c2016-03-25 12:15:03 -0700878
879/**
Brian Salomonc5886032017-07-19 11:48:05 -0400880 * Provides a performance hint regarding the frequency at which a data store will be accessed.
881 */
cdalton397536c2016-03-25 12:15:03 -0700882enum GrAccessPattern {
883 /** Data store will be respecified repeatedly and used many times. */
884 kDynamic_GrAccessPattern,
885 /** Data store will be specified once and used many times. (Thus disqualified from caching.) */
886 kStatic_GrAccessPattern,
887 /** Data store will be specified once and used at most a few times. (Also can't be cached.) */
888 kStream_GrAccessPattern,
889
890 kLast_GrAccessPattern = kStream_GrAccessPattern
jvanverth17aa0472016-01-05 10:41:27 -0800891};
892
Robert Phillipsfe0253f2018-03-16 16:47:25 -0400893// Flags shared between the GrSurface & GrSurfaceProxy class hierarchies
894enum class GrInternalSurfaceFlags {
Greg Danielb73a9f82018-05-02 15:06:47 -0400895 kNone = 0,
Robert Phillipsc4f0a822017-06-13 08:11:36 -0400896
Robert Phillipsfe0253f2018-03-16 16:47:25 -0400897 // Surface-level
Greg Danielb73a9f82018-05-02 15:06:47 -0400898 kNoPendingIO = 1 << 0,
Robert Phillipsfe0253f2018-03-16 16:47:25 -0400899
Greg Danielb73a9f82018-05-02 15:06:47 -0400900 kSurfaceMask = kNoPendingIO,
Greg Daniel849dce12018-04-24 14:32:53 -0400901
Robert Phillipsabf7b762018-03-21 12:13:37 -0400902 // Texture-only flags
Robert Phillipsfe0253f2018-03-16 16:47:25 -0400903
Greg Danielb73a9f82018-05-02 15:06:47 -0400904 // This flag is for GL only. It says that the GL texture we will use has a target which is
905 // either GL_TEXTURE_RECTANGLE or GL_GL_TEXTURE_EXTERNAL. We use this information to make
906 // decisions about various rendering capabilites (e.g. is clamp the only supported wrap mode).
907 // Note: Ganesh does not internally create these types of textures so they will only occur on
908 // resources passed into Ganesh.
Greg Daniel09c94002018-06-08 22:11:51 +0000909 kIsGLTextureRectangleOrExternal = 1 << 1,
Robert Phillipsfe0253f2018-03-16 16:47:25 -0400910
Greg Daniel09c94002018-06-08 22:11:51 +0000911 kTextureMask = kIsGLTextureRectangleOrExternal,
Greg Daniel849dce12018-04-24 14:32:53 -0400912
Robert Phillipsfe0253f2018-03-16 16:47:25 -0400913 // RT-only
914
Robert Phillipsc4f0a822017-06-13 08:11:36 -0400915 // For internal resources:
916 // this is enabled whenever MSAA is enabled and GrCaps reports mixed samples are supported
917 // For wrapped resources:
918 // this is disabled for FBO0
919 // but, otherwise, is enabled whenever MSAA is enabled and GrCaps reports mixed samples
920 // are supported
Greg Daniel09c94002018-06-08 22:11:51 +0000921 kMixedSampled = 1 << 2,
Robert Phillipsc4f0a822017-06-13 08:11:36 -0400922
923 // For internal resources:
924 // this is enabled whenever GrCaps reports window rect support
925 // For wrapped resources1
926 // this is disabled for FBO0
927 // but, otherwise, is enabled whenever GrCaps reports window rect support
Greg Daniel09c94002018-06-08 22:11:51 +0000928 kWindowRectsSupport = 1 << 3,
Greg Daniel849dce12018-04-24 14:32:53 -0400929
Greg Daniela070ed72018-04-26 16:31:38 -0400930 // This flag is for use with GL only. It tells us that the internal render target wraps FBO 0.
Greg Daniel09c94002018-06-08 22:11:51 +0000931 kGLRTFBOIDIs0 = 1 << 4,
Greg Daniela070ed72018-04-26 16:31:38 -0400932
Greg Danielb73a9f82018-05-02 15:06:47 -0400933 kRenderTargetMask = kMixedSampled | kWindowRectsSupport | kGLRTFBOIDIs0,
Robert Phillipsc4f0a822017-06-13 08:11:36 -0400934};
Robert Phillipsfe0253f2018-03-16 16:47:25 -0400935GR_MAKE_BITFIELD_CLASS_OPS(GrInternalSurfaceFlags)
jvanverth17aa0472016-01-05 10:41:27 -0800936
joshualitt7d022d62015-05-12 12:03:50 -0700937#ifdef SK_DEBUG
bsalomon682c2692015-05-22 14:01:46 -0700938// Takes a pointer to a GrCaps, and will suppress prints if required
Brian Salomonc5886032017-07-19 11:48:05 -0400939#define GrCapsDebugf(caps, ...) \
940 if (!(caps)->suppressPrints()) { \
941 SkDebugf(__VA_ARGS__); \
joshualitt7d022d62015-05-12 12:03:50 -0700942 }
943#else
bsalomon682c2692015-05-22 14:01:46 -0700944#define GrCapsDebugf(caps, ...)
joshualitt7d022d62015-05-12 12:03:50 -0700945#endif
946
kkinnunen2e6055b2016-04-22 01:48:29 -0700947/**
948 * Specifies if the holder owns the backend, OpenGL or Vulkan, object.
949 */
950enum class GrBackendObjectOwnership : bool {
951 /** Holder does not destroy the backend object. */
952 kBorrowed = false,
953 /** Holder destroys the backend object. */
954 kOwned = true
955};
956
Brian Salomonaff329b2017-08-11 09:40:37 -0400957template <typename T>
958T* const* unique_ptr_address_as_pointer_address(std::unique_ptr<T> const* up) {
959 static_assert(sizeof(T*) == sizeof(std::unique_ptr<T>), "unique_ptr not expected size.");
960 return reinterpret_cast<T* const*>(up);
bungeman06ca8ec2016-06-09 08:01:03 -0700961}
962
jvanverth84741b32016-09-30 08:39:02 -0700963/*
964 * Object for CPU-GPU synchronization
965 */
Greg Daniel6be35232017-03-01 17:01:09 -0500966typedef uint64_t GrFence;
jvanverth84741b32016-09-30 08:39:02 -0700967
Brian Osman195c05b2017-08-30 15:14:04 -0400968/**
969 * Used to include or exclude specific GPU path renderers for testing purposes.
970 */
971enum class GpuPathRenderers {
972 kNone = 0, // Always use sofware masks and/or GrDefaultPathRenderer.
973 kDashLine = 1 << 0,
974 kStencilAndCover = 1 << 1,
Chris Dalton218c2942018-04-25 12:28:03 -0600975 kAAConvex = 1 << 2,
976 kAALinearizing = 1 << 3,
977 kSmall = 1 << 4,
978 kCoverageCounting = 1 << 5,
979 kTessellating = 1 << 6,
Brian Osman195c05b2017-08-30 15:14:04 -0400980
981 kAll = (kTessellating | (kTessellating - 1)),
Chris Daltondde37e52017-12-12 13:00:53 -0700982 kDefault = kAll
Brian Osman195c05b2017-08-30 15:14:04 -0400983};
984
Greg Daniel0fc4d2d2017-10-12 11:23:36 -0400985/**
986 * Used to describe the current state of Mips on a GrTexture
987 */
988enum class GrMipMapsStatus {
989 kNotAllocated, // Mips have not been allocated
990 kDirty, // Mips are allocated but the full mip tree does not have valid data
991 kValid, // All levels fully allocated and have valid data in them
992};
993
Brian Osman195c05b2017-08-30 15:14:04 -0400994GR_MAKE_BITFIELD_CLASS_OPS(GpuPathRenderers)
995
Greg Danielab081ae2017-11-14 11:02:43 -0500996/**
Greg Danielef59d872017-11-17 16:47:21 -0500997 * We want to extend the GrPixelConfig enum to add cases for dealing with alpha_8 which is
Greg Daniel7af060a2017-12-05 16:27:11 -0500998 * internally either alpha8 or red8. Also for Gray_8 which can be luminance_8 or red_8.
Greg Danielef59d872017-11-17 16:47:21 -0500999 */
1000static constexpr GrPixelConfig kAlpha_8_as_Alpha_GrPixelConfig = kPrivateConfig1_GrPixelConfig;
1001static constexpr GrPixelConfig kAlpha_8_as_Red_GrPixelConfig = kPrivateConfig2_GrPixelConfig;
1002static constexpr GrPixelConfig kAlpha_half_as_Red_GrPixelConfig = kPrivateConfig3_GrPixelConfig;
Greg Daniel7af060a2017-12-05 16:27:11 -05001003static constexpr GrPixelConfig kGray_8_as_Lum_GrPixelConfig = kPrivateConfig4_GrPixelConfig;
1004static constexpr GrPixelConfig kGray_8_as_Red_GrPixelConfig = kPrivateConfig5_GrPixelConfig;
Greg Danielef59d872017-11-17 16:47:21 -05001005
1006/**
Brian Salomon9b009bb2018-02-14 13:53:55 -05001007 * Refers to the encoding of a GPU buffer as it will be interpreted by the GPU when sampling and
1008 * blending.
1009 */
1010enum class GrSRGBEncoded : bool { kNo = false, kYes = true };
1011
1012/**
1013 * Describes whether pixel data encoding should be converted to/from linear/sRGB encoding.
1014 */
1015enum class GrSRGBConversion {
1016 kNone,
1017 kSRGBToLinear,
1018 kLinearToSRGB,
1019};
1020
Brian Salomonc320b152018-02-20 14:05:36 -05001021/**
1022 * Utility functions for GrPixelConfig
1023 */
1024
Brian Salomon9b009bb2018-02-14 13:53:55 -05001025// Returns whether the config's color channels are sRGB encoded.
1026static inline GrSRGBEncoded GrPixelConfigIsSRGBEncoded(GrPixelConfig config) {
Greg Danielab081ae2017-11-14 11:02:43 -05001027 switch (config) {
1028 case kSRGBA_8888_GrPixelConfig:
1029 case kSBGRA_8888_GrPixelConfig:
Brian Salomon9b009bb2018-02-14 13:53:55 -05001030 return GrSRGBEncoded::kYes;
Greg Danielab081ae2017-11-14 11:02:43 -05001031 case kUnknown_GrPixelConfig:
1032 case kAlpha_8_GrPixelConfig:
Greg Danielef59d872017-11-17 16:47:21 -05001033 case kAlpha_8_as_Alpha_GrPixelConfig:
1034 case kAlpha_8_as_Red_GrPixelConfig:
Greg Danielab081ae2017-11-14 11:02:43 -05001035 case kGray_8_GrPixelConfig:
Greg Daniel7af060a2017-12-05 16:27:11 -05001036 case kGray_8_as_Lum_GrPixelConfig:
1037 case kGray_8_as_Red_GrPixelConfig:
Greg Danielab081ae2017-11-14 11:02:43 -05001038 case kRGB_565_GrPixelConfig:
1039 case kRGBA_4444_GrPixelConfig:
Brian Salomon5fba7ad2018-03-22 10:01:16 -04001040 case kRGB_888_GrPixelConfig:
Greg Danielab081ae2017-11-14 11:02:43 -05001041 case kRGBA_8888_GrPixelConfig:
1042 case kBGRA_8888_GrPixelConfig:
Brian Osman10fc6fd2018-03-02 11:01:10 -05001043 case kRGBA_1010102_GrPixelConfig:
Greg Danielab081ae2017-11-14 11:02:43 -05001044 case kRGBA_float_GrPixelConfig:
1045 case kRG_float_GrPixelConfig:
1046 case kAlpha_half_GrPixelConfig:
Greg Danielef59d872017-11-17 16:47:21 -05001047 case kAlpha_half_as_Red_GrPixelConfig:
Greg Danielab081ae2017-11-14 11:02:43 -05001048 case kRGBA_half_GrPixelConfig:
Brian Salomon9b009bb2018-02-14 13:53:55 -05001049 return GrSRGBEncoded::kNo;
Greg Danielab081ae2017-11-14 11:02:43 -05001050 }
1051 SK_ABORT("Invalid pixel config");
Brian Salomon9b009bb2018-02-14 13:53:55 -05001052 return GrSRGBEncoded::kNo;
Greg Danielab081ae2017-11-14 11:02:43 -05001053}
1054
Brian Salomon9b009bb2018-02-14 13:53:55 -05001055static inline bool GrPixelConfigIsSRGB(GrPixelConfig config) {
1056 return GrSRGBEncoded::kYes == GrPixelConfigIsSRGBEncoded(config);
1057}
Greg Danielab081ae2017-11-14 11:02:43 -05001058
1059static inline size_t GrBytesPerPixel(GrPixelConfig config) {
1060 switch (config) {
1061 case kAlpha_8_GrPixelConfig:
Greg Danielef59d872017-11-17 16:47:21 -05001062 case kAlpha_8_as_Alpha_GrPixelConfig:
1063 case kAlpha_8_as_Red_GrPixelConfig:
Greg Danielab081ae2017-11-14 11:02:43 -05001064 case kGray_8_GrPixelConfig:
Greg Daniel7af060a2017-12-05 16:27:11 -05001065 case kGray_8_as_Lum_GrPixelConfig:
1066 case kGray_8_as_Red_GrPixelConfig:
Greg Danielab081ae2017-11-14 11:02:43 -05001067 return 1;
1068 case kRGB_565_GrPixelConfig:
1069 case kRGBA_4444_GrPixelConfig:
1070 case kAlpha_half_GrPixelConfig:
Greg Danielef59d872017-11-17 16:47:21 -05001071 case kAlpha_half_as_Red_GrPixelConfig:
Greg Danielab081ae2017-11-14 11:02:43 -05001072 return 2;
1073 case kRGBA_8888_GrPixelConfig:
Brian Salomon5fba7ad2018-03-22 10:01:16 -04001074 case kRGB_888_GrPixelConfig: // Assuming GPUs store this 4-byte aligned.
Greg Danielab081ae2017-11-14 11:02:43 -05001075 case kBGRA_8888_GrPixelConfig:
1076 case kSRGBA_8888_GrPixelConfig:
1077 case kSBGRA_8888_GrPixelConfig:
Brian Osman10fc6fd2018-03-02 11:01:10 -05001078 case kRGBA_1010102_GrPixelConfig:
Greg Danielab081ae2017-11-14 11:02:43 -05001079 return 4;
1080 case kRGBA_half_GrPixelConfig:
1081 return 8;
1082 case kRGBA_float_GrPixelConfig:
1083 return 16;
1084 case kRG_float_GrPixelConfig:
1085 return 8;
1086 case kUnknown_GrPixelConfig:
1087 return 0;
1088 }
1089 SK_ABORT("Invalid pixel config");
1090 return 0;
1091}
1092
1093static inline bool GrPixelConfigIsOpaque(GrPixelConfig config) {
1094 switch (config) {
1095 case kRGB_565_GrPixelConfig:
Brian Salomon5fba7ad2018-03-22 10:01:16 -04001096 case kRGB_888_GrPixelConfig:
Greg Danielab081ae2017-11-14 11:02:43 -05001097 case kGray_8_GrPixelConfig:
Greg Daniel7af060a2017-12-05 16:27:11 -05001098 case kGray_8_as_Lum_GrPixelConfig:
1099 case kGray_8_as_Red_GrPixelConfig:
Greg Danielab081ae2017-11-14 11:02:43 -05001100 case kRG_float_GrPixelConfig:
1101 return true;
1102 case kAlpha_8_GrPixelConfig:
Greg Danielef59d872017-11-17 16:47:21 -05001103 case kAlpha_8_as_Alpha_GrPixelConfig:
1104 case kAlpha_8_as_Red_GrPixelConfig:
Greg Danielab081ae2017-11-14 11:02:43 -05001105 case kRGBA_4444_GrPixelConfig:
1106 case kAlpha_half_GrPixelConfig:
Greg Danielef59d872017-11-17 16:47:21 -05001107 case kAlpha_half_as_Red_GrPixelConfig:
Greg Danielab081ae2017-11-14 11:02:43 -05001108 case kRGBA_8888_GrPixelConfig:
1109 case kBGRA_8888_GrPixelConfig:
1110 case kSRGBA_8888_GrPixelConfig:
1111 case kSBGRA_8888_GrPixelConfig:
Brian Osman10fc6fd2018-03-02 11:01:10 -05001112 case kRGBA_1010102_GrPixelConfig:
Greg Danielab081ae2017-11-14 11:02:43 -05001113 case kRGBA_half_GrPixelConfig:
1114 case kRGBA_float_GrPixelConfig:
1115 case kUnknown_GrPixelConfig:
1116 return false;
1117 }
1118 SK_ABORT("Invalid pixel config");
1119 return false;
1120}
1121
1122static inline bool GrPixelConfigIsAlphaOnly(GrPixelConfig config) {
1123 switch (config) {
1124 case kAlpha_8_GrPixelConfig:
Greg Danielef59d872017-11-17 16:47:21 -05001125 case kAlpha_8_as_Alpha_GrPixelConfig:
1126 case kAlpha_8_as_Red_GrPixelConfig:
Greg Danielab081ae2017-11-14 11:02:43 -05001127 case kAlpha_half_GrPixelConfig:
Greg Danielef59d872017-11-17 16:47:21 -05001128 case kAlpha_half_as_Red_GrPixelConfig:
Greg Danielab081ae2017-11-14 11:02:43 -05001129 return true;
1130 case kUnknown_GrPixelConfig:
1131 case kGray_8_GrPixelConfig:
Greg Daniel7af060a2017-12-05 16:27:11 -05001132 case kGray_8_as_Lum_GrPixelConfig:
1133 case kGray_8_as_Red_GrPixelConfig:
Greg Danielab081ae2017-11-14 11:02:43 -05001134 case kRGB_565_GrPixelConfig:
1135 case kRGBA_4444_GrPixelConfig:
1136 case kRGBA_8888_GrPixelConfig:
Brian Salomon5fba7ad2018-03-22 10:01:16 -04001137 case kRGB_888_GrPixelConfig:
Greg Danielab081ae2017-11-14 11:02:43 -05001138 case kBGRA_8888_GrPixelConfig:
1139 case kSRGBA_8888_GrPixelConfig:
1140 case kSBGRA_8888_GrPixelConfig:
Brian Osman10fc6fd2018-03-02 11:01:10 -05001141 case kRGBA_1010102_GrPixelConfig:
Greg Danielab081ae2017-11-14 11:02:43 -05001142 case kRGBA_float_GrPixelConfig:
1143 case kRG_float_GrPixelConfig:
1144 case kRGBA_half_GrPixelConfig:
1145 return false;
1146 }
1147 SK_ABORT("Invalid pixel config.");
1148 return false;
1149}
1150
Chris Dalton47c8ed32017-11-15 18:27:09 -07001151/**
1152 * Precision qualifier that should be used with a sampler.
1153 */
1154static inline GrSLPrecision GrSLSamplerPrecision(GrPixelConfig config) {
1155 switch (config) {
1156 case kUnknown_GrPixelConfig:
1157 case kAlpha_8_GrPixelConfig:
Greg Danielef59d872017-11-17 16:47:21 -05001158 case kAlpha_8_as_Alpha_GrPixelConfig:
1159 case kAlpha_8_as_Red_GrPixelConfig:
Chris Dalton47c8ed32017-11-15 18:27:09 -07001160 case kGray_8_GrPixelConfig:
Greg Daniel7af060a2017-12-05 16:27:11 -05001161 case kGray_8_as_Lum_GrPixelConfig:
1162 case kGray_8_as_Red_GrPixelConfig:
Chris Dalton47c8ed32017-11-15 18:27:09 -07001163 case kRGB_565_GrPixelConfig:
1164 case kRGBA_4444_GrPixelConfig:
1165 case kRGBA_8888_GrPixelConfig:
Brian Salomon5fba7ad2018-03-22 10:01:16 -04001166 case kRGB_888_GrPixelConfig:
Chris Dalton47c8ed32017-11-15 18:27:09 -07001167 case kBGRA_8888_GrPixelConfig:
1168 case kSRGBA_8888_GrPixelConfig:
1169 case kSBGRA_8888_GrPixelConfig:
Chris Dalton47c8ed32017-11-15 18:27:09 -07001170 return kLow_GrSLPrecision;
1171 case kRGBA_float_GrPixelConfig:
1172 case kRG_float_GrPixelConfig:
1173 return kHigh_GrSLPrecision;
1174 case kAlpha_half_GrPixelConfig:
Greg Danielef59d872017-11-17 16:47:21 -05001175 case kAlpha_half_as_Red_GrPixelConfig:
Chris Dalton47c8ed32017-11-15 18:27:09 -07001176 case kRGBA_half_GrPixelConfig:
Brian Osman10fc6fd2018-03-02 11:01:10 -05001177 case kRGBA_1010102_GrPixelConfig:
Chris Dalton47c8ed32017-11-15 18:27:09 -07001178 return kMedium_GrSLPrecision;
1179 }
1180 SK_ABORT("Unexpected type");
1181 return kHigh_GrSLPrecision;
1182}
1183
Brian Salomonc320b152018-02-20 14:05:36 -05001184/**
1185 * Like SkColorType this describes a layout of pixel data in CPU memory. It specifies the channels,
1186 * their type, and width. This exists so that the GPU backend can have private types that have no
1187 * analog in the public facing SkColorType enum and omit types not implemented in the GPU backend.
1188 * It does not refer to a texture format and the mapping to texture formats may be many-to-many.
1189 * It does not specify the sRGB encding of the stored values.
1190 */
1191enum class GrColorType {
1192 kUnknown,
1193 kAlpha_8,
1194 kRGB_565,
1195 kABGR_4444, // This name differs from SkColorType. kARGB_4444_SkColorType is misnamed.
1196 kRGBA_8888,
Brian Salomon5fba7ad2018-03-22 10:01:16 -04001197 kRGB_888x,
Brian Salomonc320b152018-02-20 14:05:36 -05001198 kBGRA_8888,
Brian Osman10fc6fd2018-03-02 11:01:10 -05001199 kRGBA_1010102,
Brian Salomonc320b152018-02-20 14:05:36 -05001200 kGray_8,
1201 kAlpha_F16,
1202 kRGBA_F16,
1203 kRG_F32,
1204 kRGBA_F32,
1205};
1206
1207static inline SkColorType GrColorTypeToSkColorType(GrColorType ct) {
1208 switch (ct) {
Brian Osman10fc6fd2018-03-02 11:01:10 -05001209 case GrColorType::kUnknown: return kUnknown_SkColorType;
1210 case GrColorType::kAlpha_8: return kAlpha_8_SkColorType;
1211 case GrColorType::kRGB_565: return kRGB_565_SkColorType;
1212 case GrColorType::kABGR_4444: return kARGB_4444_SkColorType;
1213 case GrColorType::kRGBA_8888: return kRGBA_8888_SkColorType;
Brian Salomon5fba7ad2018-03-22 10:01:16 -04001214 case GrColorType::kRGB_888x: return kRGB_888x_SkColorType;
Brian Osman10fc6fd2018-03-02 11:01:10 -05001215 case GrColorType::kBGRA_8888: return kBGRA_8888_SkColorType;
1216 case GrColorType::kRGBA_1010102: return kRGBA_1010102_SkColorType;
1217 case GrColorType::kGray_8: return kGray_8_SkColorType;
1218 case GrColorType::kAlpha_F16: return kUnknown_SkColorType;
1219 case GrColorType::kRGBA_F16: return kRGBA_F16_SkColorType;
1220 case GrColorType::kRG_F32: return kUnknown_SkColorType;
Mike Klein37854712018-06-26 11:43:06 -04001221 case GrColorType::kRGBA_F32: return kRGBA_F32_SkColorType;
Brian Salomonc320b152018-02-20 14:05:36 -05001222 }
1223 SK_ABORT("Invalid GrColorType");
1224 return kUnknown_SkColorType;
1225}
1226
1227static inline GrColorType SkColorTypeToGrColorType(SkColorType ct) {
1228 switch (ct) {
1229 case kUnknown_SkColorType: return GrColorType::kUnknown;
1230 case kAlpha_8_SkColorType: return GrColorType::kAlpha_8;
1231 case kRGB_565_SkColorType: return GrColorType::kRGB_565;
1232 case kARGB_4444_SkColorType: return GrColorType::kABGR_4444;
1233 case kRGBA_8888_SkColorType: return GrColorType::kRGBA_8888;
Brian Salomon5fba7ad2018-03-22 10:01:16 -04001234 case kRGB_888x_SkColorType: return GrColorType::kRGB_888x;
Brian Salomonc320b152018-02-20 14:05:36 -05001235 case kBGRA_8888_SkColorType: return GrColorType::kBGRA_8888;
Brian Salomonc320b152018-02-20 14:05:36 -05001236 case kGray_8_SkColorType: return GrColorType::kGray_8;
1237 case kRGBA_F16_SkColorType: return GrColorType::kRGBA_F16;
Brian Osman10fc6fd2018-03-02 11:01:10 -05001238 case kRGBA_1010102_SkColorType: return GrColorType::kRGBA_1010102;
Brian Salomonc320b152018-02-20 14:05:36 -05001239 case kRGB_101010x_SkColorType: return GrColorType::kUnknown;
Mike Klein37854712018-06-26 11:43:06 -04001240 case kRGBA_F32_SkColorType: return GrColorType::kRGBA_F32;
Brian Salomonc320b152018-02-20 14:05:36 -05001241 }
1242 SK_ABORT("Invalid SkColorType");
1243 return GrColorType::kUnknown;
1244}
1245
Brian Salomon5fba7ad2018-03-22 10:01:16 -04001246static inline uint32_t GrColorTypeComponentFlags(GrColorType ct) {
1247 switch (ct) {
1248 case GrColorType::kUnknown: return 0;
1249 case GrColorType::kAlpha_8: return kAlpha_SkColorTypeComponentFlag;
1250 case GrColorType::kRGB_565: return kRGB_SkColorTypeComponentFlags;
1251 case GrColorType::kABGR_4444: return kRGBA_SkColorTypeComponentFlags;
1252 case GrColorType::kRGBA_8888: return kRGBA_SkColorTypeComponentFlags;
1253 case GrColorType::kRGB_888x: return kRGB_SkColorTypeComponentFlags;
1254 case GrColorType::kBGRA_8888: return kRGBA_SkColorTypeComponentFlags;
1255 case GrColorType::kRGBA_1010102: return kRGBA_SkColorTypeComponentFlags;
1256 case GrColorType::kGray_8: return kGray_SkColorTypeComponentFlag;
1257 case GrColorType::kAlpha_F16: return kAlpha_SkColorTypeComponentFlag;
1258 case GrColorType::kRGBA_F16: return kRGBA_SkColorTypeComponentFlags;
1259 case GrColorType::kRG_F32: return kRed_SkColorTypeComponentFlag |
1260 kGreen_SkColorTypeComponentFlag;
1261 case GrColorType::kRGBA_F32: return kRGBA_SkColorTypeComponentFlags;
1262 }
1263 SK_ABORT("Invalid GrColorType");
1264 return kUnknown_SkColorType;
1265}
1266
1267static inline bool GrColorTypeIsAlphaOnly(GrColorType ct) {
1268 return kAlpha_SkColorTypeComponentFlag == GrColorTypeComponentFlags(ct);
1269}
1270
1271static inline bool GrColorTypeHasAlpha(GrColorType ct) {
1272 return kAlpha_SkColorTypeComponentFlag & GrColorTypeComponentFlags(ct);
1273}
1274
Brian Salomonc320b152018-02-20 14:05:36 -05001275static inline int GrColorTypeBytesPerPixel(GrColorType ct) {
1276 switch (ct) {
Brian Osman10fc6fd2018-03-02 11:01:10 -05001277 case GrColorType::kUnknown: return 0;
1278 case GrColorType::kAlpha_8: return 1;
1279 case GrColorType::kRGB_565: return 2;
1280 case GrColorType::kABGR_4444: return 2;
1281 case GrColorType::kRGBA_8888: return 4;
Brian Salomon5fba7ad2018-03-22 10:01:16 -04001282 case GrColorType::kRGB_888x: return 4;
Brian Osman10fc6fd2018-03-02 11:01:10 -05001283 case GrColorType::kBGRA_8888: return 4;
1284 case GrColorType::kRGBA_1010102: return 4;
1285 case GrColorType::kGray_8: return 1;
1286 case GrColorType::kAlpha_F16: return 2;
1287 case GrColorType::kRGBA_F16: return 8;
1288 case GrColorType::kRG_F32: return 8;
1289 case GrColorType::kRGBA_F32: return 16;
Brian Salomonc320b152018-02-20 14:05:36 -05001290 }
1291 SK_ABORT("Invalid GrColorType");
1292 return 0;
1293}
1294
Brian Salomonc320b152018-02-20 14:05:36 -05001295static inline GrColorType GrPixelConfigToColorTypeAndEncoding(GrPixelConfig config,
1296 GrSRGBEncoded* srgbEncoded) {
1297 SkASSERT(srgbEncoded);
1298 switch (config) {
1299 case kUnknown_GrPixelConfig:
1300 return GrColorType::kUnknown;
1301 case kAlpha_8_GrPixelConfig:
1302 *srgbEncoded = GrSRGBEncoded::kNo;
1303 return GrColorType::kAlpha_8;
1304 case kGray_8_GrPixelConfig:
1305 *srgbEncoded = GrSRGBEncoded::kNo;
1306 return GrColorType::kGray_8;
1307 case kRGB_565_GrPixelConfig:
1308 *srgbEncoded = GrSRGBEncoded::kNo;
1309 return GrColorType::kRGB_565;
1310 case kRGBA_4444_GrPixelConfig:
1311 *srgbEncoded = GrSRGBEncoded::kNo;
1312 return GrColorType::kABGR_4444;
1313 case kRGBA_8888_GrPixelConfig:
1314 *srgbEncoded = GrSRGBEncoded::kNo;
1315 return GrColorType::kRGBA_8888;
Brian Salomon5fba7ad2018-03-22 10:01:16 -04001316 case kRGB_888_GrPixelConfig:
1317 *srgbEncoded = GrSRGBEncoded::kNo;
1318 return GrColorType::kRGB_888x;
Brian Salomonc320b152018-02-20 14:05:36 -05001319 case kBGRA_8888_GrPixelConfig:
1320 *srgbEncoded = GrSRGBEncoded::kNo;
1321 return GrColorType::kBGRA_8888;
1322 case kSRGBA_8888_GrPixelConfig:
1323 *srgbEncoded = GrSRGBEncoded::kYes;
1324 return GrColorType::kRGBA_8888;
1325 case kSBGRA_8888_GrPixelConfig:
1326 *srgbEncoded = GrSRGBEncoded::kYes;
1327 return GrColorType::kBGRA_8888;
Brian Osman10fc6fd2018-03-02 11:01:10 -05001328 case kRGBA_1010102_GrPixelConfig:
1329 *srgbEncoded = GrSRGBEncoded::kNo;
1330 return GrColorType::kRGBA_1010102;
Brian Salomonc320b152018-02-20 14:05:36 -05001331 case kRGBA_float_GrPixelConfig:
1332 *srgbEncoded = GrSRGBEncoded::kNo;
1333 return GrColorType::kRGBA_F32;
1334 case kRG_float_GrPixelConfig:
1335 *srgbEncoded = GrSRGBEncoded::kNo;
1336 return GrColorType::kRG_F32;
1337 case kAlpha_half_GrPixelConfig:
1338 *srgbEncoded = GrSRGBEncoded::kNo;
1339 return GrColorType::kAlpha_F16;
1340 case kRGBA_half_GrPixelConfig:
1341 *srgbEncoded = GrSRGBEncoded::kNo;
1342 return GrColorType::kRGBA_F16;
1343 case kAlpha_8_as_Alpha_GrPixelConfig:
1344 *srgbEncoded = GrSRGBEncoded::kNo;
1345 return GrColorType::kAlpha_8;
1346 case kAlpha_8_as_Red_GrPixelConfig:
1347 *srgbEncoded = GrSRGBEncoded::kNo;
1348 return GrColorType::kAlpha_8;
1349 case kAlpha_half_as_Red_GrPixelConfig:
1350 *srgbEncoded = GrSRGBEncoded::kNo;
1351 return GrColorType::kAlpha_F16;
1352 case kGray_8_as_Lum_GrPixelConfig:
1353 *srgbEncoded = GrSRGBEncoded::kNo;
1354 return GrColorType::kGray_8;
1355 case kGray_8_as_Red_GrPixelConfig:
1356 *srgbEncoded = GrSRGBEncoded::kNo;
1357 return GrColorType::kGray_8;
1358 }
1359 SK_ABORT("Invalid GrPixelConfig");
1360 return GrColorType::kUnknown;
1361}
1362
1363static inline GrColorType GrPixelConfigToColorType(GrPixelConfig config) {
1364 GrSRGBEncoded bogusEncoded;
1365 return GrPixelConfigToColorTypeAndEncoding(config, &bogusEncoded);
1366}
1367
1368static inline GrPixelConfig GrColorTypeToPixelConfig(GrColorType config,
1369 GrSRGBEncoded srgbEncoded) {
1370 switch (config) {
1371 case GrColorType::kUnknown:
1372 return kUnknown_GrPixelConfig;
1373 case GrColorType::kAlpha_8:
1374 return (GrSRGBEncoded::kYes == srgbEncoded) ? kUnknown_GrPixelConfig
1375 : kAlpha_8_GrPixelConfig;
1376
1377 case GrColorType::kGray_8:
1378 return (GrSRGBEncoded::kYes == srgbEncoded) ? kUnknown_GrPixelConfig
1379 : kGray_8_GrPixelConfig;
1380
1381 case GrColorType::kRGB_565:
1382 return (GrSRGBEncoded::kYes == srgbEncoded) ? kUnknown_GrPixelConfig
1383 : kRGB_565_GrPixelConfig;
1384
1385 case GrColorType::kABGR_4444:
1386 return (GrSRGBEncoded::kYes == srgbEncoded) ? kUnknown_GrPixelConfig
1387 : kRGBA_4444_GrPixelConfig;
1388
1389 case GrColorType::kRGBA_8888:
1390 return (GrSRGBEncoded::kYes == srgbEncoded) ? kSRGBA_8888_GrPixelConfig
1391 : kRGBA_8888_GrPixelConfig;
1392
Brian Salomon5fba7ad2018-03-22 10:01:16 -04001393 case GrColorType::kRGB_888x:
1394 return (GrSRGBEncoded::kYes == srgbEncoded) ? kUnknown_GrPixelConfig
1395 : kRGB_888_GrPixelConfig;
1396
Brian Salomonc320b152018-02-20 14:05:36 -05001397 case GrColorType::kBGRA_8888:
1398 return (GrSRGBEncoded::kYes == srgbEncoded) ? kSBGRA_8888_GrPixelConfig
1399 : kBGRA_8888_GrPixelConfig;
1400
Brian Osman10fc6fd2018-03-02 11:01:10 -05001401 case GrColorType::kRGBA_1010102:
1402 return (GrSRGBEncoded::kYes == srgbEncoded) ? kUnknown_GrPixelConfig
1403 : kRGBA_1010102_GrPixelConfig;
1404
Brian Salomonc320b152018-02-20 14:05:36 -05001405 case GrColorType::kRGBA_F32:
1406 return (GrSRGBEncoded::kYes == srgbEncoded) ? kUnknown_GrPixelConfig
1407 : kRGBA_float_GrPixelConfig;
1408
1409 case GrColorType::kRG_F32:
1410 return (GrSRGBEncoded::kYes == srgbEncoded) ? kUnknown_GrPixelConfig
1411 : kRG_float_GrPixelConfig;
1412
1413 case GrColorType::kAlpha_F16:
1414 return (GrSRGBEncoded::kYes == srgbEncoded) ? kUnknown_GrPixelConfig
1415 : kAlpha_half_GrPixelConfig;
1416
1417 case GrColorType::kRGBA_F16:
1418 return (GrSRGBEncoded::kYes == srgbEncoded) ? kUnknown_GrPixelConfig
1419 : kRGBA_half_GrPixelConfig;
1420 }
1421 SK_ABORT("Invalid GrColorType");
1422 return kUnknown_GrPixelConfig;
1423}
1424
Greg Danielfcea56c2018-03-06 15:17:57 -05001425class GrReleaseProcHelper : public SkWeakRefCnt {
Greg Daniel6a0176b2018-01-30 09:28:44 -05001426public:
1427 // These match the definitions in SkImage, from whence they came
1428 typedef void* ReleaseCtx;
1429 typedef void (*ReleaseProc)(ReleaseCtx);
1430
1431 GrReleaseProcHelper(ReleaseProc proc, ReleaseCtx ctx) : fReleaseProc(proc), fReleaseCtx(ctx) {}
Greg Danielfcea56c2018-03-06 15:17:57 -05001432 ~GrReleaseProcHelper() override {}
1433
1434 void weak_dispose() const override {
Greg Daniel6a0176b2018-01-30 09:28:44 -05001435 fReleaseProc(fReleaseCtx);
1436 }
1437
1438private:
1439 ReleaseProc fReleaseProc;
1440 ReleaseCtx fReleaseCtx;
1441};
1442
commit-bot@chromium.orgff6ea262013-03-12 12:26:08 +00001443#endif