Skia
2DGraphicsLibrary
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
GrTypesPriv.h
1 /*
2  * Copyright 2013 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #ifndef GrTypesPriv_DEFINED
9 #define GrTypesPriv_DEFINED
10 
11 #include <chrono>
12 #include "GrTypes.h"
13 #include "SkRefCnt.h"
14 
15 class GrCaps;
16 
17 // The old libstdc++ uses the draft name "monotonic_clock" rather than "steady_clock". This might
18 // not actually be monotonic, depending on how libstdc++ was built. However, this is only currently
19 // used for idle resource purging so it shouldn't cause a correctness problem.
20 #if defined(__GLIBCXX__) && (__GLIBCXX__ < 20130000)
21 using GrStdSteadyClock = std::chrono::monotonic_clock;
22 #else
23 using GrStdSteadyClock = std::chrono::steady_clock;
24 #endif
25 
27 enum class GrAAType : unsigned {
29  kNone,
31  kCoverage,
33  kMSAA,
38  kMixedSamples
39 };
40 
41 static inline bool GrAATypeIsHW(GrAAType type) {
42  switch (type) {
43  case GrAAType::kNone:
44  return false;
45  case GrAAType::kCoverage:
46  return false;
47  case GrAAType::kMSAA:
48  return true;
49  case GrAAType::kMixedSamples:
50  return true;
51  }
52  SkFAIL("Unknown AA Type");
53  return false;
54 }
55 
57 enum class GrFSAAType {
59  kNone,
61  kUnifiedMSAA,
63  kMixedSamples,
64 };
65 
70 enum class GrAllowMixedSamples { kNo, kYes };
71 
72 GrAAType GrChooseAAType(GrAA, GrFSAAType, GrAllowMixedSamples, const GrCaps&);
73 
78 enum GrSLType {
79  kVoid_GrSLType,
80  kBool_GrSLType,
81  kInt_GrSLType,
82  kUint_GrSLType,
83  kFloat_GrSLType,
84  kVec2f_GrSLType,
85  kVec3f_GrSLType,
86  kVec4f_GrSLType,
87  kVec2i_GrSLType,
88  kVec3i_GrSLType,
89  kVec4i_GrSLType,
90  kMat22f_GrSLType,
91  kMat33f_GrSLType,
92  kMat44f_GrSLType,
93  kTexture2DSampler_GrSLType,
94  kITexture2DSampler_GrSLType,
95  kTextureExternalSampler_GrSLType,
96  kTexture2DRectSampler_GrSLType,
97  kBufferSampler_GrSLType,
98  kTexture2D_GrSLType,
99  kSampler_GrSLType,
100  kImageStorage2D_GrSLType,
101  kIImageStorage2D_GrSLType,
102 };
103 
104 enum GrShaderType {
105  kVertex_GrShaderType,
106  kGeometry_GrShaderType,
107  kFragment_GrShaderType,
108 
109  kLastkFragment_GrShaderType = kFragment_GrShaderType
110 };
111 static const int kGrShaderTypeCount = kLastkFragment_GrShaderType + 1;
112 
113 enum GrShaderFlags {
114  kNone_GrShaderFlags = 0,
115  kVertex_GrShaderFlag = 1 << kVertex_GrShaderType,
116  kGeometry_GrShaderFlag = 1 << kGeometry_GrShaderType,
117  kFragment_GrShaderFlag = 1 << kFragment_GrShaderType
118 };
119 GR_MAKE_BITFIELD_OPS(GrShaderFlags);
120 
126 enum GrSLPrecision {
127  kLow_GrSLPrecision,
128  kMedium_GrSLPrecision,
129  kHigh_GrSLPrecision,
130 
131  // Default precision is a special tag that means "whatever the default for the program/type
132  // combination is". In other words, it maps to the empty string in shader code. There are some
133  // scenarios where kDefault is not allowed (as the default precision for a program, or for
134  // varyings, for example).
135  kDefault_GrSLPrecision,
136 
137  // We only consider the "real" precisions here
138  kLast_GrSLPrecision = kHigh_GrSLPrecision,
139 };
140 
141 static const int kGrSLPrecisionCount = kLast_GrSLPrecision + 1;
142 
144 static inline bool GrSLTypeIsFloatType(GrSLType type) {
145  switch (type) {
146  case kFloat_GrSLType:
147  case kVec2f_GrSLType:
148  case kVec3f_GrSLType:
149  case kVec4f_GrSLType:
150  case kMat22f_GrSLType:
151  case kMat33f_GrSLType:
152  case kMat44f_GrSLType:
153  return true;
154 
155  case kVoid_GrSLType:
156  case kTexture2DSampler_GrSLType:
157  case kITexture2DSampler_GrSLType:
158  case kTextureExternalSampler_GrSLType:
159  case kTexture2DRectSampler_GrSLType:
160  case kBufferSampler_GrSLType:
161  case kBool_GrSLType:
162  case kInt_GrSLType:
163  case kUint_GrSLType:
164  case kVec2i_GrSLType:
165  case kVec3i_GrSLType:
166  case kVec4i_GrSLType:
167  case kTexture2D_GrSLType:
168  case kSampler_GrSLType:
169  case kImageStorage2D_GrSLType:
170  case kIImageStorage2D_GrSLType:
171  return false;
172  }
173  SkFAIL("Unexpected type");
174  return false;
175 }
176 
177 static inline bool GrSLTypeIs2DCombinedSamplerType(GrSLType type) {
178  switch (type) {
179  case kTexture2DSampler_GrSLType:
180  case kITexture2DSampler_GrSLType:
181  case kTextureExternalSampler_GrSLType:
182  case kTexture2DRectSampler_GrSLType:
183  return true;
184 
185  case kVoid_GrSLType:
186  case kFloat_GrSLType:
187  case kVec2f_GrSLType:
188  case kVec3f_GrSLType:
189  case kVec4f_GrSLType:
190  case kVec2i_GrSLType:
191  case kVec3i_GrSLType:
192  case kVec4i_GrSLType:
193  case kMat22f_GrSLType:
194  case kMat33f_GrSLType:
195  case kMat44f_GrSLType:
196  case kBufferSampler_GrSLType:
197  case kInt_GrSLType:
198  case kUint_GrSLType:
199  case kBool_GrSLType:
200  case kTexture2D_GrSLType:
201  case kSampler_GrSLType:
202  case kImageStorage2D_GrSLType:
203  case kIImageStorage2D_GrSLType:
204  return false;
205  }
206  SkFAIL("Unexpected type");
207  return false;
208 }
209 
210 static inline bool GrSLTypeIsCombinedSamplerType(GrSLType type) {
211  switch (type) {
212  case kTexture2DSampler_GrSLType:
213  case kITexture2DSampler_GrSLType:
214  case kTextureExternalSampler_GrSLType:
215  case kTexture2DRectSampler_GrSLType:
216  case kBufferSampler_GrSLType:
217  return true;
218 
219  case kVoid_GrSLType:
220  case kFloat_GrSLType:
221  case kVec2f_GrSLType:
222  case kVec3f_GrSLType:
223  case kVec4f_GrSLType:
224  case kVec2i_GrSLType:
225  case kVec3i_GrSLType:
226  case kVec4i_GrSLType:
227  case kMat22f_GrSLType:
228  case kMat33f_GrSLType:
229  case kMat44f_GrSLType:
230  case kInt_GrSLType:
231  case kUint_GrSLType:
232  case kBool_GrSLType:
233  case kTexture2D_GrSLType:
234  case kSampler_GrSLType:
235  case kImageStorage2D_GrSLType:
236  case kIImageStorage2D_GrSLType:
237  return false;
238  }
239  SkFAIL("Unexpected type");
240  return false;
241 }
242 
243 static inline bool GrSLTypeIsImageStorage(GrSLType type) {
244  switch (type) {
245  case kImageStorage2D_GrSLType:
246  case kIImageStorage2D_GrSLType:
247  return true;
248 
249  case kVoid_GrSLType:
250  case kFloat_GrSLType:
251  case kVec2f_GrSLType:
252  case kVec3f_GrSLType:
253  case kVec4f_GrSLType:
254  case kVec2i_GrSLType:
255  case kVec3i_GrSLType:
256  case kVec4i_GrSLType:
257  case kMat22f_GrSLType:
258  case kMat33f_GrSLType:
259  case kMat44f_GrSLType:
260  case kInt_GrSLType:
261  case kUint_GrSLType:
262  case kBool_GrSLType:
263  case kTexture2D_GrSLType:
264  case kSampler_GrSLType:
265  case kTexture2DSampler_GrSLType:
266  case kITexture2DSampler_GrSLType:
267  case kTextureExternalSampler_GrSLType:
268  case kTexture2DRectSampler_GrSLType:
269  case kBufferSampler_GrSLType:
270  return false;
271  }
272  SkFAIL("Unexpected type");
273  return false;
274 }
275 
276 static inline bool GrSLTypeAcceptsPrecision(GrSLType type) {
277  switch (type) {
278  case kInt_GrSLType:
279  case kUint_GrSLType:
280  case kFloat_GrSLType:
281  case kVec2f_GrSLType:
282  case kVec3f_GrSLType:
283  case kVec4f_GrSLType:
284  case kVec2i_GrSLType:
285  case kVec3i_GrSLType:
286  case kVec4i_GrSLType:
287  case kMat22f_GrSLType:
288  case kMat33f_GrSLType:
289  case kMat44f_GrSLType:
290  case kTexture2DSampler_GrSLType:
291  case kITexture2DSampler_GrSLType:
292  case kTextureExternalSampler_GrSLType:
293  case kTexture2DRectSampler_GrSLType:
294  case kBufferSampler_GrSLType:
295  case kTexture2D_GrSLType:
296  case kSampler_GrSLType:
297  case kImageStorage2D_GrSLType:
298  case kIImageStorage2D_GrSLType:
299  return true;
300 
301  case kVoid_GrSLType:
302  case kBool_GrSLType:
303  return false;
304  }
305  SkFAIL("Unexpected type");
306  return false;
307 }
308 
310 
314 enum GrVertexAttribType {
315  kFloat_GrVertexAttribType = 0,
316  kVec2f_GrVertexAttribType,
317  kVec3f_GrVertexAttribType,
318  kVec4f_GrVertexAttribType,
319 
320  kVec2i_GrVertexAttribType, // vector of 2 32-bit ints
321  kVec3i_GrVertexAttribType, // vector of 3 32-bit ints
322  kVec4i_GrVertexAttribType, // vector of 4 32-bit ints
323 
324  kUByte_GrVertexAttribType, // unsigned byte, e.g. coverage
325  kVec4ub_GrVertexAttribType, // vector of 4 unsigned bytes, e.g. colors
326 
327  kVec2us_GrVertexAttribType, // vector of 2 shorts, e.g. texture coordinates
328 
329  kInt_GrVertexAttribType,
330  kUint_GrVertexAttribType,
331 
332  kLast_GrVertexAttribType = kUint_GrVertexAttribType
333 };
334 static const int kGrVertexAttribTypeCount = kLast_GrVertexAttribType + 1;
335 
336 
340 static inline size_t GrVertexAttribTypeSize(GrVertexAttribType type) {
341  switch (type) {
342  case kFloat_GrVertexAttribType:
343  return sizeof(float);
344  case kVec2f_GrVertexAttribType:
345  return 2*sizeof(float);
346  case kVec3f_GrVertexAttribType:
347  return 3*sizeof(float);
348  case kVec4f_GrVertexAttribType:
349  return 4*sizeof(float);
350  case kVec2i_GrVertexAttribType:
351  return 2*sizeof(int32_t);
352  case kVec3i_GrVertexAttribType:
353  return 3*sizeof(int32_t);
354  case kVec4i_GrVertexAttribType:
355  return 4*sizeof(int32_t);
356  case kUByte_GrVertexAttribType:
357  return 1*sizeof(char);
358  case kVec4ub_GrVertexAttribType:
359  return 4*sizeof(char);
360  case kVec2us_GrVertexAttribType:
361  return 2*sizeof(int16_t);
362  case kInt_GrVertexAttribType:
363  return sizeof(int32_t);
364  case kUint_GrVertexAttribType:
365  return sizeof(uint32_t);
366  }
367  SkFAIL("Unexpected attribute type");
368  return 0;
369 }
370 
374 static inline bool GrVertexAttribTypeIsIntType(GrVertexAttribType type) {
375  switch (type) {
376  case kFloat_GrVertexAttribType:
377  return false;
378  case kVec2f_GrVertexAttribType:
379  return false;
380  case kVec3f_GrVertexAttribType:
381  return false;
382  case kVec4f_GrVertexAttribType:
383  return false;
384  case kVec2i_GrVertexAttribType:
385  return true;
386  case kVec3i_GrVertexAttribType:
387  return true;
388  case kVec4i_GrVertexAttribType:
389  return true;
390  case kUByte_GrVertexAttribType:
391  return false;
392  case kVec4ub_GrVertexAttribType:
393  return false;
394  case kVec2us_GrVertexAttribType:
395  return false;
396  case kInt_GrVertexAttribType:
397  return true;
398  case kUint_GrVertexAttribType:
399  return true;
400  }
401  SkFAIL("Unexpected attribute type");
402  return false;
403 }
404 
408 static inline GrSLType GrVertexAttribTypeToSLType(GrVertexAttribType type) {
409  switch (type) {
410  case kUByte_GrVertexAttribType:
411  case kFloat_GrVertexAttribType:
412  return kFloat_GrSLType;
413  case kVec2us_GrVertexAttribType:
414  case kVec2f_GrVertexAttribType:
415  return kVec2f_GrSLType;
416  case kVec3f_GrVertexAttribType:
417  return kVec3f_GrSLType;
418  case kVec4ub_GrVertexAttribType:
419  case kVec4f_GrVertexAttribType:
420  return kVec4f_GrSLType;
421  case kVec2i_GrVertexAttribType:
422  return kVec2i_GrSLType;
423  case kVec3i_GrVertexAttribType:
424  return kVec3i_GrSLType;
425  case kVec4i_GrVertexAttribType:
426  return kVec4i_GrSLType;
427  case kInt_GrVertexAttribType:
428  return kInt_GrSLType;
429  case kUint_GrVertexAttribType:
430  return kUint_GrSLType;
431  }
432  SkFAIL("Unsupported type conversion");
433  return kVoid_GrSLType;
434 }
435 
437 
438 enum class GrImageStorageFormat {
439  kRGBA8,
440  kRGBA8i,
441  kRGBA16f,
442  kRGBA32f,
443 };
444 
449 enum class GrSLMemoryModel {
451  kNone,
453  kCoherent,
458  kVolatile
459 };
460 
465 enum class GrSLRestrict {
466  kYes,
467  kNo,
468 };
469 
471 
478 enum GrPrimitiveEdgeType {
479  kFillBW_GrProcessorEdgeType,
480  kFillAA_GrProcessorEdgeType,
481  kInverseFillBW_GrProcessorEdgeType,
482  kInverseFillAA_GrProcessorEdgeType,
483  kHairlineAA_GrProcessorEdgeType,
484 
485  kLast_GrProcessorEdgeType = kHairlineAA_GrProcessorEdgeType
486 };
487 
488 static const int kGrProcessorEdgeTypeCnt = kLast_GrProcessorEdgeType + 1;
489 
490 static inline bool GrProcessorEdgeTypeIsFill(const GrPrimitiveEdgeType edgeType) {
491  return (kFillAA_GrProcessorEdgeType == edgeType || kFillBW_GrProcessorEdgeType == edgeType);
492 }
493 
494 static inline bool GrProcessorEdgeTypeIsInverseFill(const GrPrimitiveEdgeType edgeType) {
495  return (kInverseFillAA_GrProcessorEdgeType == edgeType ||
496  kInverseFillBW_GrProcessorEdgeType == edgeType);
497 }
498 
499 static inline bool GrProcessorEdgeTypeIsAA(const GrPrimitiveEdgeType edgeType) {
500  return (kFillBW_GrProcessorEdgeType != edgeType && kInverseFillBW_GrProcessorEdgeType != edgeType);
501 }
502 
503 static inline GrPrimitiveEdgeType GrInvertProcessorEdgeType(const GrPrimitiveEdgeType edgeType) {
504  switch (edgeType) {
505  case kFillBW_GrProcessorEdgeType:
506  return kInverseFillBW_GrProcessorEdgeType;
507  case kFillAA_GrProcessorEdgeType:
508  return kInverseFillAA_GrProcessorEdgeType;
509  case kInverseFillBW_GrProcessorEdgeType:
510  return kFillBW_GrProcessorEdgeType;
511  case kInverseFillAA_GrProcessorEdgeType:
512  return kFillAA_GrProcessorEdgeType;
513  case kHairlineAA_GrProcessorEdgeType:
514  SkFAIL("Hairline fill isn't invertible.");
515  }
516  return kFillAA_GrProcessorEdgeType; // suppress warning.
517 }
518 
522 enum GrIOType {
523  kRead_GrIOType,
524  kWrite_GrIOType,
525  kRW_GrIOType
526 };
527 
531 enum GrBufferType {
532  kVertex_GrBufferType,
533  kIndex_GrBufferType,
534  kTexel_GrBufferType,
535  kDrawIndirect_GrBufferType,
536  kXferCpuToGpu_GrBufferType,
537  kXferGpuToCpu_GrBufferType,
538 
539  kLast_GrBufferType = kXferGpuToCpu_GrBufferType
540 };
541 static const int kGrBufferTypeCount = kLast_GrBufferType + 1;
542 
543 static inline bool GrBufferTypeIsVertexOrIndex(GrBufferType type) {
544  SkASSERT(type >= 0 && type < kGrBufferTypeCount);
545  return type <= kIndex_GrBufferType;
546 
547  GR_STATIC_ASSERT(0 == kVertex_GrBufferType);
548  GR_STATIC_ASSERT(1 == kIndex_GrBufferType);
549 }
550 
554 enum GrAccessPattern {
556  kDynamic_GrAccessPattern,
558  kStatic_GrAccessPattern,
560  kStream_GrAccessPattern,
561 
562  kLast_GrAccessPattern = kStream_GrAccessPattern
563 };
564 
565 // Flags shared between GrRenderTarget and GrRenderTargetProxy
566 enum class GrRenderTargetFlags {
567  kNone = 0,
568 
569  // For internal resources:
570  // this is enabled whenever MSAA is enabled and GrCaps reports mixed samples are supported
571  // For wrapped resources:
572  // this is disabled for FBO0
573  // but, otherwise, is enabled whenever MSAA is enabled and GrCaps reports mixed samples
574  // are supported
575  kMixedSampled = 1 << 0,
576 
577  // For internal resources:
578  // this is enabled whenever GrCaps reports window rect support
579  // For wrapped resources1
580  // this is disabled for FBO0
581  // but, otherwise, is enabled whenever GrCaps reports window rect support
582  kWindowRectsSupport = 1 << 1
583 };
584 GR_MAKE_BITFIELD_CLASS_OPS(GrRenderTargetFlags)
585 
586 #ifdef SK_DEBUG
587 // Takes a pointer to a GrCaps, and will suppress prints if required
588 #define GrCapsDebugf(caps, ...) \
589  if (!(caps)->suppressPrints()) { \
590  SkDebugf(__VA_ARGS__); \
591  }
592 #else
593 #define GrCapsDebugf(caps, ...)
594 #endif
595 
599 enum class GrBackendObjectOwnership : bool {
601  kBorrowed = false,
603  kOwned = true
604 };
605 
606 template <typename T> T * const * sk_sp_address_as_pointer_address(sk_sp<T> const * sp) {
607  static_assert(sizeof(T*) == sizeof(sk_sp<T>), "sk_sp not expected size.");
608  return reinterpret_cast<T * const *>(sp);
609 }
610 
611 /*
612  * Object for CPU-GPU synchronization
613  */
614 typedef uint64_t GrFence;
615 
616 #endif
Represents the capabilities of a GrContext.
Definition: GrCaps.h:24
Shared pointer class to wrap classes that support a ref()/unref() interface.
Definition: SkRefCnt.h:246