blob: 3ef24b07b69c960cdccade67e32ab3f7adbc98f1 [file] [log] [blame]
joshualitt249af152014-09-15 11:41:13 -07001/*
2 * Copyright 2014 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 GrShaderVar_DEFINED
9#define GrShaderVar_DEFINED
10
11#include "GrTypesPriv.h"
12#include "SkString.h"
13
14class GrShaderVar {
15public:
16 /**
17 * Early versions of GLSL have Varying and Attribute; those are later
18 * deprecated, but we still need to know whether a Varying variable
19 * should be treated as In or Out.
20 *
21 * TODO This really shouldn't live here, but until we have c++11, there is really no good way
22 * to write extensible enums. In reality, only none, out, in, inout, and uniform really
23 * make sense on this base class
24 */
25 enum TypeModifier {
26 kNone_TypeModifier,
27 kOut_TypeModifier,
28 kIn_TypeModifier,
29 kInOut_TypeModifier,
30 kUniform_TypeModifier,
31 // GL Specific types below
32 kAttribute_TypeModifier,
33 kVaryingIn_TypeModifier,
34 kVaryingOut_TypeModifier
35 };
36
joshualitt249af152014-09-15 11:41:13 -070037 /**
38 * Defaults to a float with no precision specifier
39 */
40 GrShaderVar()
41 : fType(kFloat_GrSLType)
42 , fTypeModifier(kNone_TypeModifier)
43 , fCount(kNonArray)
bsalomonc0bd6482014-12-09 10:04:14 -080044 , fPrecision(kDefault_GrSLPrecision) {
joshualitt249af152014-09-15 11:41:13 -070045 }
46
joshualitt23e280d2014-09-18 12:26:38 -070047 GrShaderVar(const SkString& name, GrSLType type, int arrayCount = kNonArray,
bsalomonc0bd6482014-12-09 10:04:14 -080048 GrSLPrecision precision = kDefault_GrSLPrecision)
joshualitt23e280d2014-09-18 12:26:38 -070049 : fType(type)
50 , fTypeModifier(kNone_TypeModifier)
51 , fName(name)
52 , fCount(arrayCount)
53 , fPrecision(precision) {
54 SkASSERT(kVoid_GrSLType != type);
55 }
56
joshualitt249af152014-09-15 11:41:13 -070057 GrShaderVar(const char* name, GrSLType type, int arrayCount = kNonArray,
bsalomonc0bd6482014-12-09 10:04:14 -080058 GrSLPrecision precision = kDefault_GrSLPrecision)
joshualitt249af152014-09-15 11:41:13 -070059 : fType(type)
60 , fTypeModifier(kNone_TypeModifier)
61 , fName(name)
62 , fCount(arrayCount)
63 , fPrecision(precision) {
64 SkASSERT(kVoid_GrSLType != type);
65 }
66
67 GrShaderVar(const char* name, GrSLType type, TypeModifier typeModifier,
bsalomonc0bd6482014-12-09 10:04:14 -080068 int arrayCount = kNonArray, GrSLPrecision precision = kDefault_GrSLPrecision)
joshualitt249af152014-09-15 11:41:13 -070069 : fType(type)
70 , fTypeModifier(typeModifier)
71 , fName(name)
72 , fCount(arrayCount)
73 , fPrecision(precision) {
74 SkASSERT(kVoid_GrSLType != type);
75 }
76
77 /**
78 * Values for array count that have special meaning. We allow 1-sized arrays.
79 */
80 enum {
81 kNonArray = 0, // not an array
82 kUnsizedArray = -1, // an unsized array (declared with [])
83 };
84
85 /**
86 * Sets as a non-array.
87 */
88 void set(GrSLType type,
89 TypeModifier typeModifier,
90 const SkString& name,
bsalomonc0bd6482014-12-09 10:04:14 -080091 GrSLPrecision precision = kDefault_GrSLPrecision) {
joshualitt249af152014-09-15 11:41:13 -070092 SkASSERT(kVoid_GrSLType != type);
93 fType = type;
94 fTypeModifier = typeModifier;
95 fName = name;
96 fCount = kNonArray;
97 fPrecision = precision;
98 }
99
100 /**
101 * Sets as a non-array.
102 */
103 void set(GrSLType type,
104 TypeModifier typeModifier,
105 const char* name,
bsalomonc0bd6482014-12-09 10:04:14 -0800106 GrSLPrecision precision = kDefault_GrSLPrecision) {
joshualitt249af152014-09-15 11:41:13 -0700107 SkASSERT(kVoid_GrSLType != type);
108 fType = type;
109 fTypeModifier = typeModifier;
110 fName = name;
111 fCount = kNonArray;
112 fPrecision = precision;
113 }
114
115 /**
116 * Set all var options
117 */
118 void set(GrSLType type,
119 TypeModifier typeModifier,
120 const SkString& name,
121 int count,
bsalomonc0bd6482014-12-09 10:04:14 -0800122 GrSLPrecision precision = kDefault_GrSLPrecision) {
joshualitt249af152014-09-15 11:41:13 -0700123 SkASSERT(kVoid_GrSLType != type);
124 fType = type;
125 fTypeModifier = typeModifier;
126 fName = name;
127 fCount = count;
128 fPrecision = precision;
129 }
130
131 /**
132 * Set all var options
133 */
134 void set(GrSLType type,
135 TypeModifier typeModifier,
136 const char* name,
137 int count,
bsalomonc0bd6482014-12-09 10:04:14 -0800138 GrSLPrecision precision = kDefault_GrSLPrecision) {
joshualitt249af152014-09-15 11:41:13 -0700139 SkASSERT(kVoid_GrSLType != type);
140 fType = type;
141 fTypeModifier = typeModifier;
142 fName = name;
143 fCount = count;
144 fPrecision = precision;
145 }
146
147 /**
148 * Is the var an array.
149 */
150 bool isArray() const { return kNonArray != fCount; }
151 /**
152 * Is this an unsized array, (i.e. declared with []).
153 */
154 bool isUnsizedArray() const { return kUnsizedArray == fCount; }
155 /**
156 * Get the array length of the var.
157 */
158 int getArrayCount() const { return fCount; }
159 /**
160 * Set the array length of the var
161 */
162 void setArrayCount(int count) { fCount = count; }
163 /**
164 * Set to be a non-array.
165 */
166 void setNonArray() { fCount = kNonArray; }
167 /**
168 * Set to be an unsized array.
169 */
170 void setUnsizedArray() { fCount = kUnsizedArray; }
171
172 /**
173 * Access the var name as a writable string
174 */
175 SkString* accessName() { return &fName; }
176 /**
177 * Set the var name
178 */
179 void setName(const SkString& n) { fName = n; }
180 void setName(const char* n) { fName = n; }
181
182 /**
183 * Get the var name.
184 */
185 const SkString& getName() const { return fName; }
186
187 /**
188 * Shortcut for this->getName().c_str();
189 */
190 const char* c_str() const { return this->getName().c_str(); }
191
192 /**
193 * Get the type of the var
194 */
195 GrSLType getType() const { return fType; }
196 /**
197 * Set the type of the var
198 */
199 void setType(GrSLType type) { fType = type; }
200
201 TypeModifier getTypeModifier() const { return fTypeModifier; }
202 void setTypeModifier(TypeModifier type) { fTypeModifier = type; }
203
204 /**
205 * Get the precision of the var
206 */
bsalomonc0bd6482014-12-09 10:04:14 -0800207 GrSLPrecision getPrecision() const { return fPrecision; }
joshualitt249af152014-09-15 11:41:13 -0700208
209 /**
210 * Set the precision of the var
211 */
bsalomonc0bd6482014-12-09 10:04:14 -0800212 void setPrecision(GrSLPrecision p) { fPrecision = p; }
joshualitt249af152014-09-15 11:41:13 -0700213
214protected:
215 GrSLType fType;
216 TypeModifier fTypeModifier;
217 SkString fName;
218 int fCount;
bsalomonc0bd6482014-12-09 10:04:14 -0800219 GrSLPrecision fPrecision;
joshualitt249af152014-09-15 11:41:13 -0700220};
221
222#endif