blob: f1643257008ad7cff0e2a072afc0d67476d0be07 [file] [log] [blame]
daniel@transgaming.com91ed1492010-10-29 03:11:43 +00001//
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.
5//
6
Geoff Lang17732822013-08-29 13:46:49 -04007#include "compiler/translator/util.h"
daniel@transgaming.com91ed1492010-10-29 03:11:43 +00008
Zhenyao Mof1d723c2013-09-23 14:57:07 -04009#include <limits>
10
Zhenyao Mocc4ec642013-09-23 14:57:10 -040011#include "compiler/preprocessor/numeric_lex.h"
Jamie Madill033dae62014-06-18 12:56:28 -040012#include "common/shadervars.h"
daniel@transgaming.com91ed1492010-10-29 03:11:43 +000013
Zhenyao Mof1d723c2013-09-23 14:57:07 -040014bool atof_clamp(const char *str, float *value)
daniel@transgaming.com91ed1492010-10-29 03:11:43 +000015{
Zhenyao Mocc4ec642013-09-23 14:57:10 -040016 bool success = pp::numeric_lex_float(str, value);
Zhenyao Mof1d723c2013-09-23 14:57:07 -040017 if (!success)
18 *value = std::numeric_limits<float>::max();
19 return success;
daniel@transgaming.com91ed1492010-10-29 03:11:43 +000020}
Zhenyao Mof1d723c2013-09-23 14:57:07 -040021
22bool atoi_clamp(const char *str, int *value)
23{
Zhenyao Mocc4ec642013-09-23 14:57:10 -040024 bool success = pp::numeric_lex_int(str, value);
25 if (!success)
Zhenyao Mof1d723c2013-09-23 14:57:07 -040026 *value = std::numeric_limits<int>::max();
Zhenyao Mocc4ec642013-09-23 14:57:10 -040027 return success;
Zhenyao Mof1d723c2013-09-23 14:57:07 -040028}
29
Jamie Madill033dae62014-06-18 12:56:28 -040030namespace sh
31{
32
33GLenum GLVariableType(const TType &type)
34{
35 if (type.getBasicType() == EbtFloat)
36 {
37 if (type.isScalar())
38 {
39 return GL_FLOAT;
40 }
41 else if (type.isVector())
42 {
43 switch (type.getNominalSize())
44 {
45 case 2: return GL_FLOAT_VEC2;
46 case 3: return GL_FLOAT_VEC3;
47 case 4: return GL_FLOAT_VEC4;
48 default: UNREACHABLE();
49 }
50 }
51 else if (type.isMatrix())
52 {
53 switch (type.getCols())
54 {
55 case 2:
56 switch (type.getRows())
57 {
58 case 2: return GL_FLOAT_MAT2;
59 case 3: return GL_FLOAT_MAT2x3;
60 case 4: return GL_FLOAT_MAT2x4;
61 default: UNREACHABLE();
62 }
63
64 case 3:
65 switch (type.getRows())
66 {
67 case 2: return GL_FLOAT_MAT3x2;
68 case 3: return GL_FLOAT_MAT3;
69 case 4: return GL_FLOAT_MAT3x4;
70 default: UNREACHABLE();
71 }
72
73 case 4:
74 switch (type.getRows())
75 {
76 case 2: return GL_FLOAT_MAT4x2;
77 case 3: return GL_FLOAT_MAT4x3;
78 case 4: return GL_FLOAT_MAT4;
79 default: UNREACHABLE();
80 }
81
82 default: UNREACHABLE();
83 }
84 }
85 else UNREACHABLE();
86 }
87 else if (type.getBasicType() == EbtInt)
88 {
89 if (type.isScalar())
90 {
91 return GL_INT;
92 }
93 else if (type.isVector())
94 {
95 switch (type.getNominalSize())
96 {
97 case 2: return GL_INT_VEC2;
98 case 3: return GL_INT_VEC3;
99 case 4: return GL_INT_VEC4;
100 default: UNREACHABLE();
101 }
102 }
103 else UNREACHABLE();
104 }
105 else if (type.getBasicType() == EbtUInt)
106 {
107 if (type.isScalar())
108 {
109 return GL_UNSIGNED_INT;
110 }
111 else if (type.isVector())
112 {
113 switch (type.getNominalSize())
114 {
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();
119 }
120 }
121 else UNREACHABLE();
122 }
123 else if (type.getBasicType() == EbtBool)
124 {
125 if (type.isScalar())
126 {
127 return GL_BOOL;
128 }
129 else if (type.isVector())
130 {
131 switch (type.getNominalSize())
132 {
133 case 2: return GL_BOOL_VEC2;
134 case 3: return GL_BOOL_VEC3;
135 case 4: return GL_BOOL_VEC4;
136 default: UNREACHABLE();
137 }
138 }
139 else UNREACHABLE();
140 }
141
142 switch (type.getBasicType())
143 {
144 case EbtSampler2D: return GL_SAMPLER_2D;
145 case EbtSampler3D: return GL_SAMPLER_3D;
146 case EbtSamplerCube: return GL_SAMPLER_CUBE;
147 case EbtSampler2DArray: return GL_SAMPLER_2D_ARRAY;
148 case EbtISampler2D: return GL_INT_SAMPLER_2D;
149 case EbtISampler3D: return GL_INT_SAMPLER_3D;
150 case EbtISamplerCube: return GL_INT_SAMPLER_CUBE;
151 case EbtISampler2DArray: return GL_INT_SAMPLER_2D_ARRAY;
152 case EbtUSampler2D: return GL_UNSIGNED_INT_SAMPLER_2D;
153 case EbtUSampler3D: return GL_UNSIGNED_INT_SAMPLER_3D;
154 case EbtUSamplerCube: return GL_UNSIGNED_INT_SAMPLER_CUBE;
155 case EbtUSampler2DArray: return GL_UNSIGNED_INT_SAMPLER_2D_ARRAY;
156 case EbtSampler2DShadow: return GL_SAMPLER_2D_SHADOW;
157 case EbtSamplerCubeShadow: return GL_SAMPLER_CUBE_SHADOW;
158 case EbtSampler2DArrayShadow: return GL_SAMPLER_2D_ARRAY_SHADOW;
159 default: UNREACHABLE();
160 }
161
162 return GL_NONE;
163}
164
165GLenum GLVariablePrecision(const TType &type)
166{
167 if (type.getBasicType() == EbtFloat)
168 {
169 switch (type.getPrecision())
170 {
171 case EbpHigh:
172 return GL_HIGH_FLOAT;
173 case EbpMedium:
174 return GL_MEDIUM_FLOAT;
175 case EbpLow:
176 return GL_LOW_FLOAT;
177 case EbpUndefined:
178 // Should be defined as the default precision by the parser
179 default:
180 UNREACHABLE();
181 }
182 }
183 else if (type.getBasicType() == EbtInt || type.getBasicType() == EbtUInt)
184 {
185 switch (type.getPrecision())
186 {
187 case EbpHigh:
188 return GL_HIGH_INT;
189 case EbpMedium:
190 return GL_MEDIUM_INT;
191 case EbpLow:
192 return GL_LOW_INT;
193 case EbpUndefined:
194 // Should be defined as the default precision by the parser
195 default:
196 UNREACHABLE();
197 }
198 }
199
200 // Other types (boolean, sampler) don't have a precision
201 return GL_NONE;
202}
203
204TString ArrayString(const TType &type)
205{
206 if (!type.isArray())
207 {
208 return "";
209 }
210
211 return "[" + str(type.getArraySize()) + "]";
212}
213
214bool IsVaryingOut(TQualifier qualifier)
215{
216 switch (qualifier)
217 {
218 case EvqVaryingOut:
219 case EvqInvariantVaryingOut:
220 case EvqSmoothOut:
221 case EvqFlatOut:
222 case EvqCentroidOut:
223 case EvqVertexOut:
224 return true;
225
226 default: break;
227 }
228
229 return false;
230}
231
232bool IsVaryingIn(TQualifier qualifier)
233{
234 switch (qualifier)
235 {
236 case EvqVaryingIn:
237 case EvqInvariantVaryingIn:
238 case EvqSmoothIn:
239 case EvqFlatIn:
240 case EvqCentroidIn:
241 case EvqFragmentIn:
242 return true;
243
244 default: break;
245 }
246
247 return false;
248}
249
250bool IsVarying(TQualifier qualifier)
251{
252 return IsVaryingIn(qualifier) || IsVaryingOut(qualifier);
253}
254
255gl::InterpolationType GetInterpolationType(TQualifier qualifier)
256{
257 switch (qualifier)
258 {
259 case EvqFlatIn:
260 case EvqFlatOut:
261 return gl::INTERPOLATION_FLAT;
262
263 case EvqSmoothIn:
264 case EvqSmoothOut:
265 case EvqVertexOut:
266 case EvqFragmentIn:
267 case EvqVaryingIn:
268 case EvqVaryingOut:
269 return gl::INTERPOLATION_SMOOTH;
270
271 case EvqCentroidIn:
272 case EvqCentroidOut:
273 return gl::INTERPOLATION_CENTROID;
274
275 default: UNREACHABLE();
276 return gl::INTERPOLATION_SMOOTH;
277 }
278}
279
280}