2 // Copyright (c) 2010 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
7 #include "compiler/translator/util.h"
11 #include "compiler/preprocessor/numeric_lex.h"
12 #include "common/utilities.h"
14 bool atof_clamp(const char *str, float *value)
16 bool success = pp::numeric_lex_float(str, value);
18 *value = std::numeric_limits<float>::max();
22 bool atoi_clamp(const char *str, int *value)
24 bool success = pp::numeric_lex_int(str, value);
26 *value = std::numeric_limits<int>::max();
33 GLenum GLVariableType(const TType &type)
35 if (type.getBasicType() == EbtFloat)
41 else if (type.isVector())
43 switch (type.getNominalSize())
45 case 2: return GL_FLOAT_VEC2;
46 case 3: return GL_FLOAT_VEC3;
47 case 4: return GL_FLOAT_VEC4;
48 default: UNREACHABLE();
51 else if (type.isMatrix())
53 switch (type.getCols())
56 switch (type.getRows())
58 case 2: return GL_FLOAT_MAT2;
59 case 3: return GL_FLOAT_MAT2x3;
60 case 4: return GL_FLOAT_MAT2x4;
61 default: UNREACHABLE();
65 switch (type.getRows())
67 case 2: return GL_FLOAT_MAT3x2;
68 case 3: return GL_FLOAT_MAT3;
69 case 4: return GL_FLOAT_MAT3x4;
70 default: UNREACHABLE();
74 switch (type.getRows())
76 case 2: return GL_FLOAT_MAT4x2;
77 case 3: return GL_FLOAT_MAT4x3;
78 case 4: return GL_FLOAT_MAT4;
79 default: UNREACHABLE();
82 default: UNREACHABLE();
87 else if (type.getBasicType() == EbtInt)
93 else if (type.isVector())
95 switch (type.getNominalSize())
97 case 2: return GL_INT_VEC2;
98 case 3: return GL_INT_VEC3;
99 case 4: return GL_INT_VEC4;
100 default: UNREACHABLE();
105 else if (type.getBasicType() == EbtUInt)
109 return GL_UNSIGNED_INT;
111 else if (type.isVector())
113 switch (type.getNominalSize())
115 case 2: return GL_UNSIGNED_INT_VEC2;
116 case 3: return GL_UNSIGNED_INT_VEC3;
117 case 4: return GL_UNSIGNED_INT_VEC4;
118 default: UNREACHABLE();
123 else if (type.getBasicType() == EbtBool)
129 else if (type.isVector())
131 switch (type.getNominalSize())
133 case 2: return GL_BOOL_VEC2;
134 case 3: return GL_BOOL_VEC3;
135 case 4: return GL_BOOL_VEC4;
136 default: UNREACHABLE();
142 switch (type.getBasicType())
144 case EbtSampler2D: return GL_SAMPLER_2D;
145 case EbtSampler3D: return GL_SAMPLER_3D;
146 case EbtSamplerCube: return GL_SAMPLER_CUBE;
147 case EbtSamplerExternalOES: return GL_SAMPLER_EXTERNAL_OES;
148 case EbtSampler2DRect: return GL_SAMPLER_2D_RECT_ARB;
149 case EbtSampler2DArray: return GL_SAMPLER_2D_ARRAY;
150 case EbtISampler2D: return GL_INT_SAMPLER_2D;
151 case EbtISampler3D: return GL_INT_SAMPLER_3D;
152 case EbtISamplerCube: return GL_INT_SAMPLER_CUBE;
153 case EbtISampler2DArray: return GL_INT_SAMPLER_2D_ARRAY;
154 case EbtUSampler2D: return GL_UNSIGNED_INT_SAMPLER_2D;
155 case EbtUSampler3D: return GL_UNSIGNED_INT_SAMPLER_3D;
156 case EbtUSamplerCube: return GL_UNSIGNED_INT_SAMPLER_CUBE;
157 case EbtUSampler2DArray: return GL_UNSIGNED_INT_SAMPLER_2D_ARRAY;
158 case EbtSampler2DShadow: return GL_SAMPLER_2D_SHADOW;
159 case EbtSamplerCubeShadow: return GL_SAMPLER_CUBE_SHADOW;
160 case EbtSampler2DArrayShadow: return GL_SAMPLER_2D_ARRAY_SHADOW;
161 default: UNREACHABLE();
167 GLenum GLVariablePrecision(const TType &type)
169 if (type.getBasicType() == EbtFloat)
171 switch (type.getPrecision())
174 return GL_HIGH_FLOAT;
176 return GL_MEDIUM_FLOAT;
180 // Should be defined as the default precision by the parser
185 else if (type.getBasicType() == EbtInt || type.getBasicType() == EbtUInt)
187 switch (type.getPrecision())
192 return GL_MEDIUM_INT;
196 // Should be defined as the default precision by the parser
202 // Other types (boolean, sampler) don't have a precision
206 TString ArrayString(const TType &type)
213 return "[" + str(type.getArraySize()) + "]";
216 bool IsVaryingOut(TQualifier qualifier)
221 case EvqInvariantVaryingOut:
234 bool IsVaryingIn(TQualifier qualifier)
239 case EvqInvariantVaryingIn:
252 bool IsVarying(TQualifier qualifier)
254 return IsVaryingIn(qualifier) || IsVaryingOut(qualifier);
257 InterpolationType GetInterpolationType(TQualifier qualifier)
263 return INTERPOLATION_FLAT;
271 case EvqInvariantVaryingIn:
272 case EvqInvariantVaryingOut:
273 return INTERPOLATION_SMOOTH;
277 return INTERPOLATION_CENTROID;
279 default: UNREACHABLE();
280 return INTERPOLATION_SMOOTH;
284 template <typename VarT>
285 void GetVariableTraverser::traverse(const TType &type, const TString &name, std::vector<VarT> *output)
287 const TStructure *structure = type.getStruct();
290 variable.name = name.c_str();
291 variable.arraySize = static_cast<unsigned int>(type.getArraySize());
295 variable.type = GLVariableType(type);
296 variable.precision = GLVariablePrecision(type);
300 // Note: this enum value is not exposed outside ANGLE
301 variable.type = GL_STRUCT_ANGLEX;
302 variable.structName = structure->name().c_str();
304 const TFieldList &fields = structure->fields();
306 for (size_t fieldIndex = 0; fieldIndex < fields.size(); fieldIndex++)
308 TField *field = fields[fieldIndex];
309 traverse(*field->type(), field->name(), &variable.fields);
313 visitVariable(&variable);
316 output->push_back(variable);
319 template void GetVariableTraverser::traverse(const TType &, const TString &, std::vector<Uniform> *);
320 template void GetVariableTraverser::traverse(const TType &, const TString &, std::vector<Varying> *);
321 template void GetVariableTraverser::traverse(const TType &, const TString &, std::vector<InterfaceBlockField> *);