• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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