1 //
2 // Copyright (C) 2016 Google, Inc.
3 // Copyright (C) 2016 LunarG, Inc.
4 //
5 // All rights reserved.
6 //
7 // Redistribution and use in source and binary forms, with or without
8 // modification, are permitted provided that the following conditions
9 // are met:
10 //
11 // Redistributions of source code must retain the above copyright
12 // notice, this list of conditions and the following disclaimer.
13 //
14 // Redistributions in binary form must reproduce the above
15 // copyright notice, this list of conditions and the following
16 // disclaimer in the documentation and/or other materials provided
17 // with the distribution.
18 //
19 // Neither the name of Google, Inc., nor the names of its
20 // contributors may be used to endorse or promote products derived
21 // from this software without specific prior written permission.
22 //
23 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
26 // FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
27 // COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
28 // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
29 // BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
30 // LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
31 // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32 // LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
33 // ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34 // POSSIBILITY OF SUCH DAMAGE.
35 //
36
37 //
38 // HLSL scanning, leveraging the scanning done by the preprocessor.
39 //
40
41 #include <cstring>
42 #include <unordered_map>
43 #include <unordered_set>
44
45 #include "../Include/Types.h"
46 #include "../MachineIndependent/SymbolTable.h"
47 #include "../MachineIndependent/ParseHelper.h"
48 #include "hlslScanContext.h"
49 #include "hlslTokens.h"
50
51 // preprocessor includes
52 #include "../MachineIndependent/preprocessor/PpContext.h"
53 #include "../MachineIndependent/preprocessor/PpTokens.h"
54
55 namespace {
56
57 struct str_eq
58 {
operator ()__anon944661600111::str_eq59 bool operator()(const char* lhs, const char* rhs) const
60 {
61 return strcmp(lhs, rhs) == 0;
62 }
63 };
64
65 struct str_hash
66 {
operator ()__anon944661600111::str_hash67 size_t operator()(const char* str) const
68 {
69 // djb2
70 unsigned long hash = 5381;
71 int c;
72
73 while ((c = *str++) != 0)
74 hash = ((hash << 5) + hash) + c;
75
76 return hash;
77 }
78 };
79
80 // A single global usable by all threads, by all versions, by all languages.
81 // After a single process-level initialization, this is read only and thread safe
82 std::unordered_map<const char*, glslang::EHlslTokenClass, str_hash, str_eq>* KeywordMap = nullptr;
83 std::unordered_set<const char*, str_hash, str_eq>* ReservedSet = nullptr;
84 std::unordered_map<const char*, glslang::TBuiltInVariable, str_hash, str_eq>* SemanticMap = nullptr;
85
86 };
87
88 namespace glslang {
89
fillInKeywordMap()90 void HlslScanContext::fillInKeywordMap()
91 {
92 if (KeywordMap != nullptr) {
93 // this is really an error, as this should called only once per process
94 // but, the only risk is if two threads called simultaneously
95 return;
96 }
97 KeywordMap = new std::unordered_map<const char*, EHlslTokenClass, str_hash, str_eq>;
98
99 (*KeywordMap)["static"] = EHTokStatic;
100 (*KeywordMap)["const"] = EHTokConst;
101 (*KeywordMap)["unorm"] = EHTokUnorm;
102 (*KeywordMap)["snorm"] = EHTokSNorm;
103 (*KeywordMap)["extern"] = EHTokExtern;
104 (*KeywordMap)["uniform"] = EHTokUniform;
105 (*KeywordMap)["volatile"] = EHTokVolatile;
106 (*KeywordMap)["precise"] = EHTokPrecise;
107 (*KeywordMap)["shared"] = EHTokShared;
108 (*KeywordMap)["groupshared"] = EHTokGroupShared;
109 (*KeywordMap)["linear"] = EHTokLinear;
110 (*KeywordMap)["centroid"] = EHTokCentroid;
111 (*KeywordMap)["nointerpolation"] = EHTokNointerpolation;
112 (*KeywordMap)["noperspective"] = EHTokNoperspective;
113 (*KeywordMap)["sample"] = EHTokSample;
114 (*KeywordMap)["row_major"] = EHTokRowMajor;
115 (*KeywordMap)["column_major"] = EHTokColumnMajor;
116 (*KeywordMap)["packoffset"] = EHTokPackOffset;
117 (*KeywordMap)["in"] = EHTokIn;
118 (*KeywordMap)["out"] = EHTokOut;
119 (*KeywordMap)["inout"] = EHTokInOut;
120 (*KeywordMap)["layout"] = EHTokLayout;
121 (*KeywordMap)["globallycoherent"] = EHTokGloballyCoherent;
122 (*KeywordMap)["inline"] = EHTokInline;
123
124 (*KeywordMap)["point"] = EHTokPoint;
125 (*KeywordMap)["line"] = EHTokLine;
126 (*KeywordMap)["triangle"] = EHTokTriangle;
127 (*KeywordMap)["lineadj"] = EHTokLineAdj;
128 (*KeywordMap)["triangleadj"] = EHTokTriangleAdj;
129
130 (*KeywordMap)["PointStream"] = EHTokPointStream;
131 (*KeywordMap)["LineStream"] = EHTokLineStream;
132 (*KeywordMap)["TriangleStream"] = EHTokTriangleStream;
133
134 (*KeywordMap)["InputPatch"] = EHTokInputPatch;
135 (*KeywordMap)["OutputPatch"] = EHTokOutputPatch;
136
137 (*KeywordMap)["Buffer"] = EHTokBuffer;
138 (*KeywordMap)["vector"] = EHTokVector;
139 (*KeywordMap)["matrix"] = EHTokMatrix;
140
141 (*KeywordMap)["void"] = EHTokVoid;
142 (*KeywordMap)["string"] = EHTokString;
143 (*KeywordMap)["bool"] = EHTokBool;
144 (*KeywordMap)["int"] = EHTokInt;
145 (*KeywordMap)["uint"] = EHTokUint;
146 (*KeywordMap)["uint64_t"] = EHTokUint64;
147 (*KeywordMap)["dword"] = EHTokDword;
148 (*KeywordMap)["half"] = EHTokHalf;
149 (*KeywordMap)["float"] = EHTokFloat;
150 (*KeywordMap)["double"] = EHTokDouble;
151 (*KeywordMap)["min16float"] = EHTokMin16float;
152 (*KeywordMap)["min10float"] = EHTokMin10float;
153 (*KeywordMap)["min16int"] = EHTokMin16int;
154 (*KeywordMap)["min12int"] = EHTokMin12int;
155 (*KeywordMap)["min16uint"] = EHTokMin16uint;
156
157 (*KeywordMap)["bool1"] = EHTokBool1;
158 (*KeywordMap)["bool2"] = EHTokBool2;
159 (*KeywordMap)["bool3"] = EHTokBool3;
160 (*KeywordMap)["bool4"] = EHTokBool4;
161 (*KeywordMap)["float1"] = EHTokFloat1;
162 (*KeywordMap)["float2"] = EHTokFloat2;
163 (*KeywordMap)["float3"] = EHTokFloat3;
164 (*KeywordMap)["float4"] = EHTokFloat4;
165 (*KeywordMap)["int1"] = EHTokInt1;
166 (*KeywordMap)["int2"] = EHTokInt2;
167 (*KeywordMap)["int3"] = EHTokInt3;
168 (*KeywordMap)["int4"] = EHTokInt4;
169 (*KeywordMap)["double1"] = EHTokDouble1;
170 (*KeywordMap)["double2"] = EHTokDouble2;
171 (*KeywordMap)["double3"] = EHTokDouble3;
172 (*KeywordMap)["double4"] = EHTokDouble4;
173 (*KeywordMap)["uint1"] = EHTokUint1;
174 (*KeywordMap)["uint2"] = EHTokUint2;
175 (*KeywordMap)["uint3"] = EHTokUint3;
176 (*KeywordMap)["uint4"] = EHTokUint4;
177
178 (*KeywordMap)["half1"] = EHTokHalf1;
179 (*KeywordMap)["half2"] = EHTokHalf2;
180 (*KeywordMap)["half3"] = EHTokHalf3;
181 (*KeywordMap)["half4"] = EHTokHalf4;
182 (*KeywordMap)["min16float1"] = EHTokMin16float1;
183 (*KeywordMap)["min16float2"] = EHTokMin16float2;
184 (*KeywordMap)["min16float3"] = EHTokMin16float3;
185 (*KeywordMap)["min16float4"] = EHTokMin16float4;
186 (*KeywordMap)["min10float1"] = EHTokMin10float1;
187 (*KeywordMap)["min10float2"] = EHTokMin10float2;
188 (*KeywordMap)["min10float3"] = EHTokMin10float3;
189 (*KeywordMap)["min10float4"] = EHTokMin10float4;
190 (*KeywordMap)["min16int1"] = EHTokMin16int1;
191 (*KeywordMap)["min16int2"] = EHTokMin16int2;
192 (*KeywordMap)["min16int3"] = EHTokMin16int3;
193 (*KeywordMap)["min16int4"] = EHTokMin16int4;
194 (*KeywordMap)["min12int1"] = EHTokMin12int1;
195 (*KeywordMap)["min12int2"] = EHTokMin12int2;
196 (*KeywordMap)["min12int3"] = EHTokMin12int3;
197 (*KeywordMap)["min12int4"] = EHTokMin12int4;
198 (*KeywordMap)["min16uint1"] = EHTokMin16uint1;
199 (*KeywordMap)["min16uint2"] = EHTokMin16uint2;
200 (*KeywordMap)["min16uint3"] = EHTokMin16uint3;
201 (*KeywordMap)["min16uint4"] = EHTokMin16uint4;
202
203 (*KeywordMap)["bool1x1"] = EHTokBool1x1;
204 (*KeywordMap)["bool1x2"] = EHTokBool1x2;
205 (*KeywordMap)["bool1x3"] = EHTokBool1x3;
206 (*KeywordMap)["bool1x4"] = EHTokBool1x4;
207 (*KeywordMap)["bool2x1"] = EHTokBool2x1;
208 (*KeywordMap)["bool2x2"] = EHTokBool2x2;
209 (*KeywordMap)["bool2x3"] = EHTokBool2x3;
210 (*KeywordMap)["bool2x4"] = EHTokBool2x4;
211 (*KeywordMap)["bool3x1"] = EHTokBool3x1;
212 (*KeywordMap)["bool3x2"] = EHTokBool3x2;
213 (*KeywordMap)["bool3x3"] = EHTokBool3x3;
214 (*KeywordMap)["bool3x4"] = EHTokBool3x4;
215 (*KeywordMap)["bool4x1"] = EHTokBool4x1;
216 (*KeywordMap)["bool4x2"] = EHTokBool4x2;
217 (*KeywordMap)["bool4x3"] = EHTokBool4x3;
218 (*KeywordMap)["bool4x4"] = EHTokBool4x4;
219 (*KeywordMap)["int1x1"] = EHTokInt1x1;
220 (*KeywordMap)["int1x2"] = EHTokInt1x2;
221 (*KeywordMap)["int1x3"] = EHTokInt1x3;
222 (*KeywordMap)["int1x4"] = EHTokInt1x4;
223 (*KeywordMap)["int2x1"] = EHTokInt2x1;
224 (*KeywordMap)["int2x2"] = EHTokInt2x2;
225 (*KeywordMap)["int2x3"] = EHTokInt2x3;
226 (*KeywordMap)["int2x4"] = EHTokInt2x4;
227 (*KeywordMap)["int3x1"] = EHTokInt3x1;
228 (*KeywordMap)["int3x2"] = EHTokInt3x2;
229 (*KeywordMap)["int3x3"] = EHTokInt3x3;
230 (*KeywordMap)["int3x4"] = EHTokInt3x4;
231 (*KeywordMap)["int4x1"] = EHTokInt4x1;
232 (*KeywordMap)["int4x2"] = EHTokInt4x2;
233 (*KeywordMap)["int4x3"] = EHTokInt4x3;
234 (*KeywordMap)["int4x4"] = EHTokInt4x4;
235 (*KeywordMap)["uint1x1"] = EHTokUint1x1;
236 (*KeywordMap)["uint1x2"] = EHTokUint1x2;
237 (*KeywordMap)["uint1x3"] = EHTokUint1x3;
238 (*KeywordMap)["uint1x4"] = EHTokUint1x4;
239 (*KeywordMap)["uint2x1"] = EHTokUint2x1;
240 (*KeywordMap)["uint2x2"] = EHTokUint2x2;
241 (*KeywordMap)["uint2x3"] = EHTokUint2x3;
242 (*KeywordMap)["uint2x4"] = EHTokUint2x4;
243 (*KeywordMap)["uint3x1"] = EHTokUint3x1;
244 (*KeywordMap)["uint3x2"] = EHTokUint3x2;
245 (*KeywordMap)["uint3x3"] = EHTokUint3x3;
246 (*KeywordMap)["uint3x4"] = EHTokUint3x4;
247 (*KeywordMap)["uint4x1"] = EHTokUint4x1;
248 (*KeywordMap)["uint4x2"] = EHTokUint4x2;
249 (*KeywordMap)["uint4x3"] = EHTokUint4x3;
250 (*KeywordMap)["uint4x4"] = EHTokUint4x4;
251 (*KeywordMap)["bool1x1"] = EHTokBool1x1;
252 (*KeywordMap)["bool1x2"] = EHTokBool1x2;
253 (*KeywordMap)["bool1x3"] = EHTokBool1x3;
254 (*KeywordMap)["bool1x4"] = EHTokBool1x4;
255 (*KeywordMap)["bool2x1"] = EHTokBool2x1;
256 (*KeywordMap)["bool2x2"] = EHTokBool2x2;
257 (*KeywordMap)["bool2x3"] = EHTokBool2x3;
258 (*KeywordMap)["bool2x4"] = EHTokBool2x4;
259 (*KeywordMap)["bool3x1"] = EHTokBool3x1;
260 (*KeywordMap)["bool3x2"] = EHTokBool3x2;
261 (*KeywordMap)["bool3x3"] = EHTokBool3x3;
262 (*KeywordMap)["bool3x4"] = EHTokBool3x4;
263 (*KeywordMap)["bool4x1"] = EHTokBool4x1;
264 (*KeywordMap)["bool4x2"] = EHTokBool4x2;
265 (*KeywordMap)["bool4x3"] = EHTokBool4x3;
266 (*KeywordMap)["bool4x4"] = EHTokBool4x4;
267 (*KeywordMap)["float1x1"] = EHTokFloat1x1;
268 (*KeywordMap)["float1x2"] = EHTokFloat1x2;
269 (*KeywordMap)["float1x3"] = EHTokFloat1x3;
270 (*KeywordMap)["float1x4"] = EHTokFloat1x4;
271 (*KeywordMap)["float2x1"] = EHTokFloat2x1;
272 (*KeywordMap)["float2x2"] = EHTokFloat2x2;
273 (*KeywordMap)["float2x3"] = EHTokFloat2x3;
274 (*KeywordMap)["float2x4"] = EHTokFloat2x4;
275 (*KeywordMap)["float3x1"] = EHTokFloat3x1;
276 (*KeywordMap)["float3x2"] = EHTokFloat3x2;
277 (*KeywordMap)["float3x3"] = EHTokFloat3x3;
278 (*KeywordMap)["float3x4"] = EHTokFloat3x4;
279 (*KeywordMap)["float4x1"] = EHTokFloat4x1;
280 (*KeywordMap)["float4x2"] = EHTokFloat4x2;
281 (*KeywordMap)["float4x3"] = EHTokFloat4x3;
282 (*KeywordMap)["float4x4"] = EHTokFloat4x4;
283 (*KeywordMap)["half1x1"] = EHTokHalf1x1;
284 (*KeywordMap)["half1x2"] = EHTokHalf1x2;
285 (*KeywordMap)["half1x3"] = EHTokHalf1x3;
286 (*KeywordMap)["half1x4"] = EHTokHalf1x4;
287 (*KeywordMap)["half2x1"] = EHTokHalf2x1;
288 (*KeywordMap)["half2x2"] = EHTokHalf2x2;
289 (*KeywordMap)["half2x3"] = EHTokHalf2x3;
290 (*KeywordMap)["half2x4"] = EHTokHalf2x4;
291 (*KeywordMap)["half3x1"] = EHTokHalf3x1;
292 (*KeywordMap)["half3x2"] = EHTokHalf3x2;
293 (*KeywordMap)["half3x3"] = EHTokHalf3x3;
294 (*KeywordMap)["half3x4"] = EHTokHalf3x4;
295 (*KeywordMap)["half4x1"] = EHTokHalf4x1;
296 (*KeywordMap)["half4x2"] = EHTokHalf4x2;
297 (*KeywordMap)["half4x3"] = EHTokHalf4x3;
298 (*KeywordMap)["half4x4"] = EHTokHalf4x4;
299 (*KeywordMap)["double1x1"] = EHTokDouble1x1;
300 (*KeywordMap)["double1x2"] = EHTokDouble1x2;
301 (*KeywordMap)["double1x3"] = EHTokDouble1x3;
302 (*KeywordMap)["double1x4"] = EHTokDouble1x4;
303 (*KeywordMap)["double2x1"] = EHTokDouble2x1;
304 (*KeywordMap)["double2x2"] = EHTokDouble2x2;
305 (*KeywordMap)["double2x3"] = EHTokDouble2x3;
306 (*KeywordMap)["double2x4"] = EHTokDouble2x4;
307 (*KeywordMap)["double3x1"] = EHTokDouble3x1;
308 (*KeywordMap)["double3x2"] = EHTokDouble3x2;
309 (*KeywordMap)["double3x3"] = EHTokDouble3x3;
310 (*KeywordMap)["double3x4"] = EHTokDouble3x4;
311 (*KeywordMap)["double4x1"] = EHTokDouble4x1;
312 (*KeywordMap)["double4x2"] = EHTokDouble4x2;
313 (*KeywordMap)["double4x3"] = EHTokDouble4x3;
314 (*KeywordMap)["double4x4"] = EHTokDouble4x4;
315 (*KeywordMap)["min16float1x1"] = EHTokMin16float1x1;
316 (*KeywordMap)["min16float1x2"] = EHTokMin16float1x2;
317 (*KeywordMap)["min16float1x3"] = EHTokMin16float1x3;
318 (*KeywordMap)["min16float1x4"] = EHTokMin16float1x4;
319 (*KeywordMap)["min16float2x1"] = EHTokMin16float2x1;
320 (*KeywordMap)["min16float2x2"] = EHTokMin16float2x2;
321 (*KeywordMap)["min16float2x3"] = EHTokMin16float2x3;
322 (*KeywordMap)["min16float2x4"] = EHTokMin16float2x4;
323 (*KeywordMap)["min16float3x1"] = EHTokMin16float3x1;
324 (*KeywordMap)["min16float3x2"] = EHTokMin16float3x2;
325 (*KeywordMap)["min16float3x3"] = EHTokMin16float3x3;
326 (*KeywordMap)["min16float3x4"] = EHTokMin16float3x4;
327 (*KeywordMap)["min16float4x1"] = EHTokMin16float4x1;
328 (*KeywordMap)["min16float4x2"] = EHTokMin16float4x2;
329 (*KeywordMap)["min16float4x3"] = EHTokMin16float4x3;
330 (*KeywordMap)["min16float4x4"] = EHTokMin16float4x4;
331 (*KeywordMap)["min10float1x1"] = EHTokMin10float1x1;
332 (*KeywordMap)["min10float1x2"] = EHTokMin10float1x2;
333 (*KeywordMap)["min10float1x3"] = EHTokMin10float1x3;
334 (*KeywordMap)["min10float1x4"] = EHTokMin10float1x4;
335 (*KeywordMap)["min10float2x1"] = EHTokMin10float2x1;
336 (*KeywordMap)["min10float2x2"] = EHTokMin10float2x2;
337 (*KeywordMap)["min10float2x3"] = EHTokMin10float2x3;
338 (*KeywordMap)["min10float2x4"] = EHTokMin10float2x4;
339 (*KeywordMap)["min10float3x1"] = EHTokMin10float3x1;
340 (*KeywordMap)["min10float3x2"] = EHTokMin10float3x2;
341 (*KeywordMap)["min10float3x3"] = EHTokMin10float3x3;
342 (*KeywordMap)["min10float3x4"] = EHTokMin10float3x4;
343 (*KeywordMap)["min10float4x1"] = EHTokMin10float4x1;
344 (*KeywordMap)["min10float4x2"] = EHTokMin10float4x2;
345 (*KeywordMap)["min10float4x3"] = EHTokMin10float4x3;
346 (*KeywordMap)["min10float4x4"] = EHTokMin10float4x4;
347 (*KeywordMap)["min16int1x1"] = EHTokMin16int1x1;
348 (*KeywordMap)["min16int1x2"] = EHTokMin16int1x2;
349 (*KeywordMap)["min16int1x3"] = EHTokMin16int1x3;
350 (*KeywordMap)["min16int1x4"] = EHTokMin16int1x4;
351 (*KeywordMap)["min16int2x1"] = EHTokMin16int2x1;
352 (*KeywordMap)["min16int2x2"] = EHTokMin16int2x2;
353 (*KeywordMap)["min16int2x3"] = EHTokMin16int2x3;
354 (*KeywordMap)["min16int2x4"] = EHTokMin16int2x4;
355 (*KeywordMap)["min16int3x1"] = EHTokMin16int3x1;
356 (*KeywordMap)["min16int3x2"] = EHTokMin16int3x2;
357 (*KeywordMap)["min16int3x3"] = EHTokMin16int3x3;
358 (*KeywordMap)["min16int3x4"] = EHTokMin16int3x4;
359 (*KeywordMap)["min16int4x1"] = EHTokMin16int4x1;
360 (*KeywordMap)["min16int4x2"] = EHTokMin16int4x2;
361 (*KeywordMap)["min16int4x3"] = EHTokMin16int4x3;
362 (*KeywordMap)["min16int4x4"] = EHTokMin16int4x4;
363 (*KeywordMap)["min12int1x1"] = EHTokMin12int1x1;
364 (*KeywordMap)["min12int1x2"] = EHTokMin12int1x2;
365 (*KeywordMap)["min12int1x3"] = EHTokMin12int1x3;
366 (*KeywordMap)["min12int1x4"] = EHTokMin12int1x4;
367 (*KeywordMap)["min12int2x1"] = EHTokMin12int2x1;
368 (*KeywordMap)["min12int2x2"] = EHTokMin12int2x2;
369 (*KeywordMap)["min12int2x3"] = EHTokMin12int2x3;
370 (*KeywordMap)["min12int2x4"] = EHTokMin12int2x4;
371 (*KeywordMap)["min12int3x1"] = EHTokMin12int3x1;
372 (*KeywordMap)["min12int3x2"] = EHTokMin12int3x2;
373 (*KeywordMap)["min12int3x3"] = EHTokMin12int3x3;
374 (*KeywordMap)["min12int3x4"] = EHTokMin12int3x4;
375 (*KeywordMap)["min12int4x1"] = EHTokMin12int4x1;
376 (*KeywordMap)["min12int4x2"] = EHTokMin12int4x2;
377 (*KeywordMap)["min12int4x3"] = EHTokMin12int4x3;
378 (*KeywordMap)["min12int4x4"] = EHTokMin12int4x4;
379 (*KeywordMap)["min16uint1x1"] = EHTokMin16uint1x1;
380 (*KeywordMap)["min16uint1x2"] = EHTokMin16uint1x2;
381 (*KeywordMap)["min16uint1x3"] = EHTokMin16uint1x3;
382 (*KeywordMap)["min16uint1x4"] = EHTokMin16uint1x4;
383 (*KeywordMap)["min16uint2x1"] = EHTokMin16uint2x1;
384 (*KeywordMap)["min16uint2x2"] = EHTokMin16uint2x2;
385 (*KeywordMap)["min16uint2x3"] = EHTokMin16uint2x3;
386 (*KeywordMap)["min16uint2x4"] = EHTokMin16uint2x4;
387 (*KeywordMap)["min16uint3x1"] = EHTokMin16uint3x1;
388 (*KeywordMap)["min16uint3x2"] = EHTokMin16uint3x2;
389 (*KeywordMap)["min16uint3x3"] = EHTokMin16uint3x3;
390 (*KeywordMap)["min16uint3x4"] = EHTokMin16uint3x4;
391 (*KeywordMap)["min16uint4x1"] = EHTokMin16uint4x1;
392 (*KeywordMap)["min16uint4x2"] = EHTokMin16uint4x2;
393 (*KeywordMap)["min16uint4x3"] = EHTokMin16uint4x3;
394 (*KeywordMap)["min16uint4x4"] = EHTokMin16uint4x4;
395
396 (*KeywordMap)["sampler"] = EHTokSampler;
397 (*KeywordMap)["sampler1D"] = EHTokSampler1d;
398 (*KeywordMap)["sampler2D"] = EHTokSampler2d;
399 (*KeywordMap)["sampler3D"] = EHTokSampler3d;
400 (*KeywordMap)["samplerCUBE"] = EHTokSamplerCube;
401 (*KeywordMap)["sampler_state"] = EHTokSamplerState;
402 (*KeywordMap)["SamplerState"] = EHTokSamplerState;
403 (*KeywordMap)["SamplerComparisonState"] = EHTokSamplerComparisonState;
404 (*KeywordMap)["texture"] = EHTokTexture;
405 (*KeywordMap)["Texture1D"] = EHTokTexture1d;
406 (*KeywordMap)["Texture1DArray"] = EHTokTexture1darray;
407 (*KeywordMap)["Texture2D"] = EHTokTexture2d;
408 (*KeywordMap)["Texture2DArray"] = EHTokTexture2darray;
409 (*KeywordMap)["Texture3D"] = EHTokTexture3d;
410 (*KeywordMap)["TextureCube"] = EHTokTextureCube;
411 (*KeywordMap)["TextureCubeArray"] = EHTokTextureCubearray;
412 (*KeywordMap)["Texture2DMS"] = EHTokTexture2DMS;
413 (*KeywordMap)["Texture2DMSArray"] = EHTokTexture2DMSarray;
414 (*KeywordMap)["RWTexture1D"] = EHTokRWTexture1d;
415 (*KeywordMap)["RWTexture1DArray"] = EHTokRWTexture1darray;
416 (*KeywordMap)["RWTexture2D"] = EHTokRWTexture2d;
417 (*KeywordMap)["RWTexture2DArray"] = EHTokRWTexture2darray;
418 (*KeywordMap)["RWTexture3D"] = EHTokRWTexture3d;
419 (*KeywordMap)["RWBuffer"] = EHTokRWBuffer;
420 (*KeywordMap)["SubpassInput"] = EHTokSubpassInput;
421 (*KeywordMap)["SubpassInputMS"] = EHTokSubpassInputMS;
422
423 (*KeywordMap)["AppendStructuredBuffer"] = EHTokAppendStructuredBuffer;
424 (*KeywordMap)["ByteAddressBuffer"] = EHTokByteAddressBuffer;
425 (*KeywordMap)["ConsumeStructuredBuffer"] = EHTokConsumeStructuredBuffer;
426 (*KeywordMap)["RWByteAddressBuffer"] = EHTokRWByteAddressBuffer;
427 (*KeywordMap)["RWStructuredBuffer"] = EHTokRWStructuredBuffer;
428 (*KeywordMap)["StructuredBuffer"] = EHTokStructuredBuffer;
429 (*KeywordMap)["TextureBuffer"] = EHTokTextureBuffer;
430
431 (*KeywordMap)["class"] = EHTokClass;
432 (*KeywordMap)["struct"] = EHTokStruct;
433 (*KeywordMap)["cbuffer"] = EHTokCBuffer;
434 (*KeywordMap)["ConstantBuffer"] = EHTokConstantBuffer;
435 (*KeywordMap)["tbuffer"] = EHTokTBuffer;
436 (*KeywordMap)["typedef"] = EHTokTypedef;
437 (*KeywordMap)["this"] = EHTokThis;
438 (*KeywordMap)["namespace"] = EHTokNamespace;
439
440 (*KeywordMap)["true"] = EHTokBoolConstant;
441 (*KeywordMap)["false"] = EHTokBoolConstant;
442
443 (*KeywordMap)["for"] = EHTokFor;
444 (*KeywordMap)["do"] = EHTokDo;
445 (*KeywordMap)["while"] = EHTokWhile;
446 (*KeywordMap)["break"] = EHTokBreak;
447 (*KeywordMap)["continue"] = EHTokContinue;
448 (*KeywordMap)["if"] = EHTokIf;
449 (*KeywordMap)["else"] = EHTokElse;
450 (*KeywordMap)["discard"] = EHTokDiscard;
451 (*KeywordMap)["return"] = EHTokReturn;
452 (*KeywordMap)["switch"] = EHTokSwitch;
453 (*KeywordMap)["case"] = EHTokCase;
454 (*KeywordMap)["default"] = EHTokDefault;
455
456 // TODO: get correct set here
457 ReservedSet = new std::unordered_set<const char*, str_hash, str_eq>;
458
459 ReservedSet->insert("auto");
460 ReservedSet->insert("catch");
461 ReservedSet->insert("char");
462 ReservedSet->insert("const_cast");
463 ReservedSet->insert("enum");
464 ReservedSet->insert("explicit");
465 ReservedSet->insert("friend");
466 ReservedSet->insert("goto");
467 ReservedSet->insert("long");
468 ReservedSet->insert("mutable");
469 ReservedSet->insert("new");
470 ReservedSet->insert("operator");
471 ReservedSet->insert("private");
472 ReservedSet->insert("protected");
473 ReservedSet->insert("public");
474 ReservedSet->insert("reinterpret_cast");
475 ReservedSet->insert("short");
476 ReservedSet->insert("signed");
477 ReservedSet->insert("sizeof");
478 ReservedSet->insert("static_cast");
479 ReservedSet->insert("template");
480 ReservedSet->insert("throw");
481 ReservedSet->insert("try");
482 ReservedSet->insert("typename");
483 ReservedSet->insert("union");
484 ReservedSet->insert("unsigned");
485 ReservedSet->insert("using");
486 ReservedSet->insert("virtual");
487
488 SemanticMap = new std::unordered_map<const char*, glslang::TBuiltInVariable, str_hash, str_eq>;
489
490 // in DX9, all outputs had to have a semantic associated with them, that was either consumed
491 // by the system or was a specific register assignment
492 // in DX10+, only semantics with the SV_ prefix have any meaning beyond decoration
493 // Fxc will only accept DX9 style semantics in compat mode
494 // Also, in DX10 if a SV value is present as the input of a stage, but isn't appropriate for that
495 // stage, it would just be ignored as it is likely there as part of an output struct from one stage
496 // to the next
497 bool bParseDX9 = false;
498 if (bParseDX9) {
499 (*SemanticMap)["PSIZE"] = EbvPointSize;
500 (*SemanticMap)["FOG"] = EbvFogFragCoord;
501 (*SemanticMap)["DEPTH"] = EbvFragDepth;
502 (*SemanticMap)["VFACE"] = EbvFace;
503 (*SemanticMap)["VPOS"] = EbvFragCoord;
504 }
505
506 (*SemanticMap)["SV_POSITION"] = EbvPosition;
507 (*SemanticMap)["SV_VERTEXID"] = EbvVertexIndex;
508 (*SemanticMap)["SV_VIEWPORTARRAYINDEX"] = EbvViewportIndex;
509 (*SemanticMap)["SV_TESSFACTOR"] = EbvTessLevelOuter;
510 (*SemanticMap)["SV_SAMPLEINDEX"] = EbvSampleId;
511 (*SemanticMap)["SV_RENDERTARGETARRAYINDEX"] = EbvLayer;
512 (*SemanticMap)["SV_PRIMITIVEID"] = EbvPrimitiveId;
513 (*SemanticMap)["SV_OUTPUTCONTROLPOINTID"] = EbvInvocationId;
514 (*SemanticMap)["SV_ISFRONTFACE"] = EbvFace;
515 (*SemanticMap)["SV_VIEWID"] = EbvViewIndex;
516 (*SemanticMap)["SV_INSTANCEID"] = EbvInstanceIndex;
517 (*SemanticMap)["SV_INSIDETESSFACTOR"] = EbvTessLevelInner;
518 (*SemanticMap)["SV_GSINSTANCEID"] = EbvInvocationId;
519 (*SemanticMap)["SV_DISPATCHTHREADID"] = EbvGlobalInvocationId;
520 (*SemanticMap)["SV_GROUPTHREADID"] = EbvLocalInvocationId;
521 (*SemanticMap)["SV_GROUPINDEX"] = EbvLocalInvocationIndex;
522 (*SemanticMap)["SV_GROUPID"] = EbvWorkGroupId;
523 (*SemanticMap)["SV_DOMAINLOCATION"] = EbvTessCoord;
524 (*SemanticMap)["SV_DEPTH"] = EbvFragDepth;
525 (*SemanticMap)["SV_COVERAGE"] = EbvSampleMask;
526 (*SemanticMap)["SV_DEPTHGREATEREQUAL"] = EbvFragDepthGreater;
527 (*SemanticMap)["SV_DEPTHLESSEQUAL"] = EbvFragDepthLesser;
528 (*SemanticMap)["SV_STENCILREF"] = EbvFragStencilRef;
529 }
530
deleteKeywordMap()531 void HlslScanContext::deleteKeywordMap()
532 {
533 delete KeywordMap;
534 KeywordMap = nullptr;
535 delete ReservedSet;
536 ReservedSet = nullptr;
537 delete SemanticMap;
538 SemanticMap = nullptr;
539 }
540
541 // Wrapper for tokenizeClass() to get everything inside the token.
tokenize(HlslToken & token)542 void HlslScanContext::tokenize(HlslToken& token)
543 {
544 EHlslTokenClass tokenClass = tokenizeClass(token);
545 token.tokenClass = tokenClass;
546 }
547
mapSemantic(const char * upperCase)548 glslang::TBuiltInVariable HlslScanContext::mapSemantic(const char* upperCase)
549 {
550 auto it = SemanticMap->find(upperCase);
551 if (it != SemanticMap->end())
552 return it->second;
553 else
554 return glslang::EbvNone;
555 }
556
557 //
558 // Fill in token information for the next token, except for the token class.
559 // Returns the enum value of the token class of the next token found.
560 // Return 0 (EndOfTokens) on end of input.
561 //
tokenizeClass(HlslToken & token)562 EHlslTokenClass HlslScanContext::tokenizeClass(HlslToken& token)
563 {
564 do {
565 parserToken = &token;
566 TPpToken ppToken;
567 int token = ppContext.tokenize(ppToken);
568 if (token == EndOfInput)
569 return EHTokNone;
570
571 tokenText = ppToken.name;
572 loc = ppToken.loc;
573 parserToken->loc = loc;
574 switch (token) {
575 case ';': return EHTokSemicolon;
576 case ',': return EHTokComma;
577 case ':': return EHTokColon;
578 case '=': return EHTokAssign;
579 case '(': return EHTokLeftParen;
580 case ')': return EHTokRightParen;
581 case '.': return EHTokDot;
582 case '!': return EHTokBang;
583 case '-': return EHTokDash;
584 case '~': return EHTokTilde;
585 case '+': return EHTokPlus;
586 case '*': return EHTokStar;
587 case '/': return EHTokSlash;
588 case '%': return EHTokPercent;
589 case '<': return EHTokLeftAngle;
590 case '>': return EHTokRightAngle;
591 case '|': return EHTokVerticalBar;
592 case '^': return EHTokCaret;
593 case '&': return EHTokAmpersand;
594 case '?': return EHTokQuestion;
595 case '[': return EHTokLeftBracket;
596 case ']': return EHTokRightBracket;
597 case '{': return EHTokLeftBrace;
598 case '}': return EHTokRightBrace;
599 case '\\':
600 parseContext.error(loc, "illegal use of escape character", "\\", "");
601 break;
602
603 case PPAtomAddAssign: return EHTokAddAssign;
604 case PPAtomSubAssign: return EHTokSubAssign;
605 case PPAtomMulAssign: return EHTokMulAssign;
606 case PPAtomDivAssign: return EHTokDivAssign;
607 case PPAtomModAssign: return EHTokModAssign;
608
609 case PpAtomRight: return EHTokRightOp;
610 case PpAtomLeft: return EHTokLeftOp;
611
612 case PpAtomRightAssign: return EHTokRightAssign;
613 case PpAtomLeftAssign: return EHTokLeftAssign;
614 case PpAtomAndAssign: return EHTokAndAssign;
615 case PpAtomOrAssign: return EHTokOrAssign;
616 case PpAtomXorAssign: return EHTokXorAssign;
617
618 case PpAtomAnd: return EHTokAndOp;
619 case PpAtomOr: return EHTokOrOp;
620 case PpAtomXor: return EHTokXorOp;
621
622 case PpAtomEQ: return EHTokEqOp;
623 case PpAtomGE: return EHTokGeOp;
624 case PpAtomNE: return EHTokNeOp;
625 case PpAtomLE: return EHTokLeOp;
626
627 case PpAtomDecrement: return EHTokDecOp;
628 case PpAtomIncrement: return EHTokIncOp;
629
630 case PpAtomColonColon: return EHTokColonColon;
631
632 case PpAtomConstInt: parserToken->i = ppToken.ival; return EHTokIntConstant;
633 case PpAtomConstUint: parserToken->i = ppToken.ival; return EHTokUintConstant;
634 case PpAtomConstFloat16: parserToken->d = ppToken.dval; return EHTokFloat16Constant;
635 case PpAtomConstFloat: parserToken->d = ppToken.dval; return EHTokFloatConstant;
636 case PpAtomConstDouble: parserToken->d = ppToken.dval; return EHTokDoubleConstant;
637 case PpAtomIdentifier:
638 {
639 EHlslTokenClass token = tokenizeIdentifier();
640 return token;
641 }
642
643 case PpAtomConstString: {
644 parserToken->string = NewPoolTString(tokenText);
645 return EHTokStringConstant;
646 }
647
648 case EndOfInput: return EHTokNone;
649
650 default:
651 if (token < PpAtomMaxSingle) {
652 char buf[2];
653 buf[0] = (char)token;
654 buf[1] = 0;
655 parseContext.error(loc, "unexpected token", buf, "");
656 } else if (tokenText[0] != 0)
657 parseContext.error(loc, "unexpected token", tokenText, "");
658 else
659 parseContext.error(loc, "unexpected token", "", "");
660 break;
661 }
662 } while (true);
663 }
664
tokenizeIdentifier()665 EHlslTokenClass HlslScanContext::tokenizeIdentifier()
666 {
667 if (ReservedSet->find(tokenText) != ReservedSet->end())
668 return reservedWord();
669
670 auto it = KeywordMap->find(tokenText);
671 if (it == KeywordMap->end()) {
672 // Should have an identifier of some sort
673 return identifierOrType();
674 }
675 keyword = it->second;
676
677 switch (keyword) {
678
679 // qualifiers
680 case EHTokStatic:
681 case EHTokConst:
682 case EHTokSNorm:
683 case EHTokUnorm:
684 case EHTokExtern:
685 case EHTokUniform:
686 case EHTokVolatile:
687 case EHTokShared:
688 case EHTokGroupShared:
689 case EHTokLinear:
690 case EHTokCentroid:
691 case EHTokNointerpolation:
692 case EHTokNoperspective:
693 case EHTokSample:
694 case EHTokRowMajor:
695 case EHTokColumnMajor:
696 case EHTokPackOffset:
697 case EHTokIn:
698 case EHTokOut:
699 case EHTokInOut:
700 case EHTokPrecise:
701 case EHTokLayout:
702 case EHTokGloballyCoherent:
703 case EHTokInline:
704 return keyword;
705
706 // primitive types
707 case EHTokPoint:
708 case EHTokLine:
709 case EHTokTriangle:
710 case EHTokLineAdj:
711 case EHTokTriangleAdj:
712 return keyword;
713
714 // stream out types
715 case EHTokPointStream:
716 case EHTokLineStream:
717 case EHTokTriangleStream:
718 return keyword;
719
720 // Tessellation patches
721 case EHTokInputPatch:
722 case EHTokOutputPatch:
723 return keyword;
724
725 case EHTokBuffer:
726 case EHTokVector:
727 case EHTokMatrix:
728 return keyword;
729
730 // scalar types
731 case EHTokVoid:
732 case EHTokString:
733 case EHTokBool:
734 case EHTokInt:
735 case EHTokUint:
736 case EHTokUint64:
737 case EHTokDword:
738 case EHTokHalf:
739 case EHTokFloat:
740 case EHTokDouble:
741 case EHTokMin16float:
742 case EHTokMin10float:
743 case EHTokMin16int:
744 case EHTokMin12int:
745 case EHTokMin16uint:
746
747 // vector types
748 case EHTokBool1:
749 case EHTokBool2:
750 case EHTokBool3:
751 case EHTokBool4:
752 case EHTokFloat1:
753 case EHTokFloat2:
754 case EHTokFloat3:
755 case EHTokFloat4:
756 case EHTokInt1:
757 case EHTokInt2:
758 case EHTokInt3:
759 case EHTokInt4:
760 case EHTokDouble1:
761 case EHTokDouble2:
762 case EHTokDouble3:
763 case EHTokDouble4:
764 case EHTokUint1:
765 case EHTokUint2:
766 case EHTokUint3:
767 case EHTokUint4:
768 case EHTokHalf1:
769 case EHTokHalf2:
770 case EHTokHalf3:
771 case EHTokHalf4:
772 case EHTokMin16float1:
773 case EHTokMin16float2:
774 case EHTokMin16float3:
775 case EHTokMin16float4:
776 case EHTokMin10float1:
777 case EHTokMin10float2:
778 case EHTokMin10float3:
779 case EHTokMin10float4:
780 case EHTokMin16int1:
781 case EHTokMin16int2:
782 case EHTokMin16int3:
783 case EHTokMin16int4:
784 case EHTokMin12int1:
785 case EHTokMin12int2:
786 case EHTokMin12int3:
787 case EHTokMin12int4:
788 case EHTokMin16uint1:
789 case EHTokMin16uint2:
790 case EHTokMin16uint3:
791 case EHTokMin16uint4:
792
793 // matrix types
794 case EHTokBool1x1:
795 case EHTokBool1x2:
796 case EHTokBool1x3:
797 case EHTokBool1x4:
798 case EHTokBool2x1:
799 case EHTokBool2x2:
800 case EHTokBool2x3:
801 case EHTokBool2x4:
802 case EHTokBool3x1:
803 case EHTokBool3x2:
804 case EHTokBool3x3:
805 case EHTokBool3x4:
806 case EHTokBool4x1:
807 case EHTokBool4x2:
808 case EHTokBool4x3:
809 case EHTokBool4x4:
810 case EHTokInt1x1:
811 case EHTokInt1x2:
812 case EHTokInt1x3:
813 case EHTokInt1x4:
814 case EHTokInt2x1:
815 case EHTokInt2x2:
816 case EHTokInt2x3:
817 case EHTokInt2x4:
818 case EHTokInt3x1:
819 case EHTokInt3x2:
820 case EHTokInt3x3:
821 case EHTokInt3x4:
822 case EHTokInt4x1:
823 case EHTokInt4x2:
824 case EHTokInt4x3:
825 case EHTokInt4x4:
826 case EHTokUint1x1:
827 case EHTokUint1x2:
828 case EHTokUint1x3:
829 case EHTokUint1x4:
830 case EHTokUint2x1:
831 case EHTokUint2x2:
832 case EHTokUint2x3:
833 case EHTokUint2x4:
834 case EHTokUint3x1:
835 case EHTokUint3x2:
836 case EHTokUint3x3:
837 case EHTokUint3x4:
838 case EHTokUint4x1:
839 case EHTokUint4x2:
840 case EHTokUint4x3:
841 case EHTokUint4x4:
842 case EHTokFloat1x1:
843 case EHTokFloat1x2:
844 case EHTokFloat1x3:
845 case EHTokFloat1x4:
846 case EHTokFloat2x1:
847 case EHTokFloat2x2:
848 case EHTokFloat2x3:
849 case EHTokFloat2x4:
850 case EHTokFloat3x1:
851 case EHTokFloat3x2:
852 case EHTokFloat3x3:
853 case EHTokFloat3x4:
854 case EHTokFloat4x1:
855 case EHTokFloat4x2:
856 case EHTokFloat4x3:
857 case EHTokFloat4x4:
858 case EHTokHalf1x1:
859 case EHTokHalf1x2:
860 case EHTokHalf1x3:
861 case EHTokHalf1x4:
862 case EHTokHalf2x1:
863 case EHTokHalf2x2:
864 case EHTokHalf2x3:
865 case EHTokHalf2x4:
866 case EHTokHalf3x1:
867 case EHTokHalf3x2:
868 case EHTokHalf3x3:
869 case EHTokHalf3x4:
870 case EHTokHalf4x1:
871 case EHTokHalf4x2:
872 case EHTokHalf4x3:
873 case EHTokHalf4x4:
874 case EHTokDouble1x1:
875 case EHTokDouble1x2:
876 case EHTokDouble1x3:
877 case EHTokDouble1x4:
878 case EHTokDouble2x1:
879 case EHTokDouble2x2:
880 case EHTokDouble2x3:
881 case EHTokDouble2x4:
882 case EHTokDouble3x1:
883 case EHTokDouble3x2:
884 case EHTokDouble3x3:
885 case EHTokDouble3x4:
886 case EHTokDouble4x1:
887 case EHTokDouble4x2:
888 case EHTokDouble4x3:
889 case EHTokDouble4x4:
890 case EHTokMin16float1x1:
891 case EHTokMin16float1x2:
892 case EHTokMin16float1x3:
893 case EHTokMin16float1x4:
894 case EHTokMin16float2x1:
895 case EHTokMin16float2x2:
896 case EHTokMin16float2x3:
897 case EHTokMin16float2x4:
898 case EHTokMin16float3x1:
899 case EHTokMin16float3x2:
900 case EHTokMin16float3x3:
901 case EHTokMin16float3x4:
902 case EHTokMin16float4x1:
903 case EHTokMin16float4x2:
904 case EHTokMin16float4x3:
905 case EHTokMin16float4x4:
906 case EHTokMin10float1x1:
907 case EHTokMin10float1x2:
908 case EHTokMin10float1x3:
909 case EHTokMin10float1x4:
910 case EHTokMin10float2x1:
911 case EHTokMin10float2x2:
912 case EHTokMin10float2x3:
913 case EHTokMin10float2x4:
914 case EHTokMin10float3x1:
915 case EHTokMin10float3x2:
916 case EHTokMin10float3x3:
917 case EHTokMin10float3x4:
918 case EHTokMin10float4x1:
919 case EHTokMin10float4x2:
920 case EHTokMin10float4x3:
921 case EHTokMin10float4x4:
922 case EHTokMin16int1x1:
923 case EHTokMin16int1x2:
924 case EHTokMin16int1x3:
925 case EHTokMin16int1x4:
926 case EHTokMin16int2x1:
927 case EHTokMin16int2x2:
928 case EHTokMin16int2x3:
929 case EHTokMin16int2x4:
930 case EHTokMin16int3x1:
931 case EHTokMin16int3x2:
932 case EHTokMin16int3x3:
933 case EHTokMin16int3x4:
934 case EHTokMin16int4x1:
935 case EHTokMin16int4x2:
936 case EHTokMin16int4x3:
937 case EHTokMin16int4x4:
938 case EHTokMin12int1x1:
939 case EHTokMin12int1x2:
940 case EHTokMin12int1x3:
941 case EHTokMin12int1x4:
942 case EHTokMin12int2x1:
943 case EHTokMin12int2x2:
944 case EHTokMin12int2x3:
945 case EHTokMin12int2x4:
946 case EHTokMin12int3x1:
947 case EHTokMin12int3x2:
948 case EHTokMin12int3x3:
949 case EHTokMin12int3x4:
950 case EHTokMin12int4x1:
951 case EHTokMin12int4x2:
952 case EHTokMin12int4x3:
953 case EHTokMin12int4x4:
954 case EHTokMin16uint1x1:
955 case EHTokMin16uint1x2:
956 case EHTokMin16uint1x3:
957 case EHTokMin16uint1x4:
958 case EHTokMin16uint2x1:
959 case EHTokMin16uint2x2:
960 case EHTokMin16uint2x3:
961 case EHTokMin16uint2x4:
962 case EHTokMin16uint3x1:
963 case EHTokMin16uint3x2:
964 case EHTokMin16uint3x3:
965 case EHTokMin16uint3x4:
966 case EHTokMin16uint4x1:
967 case EHTokMin16uint4x2:
968 case EHTokMin16uint4x3:
969 case EHTokMin16uint4x4:
970 return keyword;
971
972 // texturing types
973 case EHTokSampler:
974 case EHTokSampler1d:
975 case EHTokSampler2d:
976 case EHTokSampler3d:
977 case EHTokSamplerCube:
978 case EHTokSamplerState:
979 case EHTokSamplerComparisonState:
980 case EHTokTexture:
981 case EHTokTexture1d:
982 case EHTokTexture1darray:
983 case EHTokTexture2d:
984 case EHTokTexture2darray:
985 case EHTokTexture3d:
986 case EHTokTextureCube:
987 case EHTokTextureCubearray:
988 case EHTokTexture2DMS:
989 case EHTokTexture2DMSarray:
990 case EHTokRWTexture1d:
991 case EHTokRWTexture1darray:
992 case EHTokRWTexture2d:
993 case EHTokRWTexture2darray:
994 case EHTokRWTexture3d:
995 case EHTokRWBuffer:
996 case EHTokAppendStructuredBuffer:
997 case EHTokByteAddressBuffer:
998 case EHTokConsumeStructuredBuffer:
999 case EHTokRWByteAddressBuffer:
1000 case EHTokRWStructuredBuffer:
1001 case EHTokStructuredBuffer:
1002 case EHTokTextureBuffer:
1003 case EHTokSubpassInput:
1004 case EHTokSubpassInputMS:
1005 return keyword;
1006
1007 // variable, user type, ...
1008 case EHTokClass:
1009 case EHTokStruct:
1010 case EHTokTypedef:
1011 case EHTokCBuffer:
1012 case EHTokConstantBuffer:
1013 case EHTokTBuffer:
1014 case EHTokThis:
1015 case EHTokNamespace:
1016 return keyword;
1017
1018 case EHTokBoolConstant:
1019 if (strcmp("true", tokenText) == 0)
1020 parserToken->b = true;
1021 else
1022 parserToken->b = false;
1023 return keyword;
1024
1025 // control flow
1026 case EHTokFor:
1027 case EHTokDo:
1028 case EHTokWhile:
1029 case EHTokBreak:
1030 case EHTokContinue:
1031 case EHTokIf:
1032 case EHTokElse:
1033 case EHTokDiscard:
1034 case EHTokReturn:
1035 case EHTokCase:
1036 case EHTokSwitch:
1037 case EHTokDefault:
1038 return keyword;
1039
1040 default:
1041 parseContext.infoSink.info.message(EPrefixInternalError, "Unknown glslang keyword", loc);
1042 return EHTokNone;
1043 }
1044 }
1045
identifierOrType()1046 EHlslTokenClass HlslScanContext::identifierOrType()
1047 {
1048 parserToken->string = NewPoolTString(tokenText);
1049
1050 return EHTokIdentifier;
1051 }
1052
1053 // Give an error for use of a reserved symbol.
1054 // However, allow built-in declarations to use reserved words, to allow
1055 // extension support before the extension is enabled.
reservedWord()1056 EHlslTokenClass HlslScanContext::reservedWord()
1057 {
1058 if (! parseContext.symbolTable.atBuiltInLevel())
1059 parseContext.error(loc, "Reserved word.", tokenText, "", "");
1060
1061 return EHTokNone;
1062 }
1063
1064 } // end namespace glslang
1065