blob: 4b6b709f7a9452628f8d4b4fc15d50c3033f6664 [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
Chris Dalton916c4982018-08-15 00:53:25 -0600205enum class GrScissorTest : bool {
206 kDisabled = false,
207 kEnabled = true
208};
209
Brian Salomonf4a00e42018-03-23 15:15:03 -0400210struct GrMipLevel {
211 const void* fPixels;
212 size_t fRowBytes;
213};
214
215/**
216 * This enum is used to specify the load operation to be used when an opList/GrGpuCommandBuffer
217 * begins execution.
Robert Phillips6b47c7d2017-08-29 07:24:09 -0400218 */
219enum class GrLoadOp {
220 kLoad,
221 kClear,
222 kDiscard,
223};
224
Brian Salomonf4a00e42018-03-23 15:15:03 -0400225/**
226 * This enum is used to specify the store operation to be used when an opList/GrGpuCommandBuffer
227 * ends execution.
Robert Phillips6b47c7d2017-08-29 07:24:09 -0400228 */
229enum class GrStoreOp {
230 kStore,
231 kDiscard,
232};
233
Brian Salomonf4a00e42018-03-23 15:15:03 -0400234/**
235 * Used to control antialiasing in draw calls.
236 */
237enum class GrAA : bool {
238 kNo = false,
239 kYes = true
240};
241
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500242/** This enum indicates the type of antialiasing to be performed. */
Brian Salomonaf9847e2017-03-01 11:28:27 -0500243enum class GrAAType : unsigned {
Brian Salomon0e8fc8b2016-12-09 15:10:07 -0500244 /** No antialiasing */
245 kNone,
246 /** Use fragment shader code to compute a fractional pixel coverage. */
247 kCoverage,
248 /** Use normal MSAA. */
249 kMSAA,
250 /**
251 * Use "mixed samples" MSAA such that the stencil buffer is multisampled but the color buffer is
252 * not.
253 */
254 kMixedSamples
255};
256
Brian Salomon0abc8b42016-12-13 10:22:54 -0500257static inline bool GrAATypeIsHW(GrAAType type) {
258 switch (type) {
259 case GrAAType::kNone:
260 return false;
261 case GrAAType::kCoverage:
262 return false;
263 case GrAAType::kMSAA:
264 return true;
265 case GrAAType::kMixedSamples:
266 return true;
267 }
Ben Wagnerb4aab9a2017-08-16 10:53:04 -0400268 SK_ABORT("Unknown AA Type");
Brian Salomon0abc8b42016-12-13 10:22:54 -0500269 return false;
270}
271
Brian Salomon7c8460e2017-05-12 11:36:10 -0400272/** The type of full scene antialiasing supported by a render target. */
273enum class GrFSAAType {
274 /** No FSAA */
275 kNone,
276 /** Regular MSAA where each attachment has the same sample count. */
277 kUnifiedMSAA,
278 /** One color sample, N stencil samples. */
279 kMixedSamples,
280};
281
282/**
283 * Not all drawing code paths support using mixed samples when available and instead use
284 * coverage-based aa.
285 */
Chris Dalton3b51df12017-11-27 14:33:06 -0700286enum class GrAllowMixedSamples : bool { kNo = false, kYes = true };
Brian Salomon7c8460e2017-05-12 11:36:10 -0400287
Brian Salomonea26d6b2018-01-23 20:33:21 +0000288GrAAType GrChooseAAType(GrAA, GrFSAAType, GrAllowMixedSamples, const GrCaps&);
Brian Salomon7c8460e2017-05-12 11:36:10 -0400289
Brian Salomon0abc8b42016-12-13 10:22:54 -0500290/**
291 * Types of shader-language-specific boxed variables we can create. (Currently only GrGLShaderVars,
292 * but should be applicable to other shader languages.)
293 */
commit-bot@chromium.orgff6ea262013-03-12 12:26:08 +0000294enum GrSLType {
295 kVoid_GrSLType,
Brian Salomonfa26e662016-11-14 11:27:00 -0500296 kBool_GrSLType,
Ruiqi Maob609e6d2018-07-17 10:19:38 -0400297 kByte_GrSLType,
298 kByte2_GrSLType,
299 kByte3_GrSLType,
300 kByte4_GrSLType,
301 kUByte_GrSLType,
302 kUByte2_GrSLType,
303 kUByte3_GrSLType,
304 kUByte4_GrSLType,
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400305 kShort_GrSLType,
Chris Dalton51ebd662017-10-24 16:10:48 -0600306 kShort2_GrSLType,
307 kShort3_GrSLType,
308 kShort4_GrSLType,
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400309 kUShort_GrSLType,
Chris Dalton51ebd662017-10-24 16:10:48 -0600310 kUShort2_GrSLType,
311 kUShort3_GrSLType,
312 kUShort4_GrSLType,
Ethan Nicholas8aa45692017-09-20 11:24:15 -0400313 kFloat_GrSLType,
314 kFloat2_GrSLType,
315 kFloat3_GrSLType,
316 kFloat4_GrSLType,
317 kFloat2x2_GrSLType,
318 kFloat3x3_GrSLType,
319 kFloat4x4_GrSLType,
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400320 kHalf_GrSLType,
321 kHalf2_GrSLType,
322 kHalf3_GrSLType,
323 kHalf4_GrSLType,
324 kHalf2x2_GrSLType,
325 kHalf3x3_GrSLType,
326 kHalf4x4_GrSLType,
Ethan Nicholas88d99c62017-08-16 16:41:30 -0400327 kInt_GrSLType,
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400328 kInt2_GrSLType,
329 kInt3_GrSLType,
330 kInt4_GrSLType,
Brian Salomon1d816b92017-08-17 11:07:59 -0400331 kUint_GrSLType,
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400332 kUint2_GrSLType,
egdaniel990dbc82016-07-13 14:09:30 -0700333 kTexture2DSampler_GrSLType,
334 kTextureExternalSampler_GrSLType,
335 kTexture2DRectSampler_GrSLType,
commit-bot@chromium.orgff6ea262013-03-12 12:26:08 +0000336};
337
Brian Salomon60dd8c72018-07-30 10:24:13 -0400338/**
339 * The type of texture. Backends other than GL currently only use the 2D value but the type must
340 * still be known at the API-neutral layer as it used to determine whether MIP maps, renderability,
341 * and sampling parameters are legal for proxies that will be instantiated with wrapped textures.
342 */
343enum class GrTextureType {
344 k2D,
345 kRectangle,
346 kExternal
347};
348
bsalomon17168df2014-12-09 09:00:49 -0800349enum GrShaderType {
350 kVertex_GrShaderType,
351 kGeometry_GrShaderType,
352 kFragment_GrShaderType,
353
354 kLastkFragment_GrShaderType = kFragment_GrShaderType
355};
356static const int kGrShaderTypeCount = kLastkFragment_GrShaderType + 1;
357
cdalton5e58cee2016-02-11 12:49:47 -0800358enum GrShaderFlags {
359 kNone_GrShaderFlags = 0,
360 kVertex_GrShaderFlag = 1 << kVertex_GrShaderType,
361 kGeometry_GrShaderFlag = 1 << kGeometry_GrShaderType,
362 kFragment_GrShaderFlag = 1 << kFragment_GrShaderType
363};
364GR_MAKE_BITFIELD_OPS(GrShaderFlags);
365
bsalomon@google.com31ec7982013-03-27 18:14:57 +0000366/**
bsalomonc0bd6482014-12-09 10:04:14 -0800367 * Precisions of shader language variables. Not all shading languages support precisions or actually
bsalomon422f56f2014-12-09 10:18:12 -0800368 * vary the internal precision based on the qualifiers. These currently only apply to float types (
369 * including float vectors and matrices).
bsalomonc0bd6482014-12-09 10:04:14 -0800370 */
371enum GrSLPrecision {
372 kLow_GrSLPrecision,
373 kMedium_GrSLPrecision,
374 kHigh_GrSLPrecision,
375
Brian Osman33aa2c72017-04-05 09:26:15 -0400376 // Default precision is a special tag that means "whatever the default for the program/type
377 // combination is". In other words, it maps to the empty string in shader code. There are some
378 // scenarios where kDefault is not allowed (as the default precision for a program, or for
379 // varyings, for example).
380 kDefault_GrSLPrecision,
bsalomonc0bd6482014-12-09 10:04:14 -0800381
Brian Osman33aa2c72017-04-05 09:26:15 -0400382 // We only consider the "real" precisions here
383 kLast_GrSLPrecision = kHigh_GrSLPrecision,
bsalomonc0bd6482014-12-09 10:04:14 -0800384};
385
386static const int kGrSLPrecisionCount = kLast_GrSLPrecision + 1;
387
ethannicholas22793252016-01-30 09:59:10 -0800388/** Is the shading language type float (including vectors/matrices)? */
bsalomon422f56f2014-12-09 10:18:12 -0800389static inline bool GrSLTypeIsFloatType(GrSLType type) {
Brian Salomonfa26e662016-11-14 11:27:00 -0500390 switch (type) {
Ethan Nicholas8aa45692017-09-20 11:24:15 -0400391 case kFloat_GrSLType:
392 case kFloat2_GrSLType:
393 case kFloat3_GrSLType:
394 case kFloat4_GrSLType:
395 case kFloat2x2_GrSLType:
396 case kFloat3x3_GrSLType:
397 case kFloat4x4_GrSLType:
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400398 case kHalf_GrSLType:
399 case kHalf2_GrSLType:
400 case kHalf3_GrSLType:
401 case kHalf4_GrSLType:
402 case kHalf2x2_GrSLType:
403 case kHalf3x3_GrSLType:
404 case kHalf4x4_GrSLType:
Brian Salomonfa26e662016-11-14 11:27:00 -0500405 return true;
bsalomon422f56f2014-12-09 10:18:12 -0800406
Brian Salomonfa26e662016-11-14 11:27:00 -0500407 case kVoid_GrSLType:
408 case kTexture2DSampler_GrSLType:
Brian Salomonfa26e662016-11-14 11:27:00 -0500409 case kTextureExternalSampler_GrSLType:
410 case kTexture2DRectSampler_GrSLType:
Brian Salomonfa26e662016-11-14 11:27:00 -0500411 case kBool_GrSLType:
Ruiqi Maob609e6d2018-07-17 10:19:38 -0400412 case kByte_GrSLType:
413 case kByte2_GrSLType:
414 case kByte3_GrSLType:
415 case kByte4_GrSLType:
416 case kUByte_GrSLType:
417 case kUByte2_GrSLType:
418 case kUByte3_GrSLType:
419 case kUByte4_GrSLType:
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400420 case kShort_GrSLType:
Chris Dalton51ebd662017-10-24 16:10:48 -0600421 case kShort2_GrSLType:
422 case kShort3_GrSLType:
423 case kShort4_GrSLType:
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400424 case kUShort_GrSLType:
Chris Dalton51ebd662017-10-24 16:10:48 -0600425 case kUShort2_GrSLType:
426 case kUShort3_GrSLType:
427 case kUShort4_GrSLType:
Ethan Nicholas88d99c62017-08-16 16:41:30 -0400428 case kInt_GrSLType:
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400429 case kInt2_GrSLType:
430 case kInt3_GrSLType:
431 case kInt4_GrSLType:
Brian Salomon1d816b92017-08-17 11:07:59 -0400432 case kUint_GrSLType:
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400433 case kUint2_GrSLType:
Brian Salomonfa26e662016-11-14 11:27:00 -0500434 return false;
435 }
Ben Wagnerb4aab9a2017-08-16 10:53:04 -0400436 SK_ABORT("Unexpected type");
Brian Salomonfa26e662016-11-14 11:27:00 -0500437 return false;
bsalomone5286e02016-01-14 09:24:09 -0800438}
439
Brian Salomon04460cc2017-12-06 14:47:42 -0500440/** If the type represents a single value or vector return the vector length, else -1. */
441static inline int GrSLTypeVecLength(GrSLType type) {
442 switch (type) {
443 case kFloat_GrSLType:
444 case kHalf_GrSLType:
445 case kBool_GrSLType:
Ruiqi Maob609e6d2018-07-17 10:19:38 -0400446 case kByte_GrSLType:
447 case kUByte_GrSLType:
Brian Salomon04460cc2017-12-06 14:47:42 -0500448 case kShort_GrSLType:
449 case kUShort_GrSLType:
450 case kInt_GrSLType:
451 case kUint_GrSLType:
452 return 1;
453
454 case kFloat2_GrSLType:
455 case kHalf2_GrSLType:
Ruiqi Maob609e6d2018-07-17 10:19:38 -0400456 case kByte2_GrSLType:
457 case kUByte2_GrSLType:
Brian Salomon04460cc2017-12-06 14:47:42 -0500458 case kShort2_GrSLType:
459 case kUShort2_GrSLType:
460 case kInt2_GrSLType:
461 case kUint2_GrSLType:
462 return 2;
463
464 case kFloat3_GrSLType:
465 case kHalf3_GrSLType:
Ruiqi Maob609e6d2018-07-17 10:19:38 -0400466 case kByte3_GrSLType:
467 case kUByte3_GrSLType:
Brian Salomon04460cc2017-12-06 14:47:42 -0500468 case kShort3_GrSLType:
469 case kUShort3_GrSLType:
470 case kInt3_GrSLType:
471 return 3;
472
473 case kFloat4_GrSLType:
474 case kHalf4_GrSLType:
Ruiqi Maob609e6d2018-07-17 10:19:38 -0400475 case kByte4_GrSLType:
476 case kUByte4_GrSLType:
Brian Salomon04460cc2017-12-06 14:47:42 -0500477 case kShort4_GrSLType:
478 case kUShort4_GrSLType:
479 case kInt4_GrSLType:
480 return 4;
481
482 case kFloat2x2_GrSLType:
483 case kFloat3x3_GrSLType:
484 case kFloat4x4_GrSLType:
485 case kHalf2x2_GrSLType:
486 case kHalf3x3_GrSLType:
487 case kHalf4x4_GrSLType:
488 case kVoid_GrSLType:
489 case kTexture2DSampler_GrSLType:
Brian Salomon04460cc2017-12-06 14:47:42 -0500490 case kTextureExternalSampler_GrSLType:
491 case kTexture2DRectSampler_GrSLType:
Brian Salomon04460cc2017-12-06 14:47:42 -0500492 return -1;
493 }
494 SK_ABORT("Unexpected type");
495 return -1;
496}
497
Brian Salomon60dd8c72018-07-30 10:24:13 -0400498static inline GrSLType GrSLCombinedSamplerTypeForTextureType(GrTextureType type) {
499 switch (type) {
500 case GrTextureType::k2D:
501 return kTexture2DSampler_GrSLType;
502 case GrTextureType::kRectangle:
503 return kTexture2DRectSampler_GrSLType;
504 case GrTextureType::kExternal:
505 return kTextureExternalSampler_GrSLType;
506 }
507 SK_ABORT("Unexpected texture type");
508 return kTexture2DSampler_GrSLType;
509}
510
Brian Salomon7226c232018-07-30 13:13:17 -0400511/** Rectangle and external textures ony support the clamp wrap mode and do not support MIP maps. */
512static inline bool GrTextureTypeHasRestrictedSampling(GrTextureType type) {
513 switch (type) {
514 case GrTextureType::k2D:
515 return false;
516 case GrTextureType::kRectangle:
517 return true;
518 case GrTextureType::kExternal:
519 return true;
520 }
521 SK_ABORT("Unexpected texture type");
522 return false;
523}
524
egdaniel990dbc82016-07-13 14:09:30 -0700525static inline bool GrSLTypeIsCombinedSamplerType(GrSLType type) {
Brian Salomonfa26e662016-11-14 11:27:00 -0500526 switch (type) {
527 case kTexture2DSampler_GrSLType:
Brian Salomonfa26e662016-11-14 11:27:00 -0500528 case kTextureExternalSampler_GrSLType:
529 case kTexture2DRectSampler_GrSLType:
Brian Salomonfa26e662016-11-14 11:27:00 -0500530 return true;
cdalton74b8d322016-04-11 14:47:28 -0700531
Brian Salomonfa26e662016-11-14 11:27:00 -0500532 case kVoid_GrSLType:
Ethan Nicholas8aa45692017-09-20 11:24:15 -0400533 case kFloat_GrSLType:
534 case kFloat2_GrSLType:
535 case kFloat3_GrSLType:
536 case kFloat4_GrSLType:
537 case kFloat2x2_GrSLType:
538 case kFloat3x3_GrSLType:
539 case kFloat4x4_GrSLType:
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400540 case kHalf_GrSLType:
541 case kHalf2_GrSLType:
542 case kHalf3_GrSLType:
543 case kHalf4_GrSLType:
544 case kHalf2x2_GrSLType:
545 case kHalf3x3_GrSLType:
546 case kHalf4x4_GrSLType:
Brian Salomonfa26e662016-11-14 11:27:00 -0500547 case kInt_GrSLType:
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400548 case kInt2_GrSLType:
549 case kInt3_GrSLType:
550 case kInt4_GrSLType:
Brian Salomonfa26e662016-11-14 11:27:00 -0500551 case kUint_GrSLType:
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400552 case kUint2_GrSLType:
Brian Salomonfa26e662016-11-14 11:27:00 -0500553 case kBool_GrSLType:
Ruiqi Maob609e6d2018-07-17 10:19:38 -0400554 case kByte_GrSLType:
555 case kByte2_GrSLType:
556 case kByte3_GrSLType:
557 case kByte4_GrSLType:
558 case kUByte_GrSLType:
559 case kUByte2_GrSLType:
560 case kUByte3_GrSLType:
561 case kUByte4_GrSLType:
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400562 case kShort_GrSLType:
Chris Dalton51ebd662017-10-24 16:10:48 -0600563 case kShort2_GrSLType:
564 case kShort3_GrSLType:
565 case kShort4_GrSLType:
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400566 case kUShort_GrSLType:
Chris Dalton51ebd662017-10-24 16:10:48 -0600567 case kUShort2_GrSLType:
568 case kUShort3_GrSLType:
569 case kUShort4_GrSLType:
Brian Salomonfa26e662016-11-14 11:27:00 -0500570 return false;
571 }
Ben Wagnerb4aab9a2017-08-16 10:53:04 -0400572 SK_ABORT("Unexpected type");
Brian Salomonfa26e662016-11-14 11:27:00 -0500573 return false;
cdalton74b8d322016-04-11 14:47:28 -0700574}
575
cdalton5f2d8e22016-03-11 13:34:32 -0800576static inline bool GrSLTypeAcceptsPrecision(GrSLType type) {
Brian Salomonfa26e662016-11-14 11:27:00 -0500577 switch (type) {
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400578 case kTexture2DSampler_GrSLType:
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400579 case kTextureExternalSampler_GrSLType:
580 case kTexture2DRectSampler_GrSLType:
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400581 return true;
582
583 case kVoid_GrSLType:
584 case kBool_GrSLType:
Ruiqi Maob609e6d2018-07-17 10:19:38 -0400585 case kByte_GrSLType:
586 case kByte2_GrSLType:
587 case kByte3_GrSLType:
588 case kByte4_GrSLType:
589 case kUByte_GrSLType:
590 case kUByte2_GrSLType:
591 case kUByte3_GrSLType:
592 case kUByte4_GrSLType:
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400593 case kShort_GrSLType:
Chris Dalton51ebd662017-10-24 16:10:48 -0600594 case kShort2_GrSLType:
595 case kShort3_GrSLType:
596 case kShort4_GrSLType:
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400597 case kUShort_GrSLType:
Chris Dalton51ebd662017-10-24 16:10:48 -0600598 case kUShort2_GrSLType:
599 case kUShort3_GrSLType:
600 case kUShort4_GrSLType:
Ethan Nicholas8aa45692017-09-20 11:24:15 -0400601 case kFloat_GrSLType:
602 case kFloat2_GrSLType:
603 case kFloat3_GrSLType:
604 case kFloat4_GrSLType:
605 case kFloat2x2_GrSLType:
606 case kFloat3x3_GrSLType:
607 case kFloat4x4_GrSLType:
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400608 case kHalf_GrSLType:
609 case kHalf2_GrSLType:
610 case kHalf3_GrSLType:
611 case kHalf4_GrSLType:
612 case kHalf2x2_GrSLType:
613 case kHalf3x3_GrSLType:
614 case kHalf4x4_GrSLType:
Ethan Nicholas88d99c62017-08-16 16:41:30 -0400615 case kInt_GrSLType:
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400616 case kInt2_GrSLType:
617 case kInt3_GrSLType:
618 case kInt4_GrSLType:
Ethan Nicholas88d99c62017-08-16 16:41:30 -0400619 case kUint_GrSLType:
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400620 case kUint2_GrSLType:
621 return false;
622 }
623 SK_ABORT("Unexpected type");
624 return false;
625}
626
627// temporarily accepting (but ignoring) precision modifiers on the new types; this will be killed
628// in a future CL
629static inline bool GrSLTypeTemporarilyAcceptsPrecision(GrSLType type) {
630 switch (type) {
631 case kShort_GrSLType:
632 case kUShort_GrSLType:
Ethan Nicholas8aa45692017-09-20 11:24:15 -0400633 case kFloat_GrSLType:
634 case kFloat2_GrSLType:
635 case kFloat3_GrSLType:
636 case kFloat4_GrSLType:
637 case kFloat2x2_GrSLType:
638 case kFloat3x3_GrSLType:
639 case kFloat4x4_GrSLType:
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400640 case kHalf_GrSLType:
641 case kHalf2_GrSLType:
642 case kHalf3_GrSLType:
643 case kHalf4_GrSLType:
644 case kHalf2x2_GrSLType:
645 case kHalf3x3_GrSLType:
646 case kHalf4x4_GrSLType:
647 case kInt_GrSLType:
648 case kInt2_GrSLType:
649 case kInt3_GrSLType:
650 case kInt4_GrSLType:
651 case kUint_GrSLType:
652 case kUint2_GrSLType:
Brian Salomonfa26e662016-11-14 11:27:00 -0500653 case kTexture2DSampler_GrSLType:
Brian Salomonfa26e662016-11-14 11:27:00 -0500654 case kTextureExternalSampler_GrSLType:
655 case kTexture2DRectSampler_GrSLType:
Brian Salomonfa26e662016-11-14 11:27:00 -0500656 return true;
657
658 case kVoid_GrSLType:
659 case kBool_GrSLType:
Ruiqi Maob609e6d2018-07-17 10:19:38 -0400660 case kByte_GrSLType:
661 case kByte2_GrSLType:
662 case kByte3_GrSLType:
663 case kByte4_GrSLType:
664 case kUByte_GrSLType:
665 case kUByte2_GrSLType:
666 case kUByte3_GrSLType:
667 case kUByte4_GrSLType:
Chris Dalton51ebd662017-10-24 16:10:48 -0600668 case kShort2_GrSLType:
669 case kShort3_GrSLType:
670 case kShort4_GrSLType:
671 case kUShort2_GrSLType:
672 case kUShort3_GrSLType:
673 case kUShort4_GrSLType:
Brian Salomonfa26e662016-11-14 11:27:00 -0500674 return false;
675 }
Ben Wagnerb4aab9a2017-08-16 10:53:04 -0400676 SK_ABORT("Unexpected type");
Brian Salomonfa26e662016-11-14 11:27:00 -0500677 return false;
cdalton5f2d8e22016-03-11 13:34:32 -0800678}
679
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000680//////////////////////////////////////////////////////////////////////////////
681
jvanverth@google.com054ae992013-04-01 20:06:51 +0000682/**
683 * Types used to describe format of vertices in arrays.
Brian Salomonc5886032017-07-19 11:48:05 -0400684 */
bsalomon@google.com31ec7982013-03-27 18:14:57 +0000685enum GrVertexAttribType {
686 kFloat_GrVertexAttribType = 0,
Ethan Nicholasfa7ee242017-09-25 09:52:04 -0400687 kFloat2_GrVertexAttribType,
688 kFloat3_GrVertexAttribType,
689 kFloat4_GrVertexAttribType,
690 kHalf_GrVertexAttribType,
691 kHalf2_GrVertexAttribType,
692 kHalf3_GrVertexAttribType,
693 kHalf4_GrVertexAttribType,
egdaniel37b4d862014-11-03 10:07:07 -0800694
Ethan Nicholasfa7ee242017-09-25 09:52:04 -0400695 kInt2_GrVertexAttribType, // vector of 2 32-bit ints
696 kInt3_GrVertexAttribType, // vector of 3 32-bit ints
697 kInt4_GrVertexAttribType, // vector of 4 32-bit ints
csmartdaltonb37cb232017-02-08 14:56:27 -0500698
Ruiqi Maob609e6d2018-07-17 10:19:38 -0400699
700 kByte_GrVertexAttribType, // signed byte
701 kByte2_GrVertexAttribType, // vector of 2 8-bit signed bytes
702 kByte3_GrVertexAttribType, // vector of 3 8-bit signed bytes
703 kByte4_GrVertexAttribType, // vector of 4 8-bit signed bytes
704 kUByte_GrVertexAttribType, // unsigned byte
705 kUByte2_GrVertexAttribType, // vector of 2 8-bit unsigned bytes
706 kUByte3_GrVertexAttribType, // vector of 3 8-bit unsigned bytes
707 kUByte4_GrVertexAttribType, // vector of 4 8-bit unsigned bytes
708
Ethan Nicholasfa7ee242017-09-25 09:52:04 -0400709 kUByte_norm_GrVertexAttribType, // unsigned byte, e.g. coverage, 0 -> 0.0f, 255 -> 1.0f.
710 kUByte4_norm_GrVertexAttribType, // vector of 4 unsigned bytes, e.g. colors, 0 -> 0.0f,
711 // 255 -> 1.0f.
bsalomon@google.com31ec7982013-03-27 18:14:57 +0000712
Chris Daltona045eea2017-10-24 13:22:10 -0600713 kShort2_GrVertexAttribType, // vector of 2 16-bit shorts.
714 kUShort2_GrVertexAttribType, // vector of 2 unsigned shorts. 0 -> 0, 65535 -> 65535.
715 kUShort2_norm_GrVertexAttribType, // vector of 2 unsigned shorts. 0 -> 0.0f, 65535 -> 1.0f.
ethannicholas22793252016-01-30 09:59:10 -0800716
717 kInt_GrVertexAttribType,
cdalton793dc262016-02-08 10:11:47 -0800718 kUint_GrVertexAttribType,
egdaniel990dbc82016-07-13 14:09:30 -0700719
cdalton793dc262016-02-08 10:11:47 -0800720 kLast_GrVertexAttribType = kUint_GrVertexAttribType
bsalomon@google.com31ec7982013-03-27 18:14:57 +0000721};
722static const int kGrVertexAttribTypeCount = kLast_GrVertexAttribType + 1;
723
jvanverth@google.com054ae992013-04-01 20:06:51 +0000724/**
joshualitt2dd1ae02014-12-03 06:24:10 -0800725 * converts a GrVertexAttribType to a GrSLType
jvanverth@google.com054ae992013-04-01 20:06:51 +0000726 */
joshualitt2dd1ae02014-12-03 06:24:10 -0800727static inline GrSLType GrVertexAttribTypeToSLType(GrVertexAttribType type) {
728 switch (type) {
Chris Daltona045eea2017-10-24 13:22:10 -0600729 case kShort2_GrVertexAttribType:
730 return kShort2_GrSLType;
Ethan Nicholasfa7ee242017-09-25 09:52:04 -0400731 case kUShort2_GrVertexAttribType:
Chris Dalton51ebd662017-10-24 16:10:48 -0600732 return kUShort2_GrSLType;
Chris Daltona045eea2017-10-24 13:22:10 -0600733 case kUShort2_norm_GrVertexAttribType:
734 return kFloat2_GrSLType;
Ethan Nicholasfa7ee242017-09-25 09:52:04 -0400735 case kUByte_norm_GrVertexAttribType: // fall through
joshualitt2dd1ae02014-12-03 06:24:10 -0800736 case kFloat_GrVertexAttribType:
Ethan Nicholas8aa45692017-09-20 11:24:15 -0400737 return kFloat_GrSLType;
Ethan Nicholasfa7ee242017-09-25 09:52:04 -0400738 case kFloat2_GrVertexAttribType:
Ethan Nicholas8aa45692017-09-20 11:24:15 -0400739 return kFloat2_GrSLType;
Ethan Nicholasfa7ee242017-09-25 09:52:04 -0400740 case kFloat3_GrVertexAttribType:
Ethan Nicholas8aa45692017-09-20 11:24:15 -0400741 return kFloat3_GrSLType;
Ethan Nicholasfa7ee242017-09-25 09:52:04 -0400742 case kFloat4_GrVertexAttribType:
Ethan Nicholas8aa45692017-09-20 11:24:15 -0400743 return kFloat4_GrSLType;
Ethan Nicholasfa7ee242017-09-25 09:52:04 -0400744 case kHalf_GrVertexAttribType:
745 return kHalf_GrSLType;
746 case kHalf2_GrVertexAttribType:
747 return kHalf2_GrSLType;
748 case kHalf3_GrVertexAttribType:
749 return kHalf3_GrSLType;
750 case kHalf4_GrVertexAttribType:
751 case kUByte4_norm_GrVertexAttribType:
752 return kHalf4_GrSLType;
753 case kInt2_GrVertexAttribType:
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400754 return kInt2_GrSLType;
Ethan Nicholasfa7ee242017-09-25 09:52:04 -0400755 case kInt3_GrVertexAttribType:
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400756 return kInt3_GrSLType;
Ethan Nicholasfa7ee242017-09-25 09:52:04 -0400757 case kInt4_GrVertexAttribType:
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400758 return kInt4_GrSLType;
Ruiqi Maob609e6d2018-07-17 10:19:38 -0400759 case kByte_GrVertexAttribType:
760 return kByte_GrSLType;
761 case kByte2_GrVertexAttribType:
762 return kByte_GrSLType;
763 case kByte3_GrVertexAttribType:
764 return kByte_GrSLType;
765 case kByte4_GrVertexAttribType:
766 return kByte4_GrSLType;
767 case kUByte_GrVertexAttribType:
768 return kUByte_GrSLType;
769 case kUByte2_GrVertexAttribType:
770 return kUByte_GrSLType;
771 case kUByte3_GrVertexAttribType:
772 return kUByte_GrSLType;
773 case kUByte4_GrVertexAttribType:
774 return kUByte4_GrSLType;
ethannicholas22793252016-01-30 09:59:10 -0800775 case kInt_GrVertexAttribType:
776 return kInt_GrSLType;
cdalton793dc262016-02-08 10:11:47 -0800777 case kUint_GrVertexAttribType:
778 return kUint_GrSLType;
bsalomon@google.com31ec7982013-03-27 18:14:57 +0000779 }
Ben Wagnerb4aab9a2017-08-16 10:53:04 -0400780 SK_ABORT("Unsupported type conversion");
Brian Salomonfa26e662016-11-14 11:27:00 -0500781 return kVoid_GrSLType;
joshualitt2dd1ae02014-12-03 06:24:10 -0800782}
bsalomon@google.com31ec7982013-03-27 18:14:57 +0000783
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000784//////////////////////////////////////////////////////////////////////////////
785
Ethan Nicholas1706f842017-11-10 11:58:19 -0500786static const int kGrClipEdgeTypeCnt = (int) GrClipEdgeType::kLast + 1;
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000787
Ethan Nicholas0f3c7322017-11-09 14:51:17 -0500788static inline bool GrProcessorEdgeTypeIsFill(const GrClipEdgeType edgeType) {
Ethan Nicholas1706f842017-11-10 11:58:19 -0500789 return (GrClipEdgeType::kFillAA == edgeType || GrClipEdgeType::kFillBW == edgeType);
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000790}
791
Ethan Nicholas0f3c7322017-11-09 14:51:17 -0500792static inline bool GrProcessorEdgeTypeIsInverseFill(const GrClipEdgeType edgeType) {
Ethan Nicholas1706f842017-11-10 11:58:19 -0500793 return (GrClipEdgeType::kInverseFillAA == edgeType ||
794 GrClipEdgeType::kInverseFillBW == edgeType);
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000795}
796
Ethan Nicholas0f3c7322017-11-09 14:51:17 -0500797static inline bool GrProcessorEdgeTypeIsAA(const GrClipEdgeType edgeType) {
Ethan Nicholas1706f842017-11-10 11:58:19 -0500798 return (GrClipEdgeType::kFillBW != edgeType &&
799 GrClipEdgeType::kInverseFillBW != edgeType);
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000800}
801
Ethan Nicholas0f3c7322017-11-09 14:51:17 -0500802static inline GrClipEdgeType GrInvertProcessorEdgeType(const GrClipEdgeType edgeType) {
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000803 switch (edgeType) {
Ethan Nicholas1706f842017-11-10 11:58:19 -0500804 case GrClipEdgeType::kFillBW:
805 return GrClipEdgeType::kInverseFillBW;
806 case GrClipEdgeType::kFillAA:
807 return GrClipEdgeType::kInverseFillAA;
808 case GrClipEdgeType::kInverseFillBW:
809 return GrClipEdgeType::kFillBW;
810 case GrClipEdgeType::kInverseFillAA:
811 return GrClipEdgeType::kFillAA;
812 case GrClipEdgeType::kHairlineAA:
Ben Wagnerb4aab9a2017-08-16 10:53:04 -0400813 SK_ABORT("Hairline fill isn't invertible.");
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000814 }
Ethan Nicholas1706f842017-11-10 11:58:19 -0500815 return GrClipEdgeType::kFillAA; // suppress warning.
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000816}
817
bsalomonbcf0a522014-10-08 08:40:09 -0700818/**
819 * Indicates the type of pending IO operations that can be recorded for gpu resources.
820 */
821enum GrIOType {
822 kRead_GrIOType,
823 kWrite_GrIOType,
824 kRW_GrIOType
825};
826
jvanverth17aa0472016-01-05 10:41:27 -0800827/**
Brian Salomonc5886032017-07-19 11:48:05 -0400828 * Indicates the type of data that a GPU buffer will be used for.
829 */
cdalton397536c2016-03-25 12:15:03 -0700830enum GrBufferType {
831 kVertex_GrBufferType,
832 kIndex_GrBufferType,
cdaltone2e71c22016-04-07 18:13:29 -0700833 kTexel_GrBufferType,
834 kDrawIndirect_GrBufferType,
cdalton397536c2016-03-25 12:15:03 -0700835 kXferCpuToGpu_GrBufferType,
836 kXferGpuToCpu_GrBufferType,
837
838 kLast_GrBufferType = kXferGpuToCpu_GrBufferType
839};
cdaltone2e71c22016-04-07 18:13:29 -0700840static const int kGrBufferTypeCount = kLast_GrBufferType + 1;
841
842static inline bool GrBufferTypeIsVertexOrIndex(GrBufferType type) {
843 SkASSERT(type >= 0 && type < kGrBufferTypeCount);
844 return type <= kIndex_GrBufferType;
845
846 GR_STATIC_ASSERT(0 == kVertex_GrBufferType);
847 GR_STATIC_ASSERT(1 == kIndex_GrBufferType);
848}
cdalton397536c2016-03-25 12:15:03 -0700849
850/**
Brian Salomonc5886032017-07-19 11:48:05 -0400851 * Provides a performance hint regarding the frequency at which a data store will be accessed.
852 */
cdalton397536c2016-03-25 12:15:03 -0700853enum GrAccessPattern {
854 /** Data store will be respecified repeatedly and used many times. */
855 kDynamic_GrAccessPattern,
856 /** Data store will be specified once and used many times. (Thus disqualified from caching.) */
857 kStatic_GrAccessPattern,
858 /** Data store will be specified once and used at most a few times. (Also can't be cached.) */
859 kStream_GrAccessPattern,
860
861 kLast_GrAccessPattern = kStream_GrAccessPattern
jvanverth17aa0472016-01-05 10:41:27 -0800862};
863
Robert Phillipsfe0253f2018-03-16 16:47:25 -0400864// Flags shared between the GrSurface & GrSurfaceProxy class hierarchies
865enum class GrInternalSurfaceFlags {
Greg Danielb73a9f82018-05-02 15:06:47 -0400866 kNone = 0,
Robert Phillipsc4f0a822017-06-13 08:11:36 -0400867
Robert Phillipsfe0253f2018-03-16 16:47:25 -0400868 // Surface-level
Greg Danielb73a9f82018-05-02 15:06:47 -0400869 kNoPendingIO = 1 << 0,
Robert Phillipsfe0253f2018-03-16 16:47:25 -0400870
Greg Danielb73a9f82018-05-02 15:06:47 -0400871 kSurfaceMask = kNoPendingIO,
Greg Daniel849dce12018-04-24 14:32:53 -0400872
Robert Phillipsfe0253f2018-03-16 16:47:25 -0400873 // RT-only
874
Robert Phillipsc4f0a822017-06-13 08:11:36 -0400875 // For internal resources:
876 // this is enabled whenever MSAA is enabled and GrCaps reports mixed samples are supported
877 // For wrapped resources:
878 // this is disabled for FBO0
879 // but, otherwise, is enabled whenever MSAA is enabled and GrCaps reports mixed samples
880 // are supported
Greg Daniel09c94002018-06-08 22:11:51 +0000881 kMixedSampled = 1 << 2,
Robert Phillipsc4f0a822017-06-13 08:11:36 -0400882
883 // For internal resources:
884 // this is enabled whenever GrCaps reports window rect support
885 // For wrapped resources1
886 // this is disabled for FBO0
887 // but, otherwise, is enabled whenever GrCaps reports window rect support
Greg Daniel09c94002018-06-08 22:11:51 +0000888 kWindowRectsSupport = 1 << 3,
Greg Daniel849dce12018-04-24 14:32:53 -0400889
Greg Daniela070ed72018-04-26 16:31:38 -0400890 // 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 +0000891 kGLRTFBOIDIs0 = 1 << 4,
Greg Daniela070ed72018-04-26 16:31:38 -0400892
Greg Danielb73a9f82018-05-02 15:06:47 -0400893 kRenderTargetMask = kMixedSampled | kWindowRectsSupport | kGLRTFBOIDIs0,
Robert Phillipsc4f0a822017-06-13 08:11:36 -0400894};
Robert Phillipsfe0253f2018-03-16 16:47:25 -0400895GR_MAKE_BITFIELD_CLASS_OPS(GrInternalSurfaceFlags)
jvanverth17aa0472016-01-05 10:41:27 -0800896
joshualitt7d022d62015-05-12 12:03:50 -0700897#ifdef SK_DEBUG
bsalomon682c2692015-05-22 14:01:46 -0700898// Takes a pointer to a GrCaps, and will suppress prints if required
Brian Salomonc5886032017-07-19 11:48:05 -0400899#define GrCapsDebugf(caps, ...) \
900 if (!(caps)->suppressPrints()) { \
901 SkDebugf(__VA_ARGS__); \
joshualitt7d022d62015-05-12 12:03:50 -0700902 }
903#else
bsalomon682c2692015-05-22 14:01:46 -0700904#define GrCapsDebugf(caps, ...)
joshualitt7d022d62015-05-12 12:03:50 -0700905#endif
906
kkinnunen2e6055b2016-04-22 01:48:29 -0700907/**
908 * Specifies if the holder owns the backend, OpenGL or Vulkan, object.
909 */
910enum class GrBackendObjectOwnership : bool {
911 /** Holder does not destroy the backend object. */
912 kBorrowed = false,
913 /** Holder destroys the backend object. */
914 kOwned = true
915};
916
Brian Salomonaff329b2017-08-11 09:40:37 -0400917template <typename T>
918T* const* unique_ptr_address_as_pointer_address(std::unique_ptr<T> const* up) {
919 static_assert(sizeof(T*) == sizeof(std::unique_ptr<T>), "unique_ptr not expected size.");
920 return reinterpret_cast<T* const*>(up);
bungeman06ca8ec2016-06-09 08:01:03 -0700921}
922
jvanverth84741b32016-09-30 08:39:02 -0700923/*
924 * Object for CPU-GPU synchronization
925 */
Greg Daniel6be35232017-03-01 17:01:09 -0500926typedef uint64_t GrFence;
jvanverth84741b32016-09-30 08:39:02 -0700927
Brian Osman195c05b2017-08-30 15:14:04 -0400928/**
929 * Used to include or exclude specific GPU path renderers for testing purposes.
930 */
931enum class GpuPathRenderers {
932 kNone = 0, // Always use sofware masks and/or GrDefaultPathRenderer.
933 kDashLine = 1 << 0,
934 kStencilAndCover = 1 << 1,
Chris Dalton9acfc6c2018-07-26 12:34:49 -0600935 kCoverageCounting = 1 << 2,
936 kAAHairline = 1 << 3,
937 kAAConvex = 1 << 4,
938 kAALinearizing = 1 << 5,
939 kSmall = 1 << 6,
940 kTessellating = 1 << 7,
Brian Osman195c05b2017-08-30 15:14:04 -0400941
Chris Dalton9acfc6c2018-07-26 12:34:49 -0600942 kAll = (kTessellating | (kTessellating - 1))
Brian Osman195c05b2017-08-30 15:14:04 -0400943};
944
Greg Daniel0fc4d2d2017-10-12 11:23:36 -0400945/**
946 * Used to describe the current state of Mips on a GrTexture
947 */
948enum class GrMipMapsStatus {
949 kNotAllocated, // Mips have not been allocated
950 kDirty, // Mips are allocated but the full mip tree does not have valid data
951 kValid, // All levels fully allocated and have valid data in them
952};
953
Brian Osman195c05b2017-08-30 15:14:04 -0400954GR_MAKE_BITFIELD_CLASS_OPS(GpuPathRenderers)
955
Greg Danielab081ae2017-11-14 11:02:43 -0500956/**
Greg Danielef59d872017-11-17 16:47:21 -0500957 * We want to extend the GrPixelConfig enum to add cases for dealing with alpha_8 which is
Greg Daniel7af060a2017-12-05 16:27:11 -0500958 * internally either alpha8 or red8. Also for Gray_8 which can be luminance_8 or red_8.
Greg Danielef59d872017-11-17 16:47:21 -0500959 */
960static constexpr GrPixelConfig kAlpha_8_as_Alpha_GrPixelConfig = kPrivateConfig1_GrPixelConfig;
961static constexpr GrPixelConfig kAlpha_8_as_Red_GrPixelConfig = kPrivateConfig2_GrPixelConfig;
962static constexpr GrPixelConfig kAlpha_half_as_Red_GrPixelConfig = kPrivateConfig3_GrPixelConfig;
Greg Daniel7af060a2017-12-05 16:27:11 -0500963static constexpr GrPixelConfig kGray_8_as_Lum_GrPixelConfig = kPrivateConfig4_GrPixelConfig;
964static constexpr GrPixelConfig kGray_8_as_Red_GrPixelConfig = kPrivateConfig5_GrPixelConfig;
Greg Danielef59d872017-11-17 16:47:21 -0500965
966/**
Brian Salomon9b009bb2018-02-14 13:53:55 -0500967 * Refers to the encoding of a GPU buffer as it will be interpreted by the GPU when sampling and
968 * blending.
969 */
970enum class GrSRGBEncoded : bool { kNo = false, kYes = true };
971
972/**
973 * Describes whether pixel data encoding should be converted to/from linear/sRGB encoding.
974 */
975enum class GrSRGBConversion {
976 kNone,
977 kSRGBToLinear,
978 kLinearToSRGB,
979};
980
Brian Salomonc320b152018-02-20 14:05:36 -0500981/**
982 * Utility functions for GrPixelConfig
983 */
984
Brian Salomon9b009bb2018-02-14 13:53:55 -0500985// Returns whether the config's color channels are sRGB encoded.
986static inline GrSRGBEncoded GrPixelConfigIsSRGBEncoded(GrPixelConfig config) {
Greg Danielab081ae2017-11-14 11:02:43 -0500987 switch (config) {
988 case kSRGBA_8888_GrPixelConfig:
989 case kSBGRA_8888_GrPixelConfig:
Brian Salomon9b009bb2018-02-14 13:53:55 -0500990 return GrSRGBEncoded::kYes;
Greg Danielab081ae2017-11-14 11:02:43 -0500991 case kUnknown_GrPixelConfig:
992 case kAlpha_8_GrPixelConfig:
Greg Danielef59d872017-11-17 16:47:21 -0500993 case kAlpha_8_as_Alpha_GrPixelConfig:
994 case kAlpha_8_as_Red_GrPixelConfig:
Greg Danielab081ae2017-11-14 11:02:43 -0500995 case kGray_8_GrPixelConfig:
Greg Daniel7af060a2017-12-05 16:27:11 -0500996 case kGray_8_as_Lum_GrPixelConfig:
997 case kGray_8_as_Red_GrPixelConfig:
Greg Danielab081ae2017-11-14 11:02:43 -0500998 case kRGB_565_GrPixelConfig:
999 case kRGBA_4444_GrPixelConfig:
Brian Salomon5fba7ad2018-03-22 10:01:16 -04001000 case kRGB_888_GrPixelConfig:
Greg Danielab081ae2017-11-14 11:02:43 -05001001 case kRGBA_8888_GrPixelConfig:
1002 case kBGRA_8888_GrPixelConfig:
Brian Osman10fc6fd2018-03-02 11:01:10 -05001003 case kRGBA_1010102_GrPixelConfig:
Greg Danielab081ae2017-11-14 11:02:43 -05001004 case kRGBA_float_GrPixelConfig:
1005 case kRG_float_GrPixelConfig:
1006 case kAlpha_half_GrPixelConfig:
Greg Danielef59d872017-11-17 16:47:21 -05001007 case kAlpha_half_as_Red_GrPixelConfig:
Greg Danielab081ae2017-11-14 11:02:43 -05001008 case kRGBA_half_GrPixelConfig:
Brian Salomon9b009bb2018-02-14 13:53:55 -05001009 return GrSRGBEncoded::kNo;
Greg Danielab081ae2017-11-14 11:02:43 -05001010 }
1011 SK_ABORT("Invalid pixel config");
Brian Salomon9b009bb2018-02-14 13:53:55 -05001012 return GrSRGBEncoded::kNo;
Greg Danielab081ae2017-11-14 11:02:43 -05001013}
1014
Brian Salomon9b009bb2018-02-14 13:53:55 -05001015static inline bool GrPixelConfigIsSRGB(GrPixelConfig config) {
1016 return GrSRGBEncoded::kYes == GrPixelConfigIsSRGBEncoded(config);
1017}
Greg Danielab081ae2017-11-14 11:02:43 -05001018
1019static inline size_t GrBytesPerPixel(GrPixelConfig config) {
1020 switch (config) {
1021 case kAlpha_8_GrPixelConfig:
Greg Danielef59d872017-11-17 16:47:21 -05001022 case kAlpha_8_as_Alpha_GrPixelConfig:
1023 case kAlpha_8_as_Red_GrPixelConfig:
Greg Danielab081ae2017-11-14 11:02:43 -05001024 case kGray_8_GrPixelConfig:
Greg Daniel7af060a2017-12-05 16:27:11 -05001025 case kGray_8_as_Lum_GrPixelConfig:
1026 case kGray_8_as_Red_GrPixelConfig:
Greg Danielab081ae2017-11-14 11:02:43 -05001027 return 1;
1028 case kRGB_565_GrPixelConfig:
1029 case kRGBA_4444_GrPixelConfig:
1030 case kAlpha_half_GrPixelConfig:
Greg Danielef59d872017-11-17 16:47:21 -05001031 case kAlpha_half_as_Red_GrPixelConfig:
Greg Danielab081ae2017-11-14 11:02:43 -05001032 return 2;
1033 case kRGBA_8888_GrPixelConfig:
Brian Salomon5fba7ad2018-03-22 10:01:16 -04001034 case kRGB_888_GrPixelConfig: // Assuming GPUs store this 4-byte aligned.
Greg Danielab081ae2017-11-14 11:02:43 -05001035 case kBGRA_8888_GrPixelConfig:
1036 case kSRGBA_8888_GrPixelConfig:
1037 case kSBGRA_8888_GrPixelConfig:
Brian Osman10fc6fd2018-03-02 11:01:10 -05001038 case kRGBA_1010102_GrPixelConfig:
Greg Danielab081ae2017-11-14 11:02:43 -05001039 return 4;
1040 case kRGBA_half_GrPixelConfig:
1041 return 8;
1042 case kRGBA_float_GrPixelConfig:
1043 return 16;
1044 case kRG_float_GrPixelConfig:
1045 return 8;
1046 case kUnknown_GrPixelConfig:
1047 return 0;
1048 }
1049 SK_ABORT("Invalid pixel config");
1050 return 0;
1051}
1052
1053static inline bool GrPixelConfigIsOpaque(GrPixelConfig config) {
1054 switch (config) {
1055 case kRGB_565_GrPixelConfig:
Brian Salomon5fba7ad2018-03-22 10:01:16 -04001056 case kRGB_888_GrPixelConfig:
Greg Danielab081ae2017-11-14 11:02:43 -05001057 case kGray_8_GrPixelConfig:
Greg Daniel7af060a2017-12-05 16:27:11 -05001058 case kGray_8_as_Lum_GrPixelConfig:
1059 case kGray_8_as_Red_GrPixelConfig:
Greg Danielab081ae2017-11-14 11:02:43 -05001060 case kRG_float_GrPixelConfig:
1061 return true;
1062 case kAlpha_8_GrPixelConfig:
Greg Danielef59d872017-11-17 16:47:21 -05001063 case kAlpha_8_as_Alpha_GrPixelConfig:
1064 case kAlpha_8_as_Red_GrPixelConfig:
Greg Danielab081ae2017-11-14 11:02:43 -05001065 case kRGBA_4444_GrPixelConfig:
1066 case kAlpha_half_GrPixelConfig:
Greg Danielef59d872017-11-17 16:47:21 -05001067 case kAlpha_half_as_Red_GrPixelConfig:
Greg Danielab081ae2017-11-14 11:02:43 -05001068 case kRGBA_8888_GrPixelConfig:
1069 case kBGRA_8888_GrPixelConfig:
1070 case kSRGBA_8888_GrPixelConfig:
1071 case kSBGRA_8888_GrPixelConfig:
Brian Osman10fc6fd2018-03-02 11:01:10 -05001072 case kRGBA_1010102_GrPixelConfig:
Greg Danielab081ae2017-11-14 11:02:43 -05001073 case kRGBA_half_GrPixelConfig:
1074 case kRGBA_float_GrPixelConfig:
1075 case kUnknown_GrPixelConfig:
1076 return false;
1077 }
1078 SK_ABORT("Invalid pixel config");
1079 return false;
1080}
1081
1082static inline bool GrPixelConfigIsAlphaOnly(GrPixelConfig config) {
1083 switch (config) {
1084 case kAlpha_8_GrPixelConfig:
Greg Danielef59d872017-11-17 16:47:21 -05001085 case kAlpha_8_as_Alpha_GrPixelConfig:
1086 case kAlpha_8_as_Red_GrPixelConfig:
Greg Danielab081ae2017-11-14 11:02:43 -05001087 case kAlpha_half_GrPixelConfig:
Greg Danielef59d872017-11-17 16:47:21 -05001088 case kAlpha_half_as_Red_GrPixelConfig:
Greg Danielab081ae2017-11-14 11:02:43 -05001089 return true;
1090 case kUnknown_GrPixelConfig:
1091 case kGray_8_GrPixelConfig:
Greg Daniel7af060a2017-12-05 16:27:11 -05001092 case kGray_8_as_Lum_GrPixelConfig:
1093 case kGray_8_as_Red_GrPixelConfig:
Greg Danielab081ae2017-11-14 11:02:43 -05001094 case kRGB_565_GrPixelConfig:
1095 case kRGBA_4444_GrPixelConfig:
1096 case kRGBA_8888_GrPixelConfig:
Brian Salomon5fba7ad2018-03-22 10:01:16 -04001097 case kRGB_888_GrPixelConfig:
Greg Danielab081ae2017-11-14 11:02:43 -05001098 case kBGRA_8888_GrPixelConfig:
1099 case kSRGBA_8888_GrPixelConfig:
1100 case kSBGRA_8888_GrPixelConfig:
Brian Osman10fc6fd2018-03-02 11:01:10 -05001101 case kRGBA_1010102_GrPixelConfig:
Greg Danielab081ae2017-11-14 11:02:43 -05001102 case kRGBA_float_GrPixelConfig:
1103 case kRG_float_GrPixelConfig:
1104 case kRGBA_half_GrPixelConfig:
1105 return false;
1106 }
1107 SK_ABORT("Invalid pixel config.");
1108 return false;
1109}
1110
Chris Dalton47c8ed32017-11-15 18:27:09 -07001111/**
1112 * Precision qualifier that should be used with a sampler.
1113 */
1114static inline GrSLPrecision GrSLSamplerPrecision(GrPixelConfig config) {
1115 switch (config) {
1116 case kUnknown_GrPixelConfig:
1117 case kAlpha_8_GrPixelConfig:
Greg Danielef59d872017-11-17 16:47:21 -05001118 case kAlpha_8_as_Alpha_GrPixelConfig:
1119 case kAlpha_8_as_Red_GrPixelConfig:
Chris Dalton47c8ed32017-11-15 18:27:09 -07001120 case kGray_8_GrPixelConfig:
Greg Daniel7af060a2017-12-05 16:27:11 -05001121 case kGray_8_as_Lum_GrPixelConfig:
1122 case kGray_8_as_Red_GrPixelConfig:
Chris Dalton47c8ed32017-11-15 18:27:09 -07001123 case kRGB_565_GrPixelConfig:
1124 case kRGBA_4444_GrPixelConfig:
1125 case kRGBA_8888_GrPixelConfig:
Brian Salomon5fba7ad2018-03-22 10:01:16 -04001126 case kRGB_888_GrPixelConfig:
Chris Dalton47c8ed32017-11-15 18:27:09 -07001127 case kBGRA_8888_GrPixelConfig:
1128 case kSRGBA_8888_GrPixelConfig:
1129 case kSBGRA_8888_GrPixelConfig:
Chris Dalton47c8ed32017-11-15 18:27:09 -07001130 return kLow_GrSLPrecision;
1131 case kRGBA_float_GrPixelConfig:
1132 case kRG_float_GrPixelConfig:
1133 return kHigh_GrSLPrecision;
1134 case kAlpha_half_GrPixelConfig:
Greg Danielef59d872017-11-17 16:47:21 -05001135 case kAlpha_half_as_Red_GrPixelConfig:
Chris Dalton47c8ed32017-11-15 18:27:09 -07001136 case kRGBA_half_GrPixelConfig:
Brian Osman10fc6fd2018-03-02 11:01:10 -05001137 case kRGBA_1010102_GrPixelConfig:
Chris Dalton47c8ed32017-11-15 18:27:09 -07001138 return kMedium_GrSLPrecision;
1139 }
1140 SK_ABORT("Unexpected type");
1141 return kHigh_GrSLPrecision;
1142}
1143
Brian Salomonc320b152018-02-20 14:05:36 -05001144/**
1145 * Like SkColorType this describes a layout of pixel data in CPU memory. It specifies the channels,
1146 * their type, and width. This exists so that the GPU backend can have private types that have no
1147 * analog in the public facing SkColorType enum and omit types not implemented in the GPU backend.
1148 * It does not refer to a texture format and the mapping to texture formats may be many-to-many.
1149 * It does not specify the sRGB encding of the stored values.
1150 */
1151enum class GrColorType {
1152 kUnknown,
1153 kAlpha_8,
1154 kRGB_565,
1155 kABGR_4444, // This name differs from SkColorType. kARGB_4444_SkColorType is misnamed.
1156 kRGBA_8888,
Brian Salomon5fba7ad2018-03-22 10:01:16 -04001157 kRGB_888x,
Brian Salomonc320b152018-02-20 14:05:36 -05001158 kBGRA_8888,
Brian Osman10fc6fd2018-03-02 11:01:10 -05001159 kRGBA_1010102,
Brian Salomonc320b152018-02-20 14:05:36 -05001160 kGray_8,
1161 kAlpha_F16,
1162 kRGBA_F16,
1163 kRG_F32,
1164 kRGBA_F32,
1165};
1166
1167static inline SkColorType GrColorTypeToSkColorType(GrColorType ct) {
1168 switch (ct) {
Brian Osman10fc6fd2018-03-02 11:01:10 -05001169 case GrColorType::kUnknown: return kUnknown_SkColorType;
1170 case GrColorType::kAlpha_8: return kAlpha_8_SkColorType;
1171 case GrColorType::kRGB_565: return kRGB_565_SkColorType;
1172 case GrColorType::kABGR_4444: return kARGB_4444_SkColorType;
1173 case GrColorType::kRGBA_8888: return kRGBA_8888_SkColorType;
Brian Salomon5fba7ad2018-03-22 10:01:16 -04001174 case GrColorType::kRGB_888x: return kRGB_888x_SkColorType;
Brian Osman10fc6fd2018-03-02 11:01:10 -05001175 case GrColorType::kBGRA_8888: return kBGRA_8888_SkColorType;
1176 case GrColorType::kRGBA_1010102: return kRGBA_1010102_SkColorType;
1177 case GrColorType::kGray_8: return kGray_8_SkColorType;
1178 case GrColorType::kAlpha_F16: return kUnknown_SkColorType;
1179 case GrColorType::kRGBA_F16: return kRGBA_F16_SkColorType;
1180 case GrColorType::kRG_F32: return kUnknown_SkColorType;
Mike Klein37854712018-06-26 11:43:06 -04001181 case GrColorType::kRGBA_F32: return kRGBA_F32_SkColorType;
Brian Salomonc320b152018-02-20 14:05:36 -05001182 }
1183 SK_ABORT("Invalid GrColorType");
1184 return kUnknown_SkColorType;
1185}
1186
1187static inline GrColorType SkColorTypeToGrColorType(SkColorType ct) {
1188 switch (ct) {
1189 case kUnknown_SkColorType: return GrColorType::kUnknown;
1190 case kAlpha_8_SkColorType: return GrColorType::kAlpha_8;
1191 case kRGB_565_SkColorType: return GrColorType::kRGB_565;
1192 case kARGB_4444_SkColorType: return GrColorType::kABGR_4444;
1193 case kRGBA_8888_SkColorType: return GrColorType::kRGBA_8888;
Brian Salomon5fba7ad2018-03-22 10:01:16 -04001194 case kRGB_888x_SkColorType: return GrColorType::kRGB_888x;
Brian Salomonc320b152018-02-20 14:05:36 -05001195 case kBGRA_8888_SkColorType: return GrColorType::kBGRA_8888;
Brian Salomonc320b152018-02-20 14:05:36 -05001196 case kGray_8_SkColorType: return GrColorType::kGray_8;
1197 case kRGBA_F16_SkColorType: return GrColorType::kRGBA_F16;
Brian Osman10fc6fd2018-03-02 11:01:10 -05001198 case kRGBA_1010102_SkColorType: return GrColorType::kRGBA_1010102;
Brian Salomonc320b152018-02-20 14:05:36 -05001199 case kRGB_101010x_SkColorType: return GrColorType::kUnknown;
Mike Klein37854712018-06-26 11:43:06 -04001200 case kRGBA_F32_SkColorType: return GrColorType::kRGBA_F32;
Brian Salomonc320b152018-02-20 14:05:36 -05001201 }
1202 SK_ABORT("Invalid SkColorType");
1203 return GrColorType::kUnknown;
1204}
1205
Brian Salomon5fba7ad2018-03-22 10:01:16 -04001206static inline uint32_t GrColorTypeComponentFlags(GrColorType ct) {
1207 switch (ct) {
1208 case GrColorType::kUnknown: return 0;
1209 case GrColorType::kAlpha_8: return kAlpha_SkColorTypeComponentFlag;
1210 case GrColorType::kRGB_565: return kRGB_SkColorTypeComponentFlags;
1211 case GrColorType::kABGR_4444: return kRGBA_SkColorTypeComponentFlags;
1212 case GrColorType::kRGBA_8888: return kRGBA_SkColorTypeComponentFlags;
1213 case GrColorType::kRGB_888x: return kRGB_SkColorTypeComponentFlags;
1214 case GrColorType::kBGRA_8888: return kRGBA_SkColorTypeComponentFlags;
1215 case GrColorType::kRGBA_1010102: return kRGBA_SkColorTypeComponentFlags;
1216 case GrColorType::kGray_8: return kGray_SkColorTypeComponentFlag;
1217 case GrColorType::kAlpha_F16: return kAlpha_SkColorTypeComponentFlag;
1218 case GrColorType::kRGBA_F16: return kRGBA_SkColorTypeComponentFlags;
1219 case GrColorType::kRG_F32: return kRed_SkColorTypeComponentFlag |
1220 kGreen_SkColorTypeComponentFlag;
1221 case GrColorType::kRGBA_F32: return kRGBA_SkColorTypeComponentFlags;
1222 }
1223 SK_ABORT("Invalid GrColorType");
1224 return kUnknown_SkColorType;
1225}
1226
1227static inline bool GrColorTypeIsAlphaOnly(GrColorType ct) {
1228 return kAlpha_SkColorTypeComponentFlag == GrColorTypeComponentFlags(ct);
1229}
1230
1231static inline bool GrColorTypeHasAlpha(GrColorType ct) {
1232 return kAlpha_SkColorTypeComponentFlag & GrColorTypeComponentFlags(ct);
1233}
1234
Brian Salomonc320b152018-02-20 14:05:36 -05001235static inline int GrColorTypeBytesPerPixel(GrColorType ct) {
1236 switch (ct) {
Brian Osman10fc6fd2018-03-02 11:01:10 -05001237 case GrColorType::kUnknown: return 0;
1238 case GrColorType::kAlpha_8: return 1;
1239 case GrColorType::kRGB_565: return 2;
1240 case GrColorType::kABGR_4444: return 2;
1241 case GrColorType::kRGBA_8888: return 4;
Brian Salomon5fba7ad2018-03-22 10:01:16 -04001242 case GrColorType::kRGB_888x: return 4;
Brian Osman10fc6fd2018-03-02 11:01:10 -05001243 case GrColorType::kBGRA_8888: return 4;
1244 case GrColorType::kRGBA_1010102: return 4;
1245 case GrColorType::kGray_8: return 1;
1246 case GrColorType::kAlpha_F16: return 2;
1247 case GrColorType::kRGBA_F16: return 8;
1248 case GrColorType::kRG_F32: return 8;
1249 case GrColorType::kRGBA_F32: return 16;
Brian Salomonc320b152018-02-20 14:05:36 -05001250 }
1251 SK_ABORT("Invalid GrColorType");
1252 return 0;
1253}
1254
Brian Salomonc320b152018-02-20 14:05:36 -05001255static inline GrColorType GrPixelConfigToColorTypeAndEncoding(GrPixelConfig config,
1256 GrSRGBEncoded* srgbEncoded) {
1257 SkASSERT(srgbEncoded);
1258 switch (config) {
1259 case kUnknown_GrPixelConfig:
1260 return GrColorType::kUnknown;
1261 case kAlpha_8_GrPixelConfig:
1262 *srgbEncoded = GrSRGBEncoded::kNo;
1263 return GrColorType::kAlpha_8;
1264 case kGray_8_GrPixelConfig:
1265 *srgbEncoded = GrSRGBEncoded::kNo;
1266 return GrColorType::kGray_8;
1267 case kRGB_565_GrPixelConfig:
1268 *srgbEncoded = GrSRGBEncoded::kNo;
1269 return GrColorType::kRGB_565;
1270 case kRGBA_4444_GrPixelConfig:
1271 *srgbEncoded = GrSRGBEncoded::kNo;
1272 return GrColorType::kABGR_4444;
1273 case kRGBA_8888_GrPixelConfig:
1274 *srgbEncoded = GrSRGBEncoded::kNo;
1275 return GrColorType::kRGBA_8888;
Brian Salomon5fba7ad2018-03-22 10:01:16 -04001276 case kRGB_888_GrPixelConfig:
1277 *srgbEncoded = GrSRGBEncoded::kNo;
1278 return GrColorType::kRGB_888x;
Brian Salomonc320b152018-02-20 14:05:36 -05001279 case kBGRA_8888_GrPixelConfig:
1280 *srgbEncoded = GrSRGBEncoded::kNo;
1281 return GrColorType::kBGRA_8888;
1282 case kSRGBA_8888_GrPixelConfig:
1283 *srgbEncoded = GrSRGBEncoded::kYes;
1284 return GrColorType::kRGBA_8888;
1285 case kSBGRA_8888_GrPixelConfig:
1286 *srgbEncoded = GrSRGBEncoded::kYes;
1287 return GrColorType::kBGRA_8888;
Brian Osman10fc6fd2018-03-02 11:01:10 -05001288 case kRGBA_1010102_GrPixelConfig:
1289 *srgbEncoded = GrSRGBEncoded::kNo;
1290 return GrColorType::kRGBA_1010102;
Brian Salomonc320b152018-02-20 14:05:36 -05001291 case kRGBA_float_GrPixelConfig:
1292 *srgbEncoded = GrSRGBEncoded::kNo;
1293 return GrColorType::kRGBA_F32;
1294 case kRG_float_GrPixelConfig:
1295 *srgbEncoded = GrSRGBEncoded::kNo;
1296 return GrColorType::kRG_F32;
1297 case kAlpha_half_GrPixelConfig:
1298 *srgbEncoded = GrSRGBEncoded::kNo;
1299 return GrColorType::kAlpha_F16;
1300 case kRGBA_half_GrPixelConfig:
1301 *srgbEncoded = GrSRGBEncoded::kNo;
1302 return GrColorType::kRGBA_F16;
1303 case kAlpha_8_as_Alpha_GrPixelConfig:
1304 *srgbEncoded = GrSRGBEncoded::kNo;
1305 return GrColorType::kAlpha_8;
1306 case kAlpha_8_as_Red_GrPixelConfig:
1307 *srgbEncoded = GrSRGBEncoded::kNo;
1308 return GrColorType::kAlpha_8;
1309 case kAlpha_half_as_Red_GrPixelConfig:
1310 *srgbEncoded = GrSRGBEncoded::kNo;
1311 return GrColorType::kAlpha_F16;
1312 case kGray_8_as_Lum_GrPixelConfig:
1313 *srgbEncoded = GrSRGBEncoded::kNo;
1314 return GrColorType::kGray_8;
1315 case kGray_8_as_Red_GrPixelConfig:
1316 *srgbEncoded = GrSRGBEncoded::kNo;
1317 return GrColorType::kGray_8;
1318 }
1319 SK_ABORT("Invalid GrPixelConfig");
1320 return GrColorType::kUnknown;
1321}
1322
1323static inline GrColorType GrPixelConfigToColorType(GrPixelConfig config) {
1324 GrSRGBEncoded bogusEncoded;
1325 return GrPixelConfigToColorTypeAndEncoding(config, &bogusEncoded);
1326}
1327
1328static inline GrPixelConfig GrColorTypeToPixelConfig(GrColorType config,
1329 GrSRGBEncoded srgbEncoded) {
1330 switch (config) {
1331 case GrColorType::kUnknown:
1332 return kUnknown_GrPixelConfig;
1333 case GrColorType::kAlpha_8:
1334 return (GrSRGBEncoded::kYes == srgbEncoded) ? kUnknown_GrPixelConfig
1335 : kAlpha_8_GrPixelConfig;
1336
1337 case GrColorType::kGray_8:
1338 return (GrSRGBEncoded::kYes == srgbEncoded) ? kUnknown_GrPixelConfig
1339 : kGray_8_GrPixelConfig;
1340
1341 case GrColorType::kRGB_565:
1342 return (GrSRGBEncoded::kYes == srgbEncoded) ? kUnknown_GrPixelConfig
1343 : kRGB_565_GrPixelConfig;
1344
1345 case GrColorType::kABGR_4444:
1346 return (GrSRGBEncoded::kYes == srgbEncoded) ? kUnknown_GrPixelConfig
1347 : kRGBA_4444_GrPixelConfig;
1348
1349 case GrColorType::kRGBA_8888:
1350 return (GrSRGBEncoded::kYes == srgbEncoded) ? kSRGBA_8888_GrPixelConfig
1351 : kRGBA_8888_GrPixelConfig;
1352
Brian Salomon5fba7ad2018-03-22 10:01:16 -04001353 case GrColorType::kRGB_888x:
1354 return (GrSRGBEncoded::kYes == srgbEncoded) ? kUnknown_GrPixelConfig
1355 : kRGB_888_GrPixelConfig;
1356
Brian Salomonc320b152018-02-20 14:05:36 -05001357 case GrColorType::kBGRA_8888:
1358 return (GrSRGBEncoded::kYes == srgbEncoded) ? kSBGRA_8888_GrPixelConfig
1359 : kBGRA_8888_GrPixelConfig;
1360
Brian Osman10fc6fd2018-03-02 11:01:10 -05001361 case GrColorType::kRGBA_1010102:
1362 return (GrSRGBEncoded::kYes == srgbEncoded) ? kUnknown_GrPixelConfig
1363 : kRGBA_1010102_GrPixelConfig;
1364
Brian Salomonc320b152018-02-20 14:05:36 -05001365 case GrColorType::kRGBA_F32:
1366 return (GrSRGBEncoded::kYes == srgbEncoded) ? kUnknown_GrPixelConfig
1367 : kRGBA_float_GrPixelConfig;
1368
1369 case GrColorType::kRG_F32:
1370 return (GrSRGBEncoded::kYes == srgbEncoded) ? kUnknown_GrPixelConfig
1371 : kRG_float_GrPixelConfig;
1372
1373 case GrColorType::kAlpha_F16:
1374 return (GrSRGBEncoded::kYes == srgbEncoded) ? kUnknown_GrPixelConfig
1375 : kAlpha_half_GrPixelConfig;
1376
1377 case GrColorType::kRGBA_F16:
1378 return (GrSRGBEncoded::kYes == srgbEncoded) ? kUnknown_GrPixelConfig
1379 : kRGBA_half_GrPixelConfig;
1380 }
1381 SK_ABORT("Invalid GrColorType");
1382 return kUnknown_GrPixelConfig;
1383}
1384
Greg Danielfcea56c2018-03-06 15:17:57 -05001385class GrReleaseProcHelper : public SkWeakRefCnt {
Greg Daniel6a0176b2018-01-30 09:28:44 -05001386public:
1387 // These match the definitions in SkImage, from whence they came
1388 typedef void* ReleaseCtx;
1389 typedef void (*ReleaseProc)(ReleaseCtx);
1390
1391 GrReleaseProcHelper(ReleaseProc proc, ReleaseCtx ctx) : fReleaseProc(proc), fReleaseCtx(ctx) {}
Greg Danielfcea56c2018-03-06 15:17:57 -05001392 ~GrReleaseProcHelper() override {}
1393
1394 void weak_dispose() const override {
Greg Daniel6a0176b2018-01-30 09:28:44 -05001395 fReleaseProc(fReleaseCtx);
1396 }
1397
1398private:
1399 ReleaseProc fReleaseProc;
1400 ReleaseCtx fReleaseCtx;
1401};
1402
commit-bot@chromium.orgff6ea262013-03-12 12:26:08 +00001403#endif