blob: 0bae612db19d68ffbf85337492114dab0ba84170 [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
jvanverth@google.com054ae992013-04-01 20:06:51 +000011#include "GrTypes.h"
bsalomon@google.com31ec7982013-03-27 18:14:57 +000012#include "SkTArray.h"
13
commit-bot@chromium.orgff6ea262013-03-12 12:26:08 +000014/**
jvanverth@google.com054ae992013-04-01 20:06:51 +000015 * Types of shader-language-specific boxed variables we can create. (Currently only GrGLShaderVars,
16 * but should be applicable to other shader languages.)
commit-bot@chromium.orgff6ea262013-03-12 12:26:08 +000017 */
18enum GrSLType {
19 kVoid_GrSLType,
20 kFloat_GrSLType,
21 kVec2f_GrSLType,
22 kVec3f_GrSLType,
23 kVec4f_GrSLType,
24 kMat33f_GrSLType,
25 kMat44f_GrSLType,
jvanverth@google.com054ae992013-04-01 20:06:51 +000026 kSampler2D_GrSLType,
27
28 kLast_GrSLType = kSampler2D_GrSLType
commit-bot@chromium.orgff6ea262013-03-12 12:26:08 +000029};
jvanverth@google.com054ae992013-04-01 20:06:51 +000030static const int kGrSLTypeCount = kLast_GrSLType + 1;
commit-bot@chromium.orgff6ea262013-03-12 12:26:08 +000031
bsalomon@google.com31ec7982013-03-27 18:14:57 +000032/**
jvanverth@google.com054ae992013-04-01 20:06:51 +000033 * Gets the vector size of the SLType. Returns -1 for void, matrices, and samplers.
34 */
35static inline int GrSLTypeVectorCount(GrSLType type) {
tfarina@chromium.orgf6de4752013-08-17 00:02:59 +000036 SkASSERT(type >= 0 && type < static_cast<GrSLType>(kGrSLTypeCount));
jvanverth@google.com054ae992013-04-01 20:06:51 +000037 static const int kCounts[] = { -1, 1, 2, 3, 4, -1, -1, -1 };
38 return kCounts[type];
39
40 GR_STATIC_ASSERT(0 == kVoid_GrSLType);
41 GR_STATIC_ASSERT(1 == kFloat_GrSLType);
42 GR_STATIC_ASSERT(2 == kVec2f_GrSLType);
43 GR_STATIC_ASSERT(3 == kVec3f_GrSLType);
44 GR_STATIC_ASSERT(4 == kVec4f_GrSLType);
45 GR_STATIC_ASSERT(5 == kMat33f_GrSLType);
46 GR_STATIC_ASSERT(6 == kMat44f_GrSLType);
47 GR_STATIC_ASSERT(7 == kSampler2D_GrSLType);
commit-bot@chromium.org972f9cd2014-03-28 17:58:28 +000048 GR_STATIC_ASSERT(SK_ARRAY_COUNT(kCounts) == kGrSLTypeCount);
jvanverth@google.com054ae992013-04-01 20:06:51 +000049}
50
bsalomon@google.com018f1792013-04-18 19:36:09 +000051/** Return the type enum for a vector of floats of length n (1..4),
52 e.g. 1 -> kFloat_GrSLType, 2 -> kVec2_GrSLType, ... */
jvanverth@google.com054ae992013-04-01 20:06:51 +000053static inline GrSLType GrSLFloatVectorType(int count) {
tfarina@chromium.orgf6de4752013-08-17 00:02:59 +000054 SkASSERT(count > 0 && count <= 4);
jvanverth@google.com054ae992013-04-01 20:06:51 +000055 return (GrSLType)(count);
56
57 GR_STATIC_ASSERT(kFloat_GrSLType == 1);
58 GR_STATIC_ASSERT(kVec2f_GrSLType == 2);
59 GR_STATIC_ASSERT(kVec3f_GrSLType == 3);
60 GR_STATIC_ASSERT(kVec4f_GrSLType == 4);
61}
62
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +000063//////////////////////////////////////////////////////////////////////////////
64
jvanverth@google.com054ae992013-04-01 20:06:51 +000065/**
66 * Types used to describe format of vertices in arrays.
bsalomon@google.com31ec7982013-03-27 18:14:57 +000067 */
68enum GrVertexAttribType {
69 kFloat_GrVertexAttribType = 0,
70 kVec2f_GrVertexAttribType,
71 kVec3f_GrVertexAttribType,
72 kVec4f_GrVertexAttribType,
73 kVec4ub_GrVertexAttribType, // vector of 4 unsigned bytes, e.g. colors
74
75 kLast_GrVertexAttribType = kVec4ub_GrVertexAttribType
76};
77static const int kGrVertexAttribTypeCount = kLast_GrVertexAttribType + 1;
78
jvanverth@google.com054ae992013-04-01 20:06:51 +000079/**
80 * Returns the vector size of the type.
81 */
82static inline int GrVertexAttribTypeVectorCount(GrVertexAttribType type) {
tfarina@chromium.orgf6de4752013-08-17 00:02:59 +000083 SkASSERT(type >= 0 && type < kGrVertexAttribTypeCount);
jvanverth@google.com054ae992013-04-01 20:06:51 +000084 static const int kCounts[] = { 1, 2, 3, 4, 4 };
85 return kCounts[type];
86
87 GR_STATIC_ASSERT(0 == kFloat_GrVertexAttribType);
88 GR_STATIC_ASSERT(1 == kVec2f_GrVertexAttribType);
89 GR_STATIC_ASSERT(2 == kVec3f_GrVertexAttribType);
90 GR_STATIC_ASSERT(3 == kVec4f_GrVertexAttribType);
91 GR_STATIC_ASSERT(4 == kVec4ub_GrVertexAttribType);
commit-bot@chromium.org972f9cd2014-03-28 17:58:28 +000092 GR_STATIC_ASSERT(SK_ARRAY_COUNT(kCounts) == kGrVertexAttribTypeCount);
jvanverth@google.com054ae992013-04-01 20:06:51 +000093}
94
95/**
96 * Returns the size of the attrib type in bytes.
97 */
98static inline size_t GrVertexAttribTypeSize(GrVertexAttribType type) {
tfarina@chromium.orgf6de4752013-08-17 00:02:59 +000099 SkASSERT(type >= 0 && type < kGrVertexAttribTypeCount);
jvanverth@google.com054ae992013-04-01 20:06:51 +0000100 static const size_t kSizes[] = {
101 sizeof(float), // kFloat_GrVertexAttribType
102 2*sizeof(float), // kVec2f_GrVertexAttribType
103 3*sizeof(float), // kVec3f_GrVertexAttribType
104 4*sizeof(float), // kVec4f_GrVertexAttribType
105 4*sizeof(char) // kVec4ub_GrVertexAttribType
106 };
107 return kSizes[type];
108
109 GR_STATIC_ASSERT(0 == kFloat_GrVertexAttribType);
110 GR_STATIC_ASSERT(1 == kVec2f_GrVertexAttribType);
111 GR_STATIC_ASSERT(2 == kVec3f_GrVertexAttribType);
112 GR_STATIC_ASSERT(3 == kVec4f_GrVertexAttribType);
113 GR_STATIC_ASSERT(4 == kVec4ub_GrVertexAttribType);
commit-bot@chromium.org972f9cd2014-03-28 17:58:28 +0000114 GR_STATIC_ASSERT(SK_ARRAY_COUNT(kSizes) == kGrVertexAttribTypeCount);
jvanverth@google.com054ae992013-04-01 20:06:51 +0000115}
116
117/**
joshualittb0a8a372014-09-23 09:50:21 -0700118 * Semantic bindings for vertex attributes. kEffect means that the attribute is input to a
119 * GrProcessor. Each binding other than kEffect may not appear more than once in the current set of
120 * attributes. kPosition must be appear for exactly one attribute.
jvanverth@google.com054ae992013-04-01 20:06:51 +0000121 */
122enum GrVertexAttribBinding {
123 kPosition_GrVertexAttribBinding, // required, must have vector count of 2
124 kLocalCoord_GrVertexAttribBinding, // must have vector count of 2
125 kColor_GrVertexAttribBinding, // must have vector count of 4
126 kCoverage_GrVertexAttribBinding, // must have vector count of 4
127
128 kLastFixedFunction_GrVertexAttribBinding = kCoverage_GrVertexAttribBinding,
129
joshualittb0a8a372014-09-23 09:50:21 -0700130 kGeometryProcessor_GrVertexAttribBinding, // vector length must agree with
131 // GrProcessor::vertexAttribType() for each effect input to
jvanverth@google.com054ae992013-04-01 20:06:51 +0000132 // which the attribute is mapped by GrDrawState::setEffect()
joshualittb0a8a372014-09-23 09:50:21 -0700133 kLast_GrVertexAttribBinding = kGeometryProcessor_GrVertexAttribBinding
jvanverth@google.com054ae992013-04-01 20:06:51 +0000134};
135
136static const int kGrVertexAttribBindingCnt = kLast_GrVertexAttribBinding + 1;
137static const int kGrFixedFunctionVertexAttribBindingCnt =
138 kLastFixedFunction_GrVertexAttribBinding + 1;
139
jvanverth@google.com86b5e292013-04-01 20:14:02 +0000140static inline int GrFixedFunctionVertexAttribVectorCount(GrVertexAttribBinding binding) {
tfarina@chromium.orgf6de4752013-08-17 00:02:59 +0000141 SkASSERT(binding >= 0 && binding < kGrFixedFunctionVertexAttribBindingCnt);
jvanverth@google.com054ae992013-04-01 20:06:51 +0000142 static const int kVecCounts[] = { 2, 2, 4, 4 };
143
144 return kVecCounts[binding];
145
146 GR_STATIC_ASSERT(0 == kPosition_GrVertexAttribBinding);
147 GR_STATIC_ASSERT(1 == kLocalCoord_GrVertexAttribBinding);
148 GR_STATIC_ASSERT(2 == kColor_GrVertexAttribBinding);
149 GR_STATIC_ASSERT(3 == kCoverage_GrVertexAttribBinding);
150 GR_STATIC_ASSERT(kGrFixedFunctionVertexAttribBindingCnt == SK_ARRAY_COUNT(kVecCounts));
151}
152
bsalomon@google.com31ec7982013-03-27 18:14:57 +0000153struct GrVertexAttrib {
jvanverth@google.com054ae992013-04-01 20:06:51 +0000154 inline void set(GrVertexAttribType type, size_t offset, GrVertexAttribBinding binding) {
155 fType = type;
156 fOffset = offset;
157 fBinding = binding;
bsalomon@google.com31ec7982013-03-27 18:14:57 +0000158 }
159 bool operator==(const GrVertexAttrib& other) const {
jvanverth@google.com054ae992013-04-01 20:06:51 +0000160 return fType == other.fType && fOffset == other.fOffset && fBinding == other.fBinding;
bsalomon@google.com31ec7982013-03-27 18:14:57 +0000161 };
162 bool operator!=(const GrVertexAttrib& other) const { return !(*this == other); }
163
jvanverth@google.com054ae992013-04-01 20:06:51 +0000164 GrVertexAttribType fType;
165 size_t fOffset;
166 GrVertexAttribBinding fBinding;
bsalomon@google.com31ec7982013-03-27 18:14:57 +0000167};
168
jvanverth@google.com054ae992013-04-01 20:06:51 +0000169template <int N> class GrVertexAttribArray : public SkSTArray<N, GrVertexAttrib, true> {};
bsalomon@google.com31ec7982013-03-27 18:14:57 +0000170
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000171//////////////////////////////////////////////////////////////////////////////
172
173/**
174* We have coverage effects that clip rendering to the edge of some geometric primitive.
skia.committer@gmail.com06acb582014-03-06 03:02:32 +0000175* This enum specifies how that clipping is performed. Not all factories that take a
joshualittb0a8a372014-09-23 09:50:21 -0700176* GrProcessorEdgeType will succeed with all values and it is up to the caller to check for
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000177* a NULL return.
178*/
joshualittb0a8a372014-09-23 09:50:21 -0700179enum GrPrimitiveEdgeType {
180 kFillBW_GrProcessorEdgeType,
181 kFillAA_GrProcessorEdgeType,
182 kInverseFillBW_GrProcessorEdgeType,
183 kInverseFillAA_GrProcessorEdgeType,
184 kHairlineAA_GrProcessorEdgeType,
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000185
joshualittb0a8a372014-09-23 09:50:21 -0700186 kLast_GrProcessorEdgeType = kHairlineAA_GrProcessorEdgeType
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000187};
188
joshualittb0a8a372014-09-23 09:50:21 -0700189static const int kGrProcessorEdgeTypeCnt = kLast_GrProcessorEdgeType + 1;
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000190
joshualittb0a8a372014-09-23 09:50:21 -0700191static inline bool GrProcessorEdgeTypeIsFill(const GrPrimitiveEdgeType edgeType) {
192 return (kFillAA_GrProcessorEdgeType == edgeType || kFillBW_GrProcessorEdgeType == edgeType);
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000193}
194
joshualittb0a8a372014-09-23 09:50:21 -0700195static inline bool GrProcessorEdgeTypeIsInverseFill(const GrPrimitiveEdgeType edgeType) {
196 return (kInverseFillAA_GrProcessorEdgeType == edgeType ||
197 kInverseFillBW_GrProcessorEdgeType == edgeType);
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000198}
199
joshualittb0a8a372014-09-23 09:50:21 -0700200static inline bool GrProcessorEdgeTypeIsAA(const GrPrimitiveEdgeType edgeType) {
201 return (kFillBW_GrProcessorEdgeType != edgeType && kInverseFillBW_GrProcessorEdgeType != edgeType);
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000202}
203
joshualittb0a8a372014-09-23 09:50:21 -0700204static inline GrPrimitiveEdgeType GrInvertProcessorEdgeType(const GrPrimitiveEdgeType edgeType) {
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000205 switch (edgeType) {
joshualittb0a8a372014-09-23 09:50:21 -0700206 case kFillBW_GrProcessorEdgeType:
207 return kInverseFillBW_GrProcessorEdgeType;
208 case kFillAA_GrProcessorEdgeType:
209 return kInverseFillAA_GrProcessorEdgeType;
210 case kInverseFillBW_GrProcessorEdgeType:
211 return kFillBW_GrProcessorEdgeType;
212 case kInverseFillAA_GrProcessorEdgeType:
213 return kFillAA_GrProcessorEdgeType;
214 case kHairlineAA_GrProcessorEdgeType:
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000215 SkFAIL("Hairline fill isn't invertible.");
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000216 }
joshualittb0a8a372014-09-23 09:50:21 -0700217 return kFillAA_GrProcessorEdgeType; // suppress warning.
commit-bot@chromium.orgcabf4b22014-03-05 18:27:43 +0000218}
219
bsalomonbcf0a522014-10-08 08:40:09 -0700220/**
221 * Indicates the type of pending IO operations that can be recorded for gpu resources.
222 */
223enum GrIOType {
224 kRead_GrIOType,
225 kWrite_GrIOType,
226 kRW_GrIOType
227};
228
commit-bot@chromium.orgff6ea262013-03-12 12:26:08 +0000229#endif