blob: 372cfd7cf09167749fe9ca825cb2953796c0db79 [file] [log] [blame]
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001// Copyright (c) 2015 The Khronos Group Inc.
2//
3// Permission is hereby granted, free of charge, to any person obtaining a
4// copy of this software and/or associated documentation files (the
5// "Materials"), to deal in the Materials without restriction, including
6// without limitation the rights to use, copy, modify, merge, publish,
7// distribute, sublicense, and/or sell copies of the Materials, and to
8// permit persons to whom the Materials are furnished to do so, subject to
9// the following conditions:
10//
11// The above copyright notice and this permission notice shall be included
12// in all copies or substantial portions of the Materials.
13//
14// MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS
15// KHRONOS STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS
16// SPECIFICATIONS AND HEADER INFORMATION ARE LOCATED AT
17// https://www.khronos.org/registry/
18//
19// THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
20// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
22// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
23// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
24// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
25// MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
26
27#include "operand.h"
28
29#include <assert.h>
30#include <string.h>
31
32static const spv_operand_desc_t sourceLanguageEntries[] = {
33 {"Unknown",
34 SourceLanguageUnknown,
35 SPV_OPCODE_FLAGS_NONE,
36 0,
37 {SPV_OPERAND_TYPE_NONE}},
38 {"ESSL",
39 SourceLanguageESSL,
40 SPV_OPCODE_FLAGS_NONE,
41 0,
42 {SPV_OPERAND_TYPE_NONE}},
43 {"GLSL",
44 SourceLanguageGLSL,
45 SPV_OPCODE_FLAGS_NONE,
46 0,
47 {SPV_OPERAND_TYPE_NONE}},
48 {"OpenCL",
49 SourceLanguageOpenCL,
50 SPV_OPCODE_FLAGS_NONE,
51 0,
52 {SPV_OPERAND_TYPE_NONE}},
53};
54
55static const spv_operand_desc_t executionModelEntries[] = {
56 {"Vertex",
57 ExecutionModelVertex,
58 SPV_OPCODE_FLAGS_CAPABILITIES,
59 CapabilityShader,
60 {SPV_OPERAND_TYPE_NONE}},
61 {"TessellationControl",
62 ExecutionModelTessellationControl,
63 SPV_OPCODE_FLAGS_CAPABILITIES,
64 CapabilityTessellation,
65 {SPV_OPERAND_TYPE_NONE}},
66 {"TessellationEvaluation",
67 ExecutionModelTessellationEvaluation,
68 SPV_OPCODE_FLAGS_CAPABILITIES,
69 CapabilityTessellation,
70 {SPV_OPERAND_TYPE_NONE}},
71 {"Geometry",
72 ExecutionModelGeometry,
73 SPV_OPCODE_FLAGS_CAPABILITIES,
74 CapabilityGeometry,
75 {SPV_OPERAND_TYPE_NONE}},
76 {"Fragment",
77 ExecutionModelFragment,
78 SPV_OPCODE_FLAGS_CAPABILITIES,
79 CapabilityShader,
80 {SPV_OPERAND_TYPE_NONE}},
81 {"GLCompute",
82 ExecutionModelGLCompute,
83 SPV_OPCODE_FLAGS_CAPABILITIES,
84 CapabilityShader,
85 {SPV_OPERAND_TYPE_NONE}},
86 {"Kernel",
87 ExecutionModelKernel,
88 SPV_OPCODE_FLAGS_CAPABILITIES,
89 CapabilityKernel,
90 {SPV_OPERAND_TYPE_NONE}},
91};
92
93static const spv_operand_desc_t addressingModelEntries[] = {
94 {"Logical",
95 AddressingModelLogical,
96 SPV_OPCODE_FLAGS_NONE,
97 0,
98 {SPV_OPERAND_TYPE_NONE}},
99 {"Physical32",
100 AddressingModelPhysical32,
101 SPV_OPCODE_FLAGS_CAPABILITIES,
102 CapabilityAddresses,
103 {SPV_OPERAND_TYPE_NONE}},
104 {"Physical64",
105 AddressingModelPhysical64,
106 SPV_OPCODE_FLAGS_CAPABILITIES,
107 CapabilityAddresses,
108 {SPV_OPERAND_TYPE_NONE}},
109};
110
111static const spv_operand_desc_t memoryModelEntries[] = {
112 {"Simple",
113 MemoryModelSimple,
114 SPV_OPCODE_FLAGS_CAPABILITIES,
115 CapabilityShader,
116 {SPV_OPERAND_TYPE_NONE}},
117 {"GLSL450",
118 MemoryModelGLSL450,
119 SPV_OPCODE_FLAGS_CAPABILITIES,
120 CapabilityShader,
121 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400122 {"OpenCL",
123 MemoryModelOpenCL,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100124 SPV_OPCODE_FLAGS_CAPABILITIES,
125 CapabilityKernel,
126 {SPV_OPERAND_TYPE_NONE}},
127};
128
129static const spv_operand_desc_t executionModeEntries[] = {
130 {"Invocations",
131 ExecutionModeInvocations,
132 SPV_OPCODE_FLAGS_CAPABILITIES,
133 CapabilityGeometry,
134 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
135 {"SpacingEqual",
136 ExecutionModeSpacingEqual,
137 SPV_OPCODE_FLAGS_CAPABILITIES,
138 CapabilityTessellation,
139 {SPV_OPERAND_TYPE_NONE}},
140 {"SpacingFractionalEven",
141 ExecutionModeSpacingFractionalEven,
142 SPV_OPCODE_FLAGS_CAPABILITIES,
143 CapabilityTessellation,
144 {SPV_OPERAND_TYPE_NONE}},
145 {"SpacingFractionalOdd",
146 ExecutionModeSpacingFractionalOdd,
147 SPV_OPCODE_FLAGS_CAPABILITIES,
148 CapabilityTessellation,
149 {SPV_OPERAND_TYPE_NONE}},
150 {"VertexOrderCw",
151 ExecutionModeVertexOrderCw,
152 SPV_OPCODE_FLAGS_CAPABILITIES,
153 CapabilityTessellation,
154 {SPV_OPERAND_TYPE_NONE}},
155 {"VertexOrderCcw",
156 ExecutionModeVertexOrderCcw,
157 SPV_OPCODE_FLAGS_CAPABILITIES,
158 CapabilityTessellation,
159 {SPV_OPERAND_TYPE_NONE}},
160 {"PixelCenterInteger",
161 ExecutionModePixelCenterInteger,
162 SPV_OPCODE_FLAGS_CAPABILITIES,
163 CapabilityShader,
164 {SPV_OPERAND_TYPE_NONE}},
165 {"OriginUpperLeft",
166 ExecutionModeOriginUpperLeft,
167 SPV_OPCODE_FLAGS_CAPABILITIES,
168 CapabilityShader,
169 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400170 {
171 "OriginLowerLeft",
172 ExecutionModeOriginLowerLeft,
173 SPV_OPCODE_FLAGS_CAPABILITIES,
174 CapabilityShader,
175 {SPV_OPERAND_TYPE_NONE},
176 },
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100177 {"EarlyFragmentTests",
178 ExecutionModeEarlyFragmentTests,
179 SPV_OPCODE_FLAGS_CAPABILITIES,
180 CapabilityShader,
181 {SPV_OPERAND_TYPE_NONE}},
182 {"PointMode",
183 ExecutionModePointMode,
184 SPV_OPCODE_FLAGS_CAPABILITIES,
185 CapabilityTessellation,
186 {SPV_OPERAND_TYPE_NONE}},
187 {"Xfb",
188 ExecutionModeXfb,
189 SPV_OPCODE_FLAGS_CAPABILITIES,
190 CapabilityShader,
191 {SPV_OPERAND_TYPE_NONE}},
192 {"DepthReplacing",
193 ExecutionModeDepthReplacing,
194 SPV_OPCODE_FLAGS_CAPABILITIES,
195 CapabilityShader,
196 {SPV_OPERAND_TYPE_NONE}},
197 {"DepthAny",
198 ExecutionModeDepthAny,
199 SPV_OPCODE_FLAGS_CAPABILITIES,
200 CapabilityShader,
201 {SPV_OPERAND_TYPE_NONE}},
202 {"DepthGreater",
203 ExecutionModeDepthGreater,
204 SPV_OPCODE_FLAGS_CAPABILITIES,
205 CapabilityShader,
206 {SPV_OPERAND_TYPE_NONE}},
207 {"DepthLess",
208 ExecutionModeDepthLess,
209 SPV_OPCODE_FLAGS_CAPABILITIES,
210 CapabilityShader,
211 {SPV_OPERAND_TYPE_NONE}},
212 {"DepthUnchanged",
213 ExecutionModeDepthUnchanged,
214 SPV_OPCODE_FLAGS_CAPABILITIES,
215 CapabilityShader,
216 {SPV_OPERAND_TYPE_NONE}},
217 {"LocalSize",
218 ExecutionModeLocalSize,
219 SPV_OPCODE_FLAGS_NONE,
220 0,
221 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_LITERAL_NUMBER,
222 SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
223 {"LocalSizeHint",
224 ExecutionModeLocalSizeHint,
225 SPV_OPCODE_FLAGS_CAPABILITIES,
226 CapabilityKernel,
227 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_LITERAL_NUMBER,
228 SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
229 {"InputPoints",
230 ExecutionModeInputPoints,
231 SPV_OPCODE_FLAGS_CAPABILITIES,
232 CapabilityGeometry,
233 {SPV_OPERAND_TYPE_NONE}},
234 {"InputLines",
235 ExecutionModeInputLines,
236 SPV_OPCODE_FLAGS_CAPABILITIES,
237 CapabilityGeometry,
238 {SPV_OPERAND_TYPE_NONE}},
239 {"InputLinesAdjacency",
240 ExecutionModeInputLinesAdjacency,
241 SPV_OPCODE_FLAGS_CAPABILITIES,
242 CapabilityGeometry,
243 {SPV_OPERAND_TYPE_NONE}},
244 {"InputTriangles",
245 ExecutionModeInputTriangles,
246 SPV_OPCODE_FLAGS_CAPABILITIES,
247 CapabilityGeometry | CapabilityTessellation,
248 {SPV_OPERAND_TYPE_NONE}},
249 {"InputTrianglesAdjacency",
250 ExecutionModeInputTrianglesAdjacency,
251 SPV_OPCODE_FLAGS_CAPABILITIES,
252 CapabilityGeometry,
253 {SPV_OPERAND_TYPE_NONE}},
254 {"InputQuads",
255 ExecutionModeInputQuads,
256 SPV_OPCODE_FLAGS_CAPABILITIES,
257 CapabilityTessellation,
258 {SPV_OPERAND_TYPE_NONE}},
259 {"InputIsolines",
260 ExecutionModeInputIsolines,
261 SPV_OPCODE_FLAGS_CAPABILITIES,
262 CapabilityTessellation,
263 {SPV_OPERAND_TYPE_NONE}},
264 {"OutputVertices",
265 ExecutionModeOutputVertices,
266 SPV_OPCODE_FLAGS_CAPABILITIES,
267 CapabilityGeometry | CapabilityTessellation,
268 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
269 {"OutputPoints",
270 ExecutionModeOutputPoints,
271 SPV_OPCODE_FLAGS_CAPABILITIES,
272 CapabilityGeometry,
273 {SPV_OPERAND_TYPE_NONE}},
274 {"OutputLineStrip",
275 ExecutionModeOutputLineStrip,
276 SPV_OPCODE_FLAGS_CAPABILITIES,
277 CapabilityGeometry,
278 {SPV_OPERAND_TYPE_NONE}},
279 {"OutputTriangleStrip",
280 ExecutionModeOutputTriangleStrip,
281 SPV_OPCODE_FLAGS_CAPABILITIES,
282 CapabilityGeometry,
283 {SPV_OPERAND_TYPE_NONE}},
284 {"VecTypeHint",
285 ExecutionModeVecTypeHint,
286 SPV_OPCODE_FLAGS_CAPABILITIES,
287 CapabilityKernel,
288 {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}},
289 {"ContractionOff",
290 ExecutionModeContractionOff,
291 SPV_OPCODE_FLAGS_CAPABILITIES,
292 CapabilityKernel,
293 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100294};
295
296static const spv_operand_desc_t storageClassEntries[] = {
David Neto5494dd42015-09-15 16:41:38 -0400297 // TODO(dneto): There are more storage classes in Rev32 and later.
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100298 {"UniformConstant",
299 StorageClassUniformConstant,
300 SPV_OPCODE_FLAGS_NONE,
301 0,
302 {SPV_OPERAND_TYPE_NONE}},
303 {"Input",
304 StorageClassInput,
305 SPV_OPCODE_FLAGS_CAPABILITIES,
306 CapabilityShader,
307 {SPV_OPERAND_TYPE_NONE}},
308 {"Uniform",
309 StorageClassUniform,
310 SPV_OPCODE_FLAGS_CAPABILITIES,
311 CapabilityShader,
312 {SPV_OPERAND_TYPE_NONE}},
313 {"Output",
314 StorageClassOutput,
315 SPV_OPCODE_FLAGS_CAPABILITIES,
316 CapabilityShader,
317 {SPV_OPERAND_TYPE_NONE}},
318 {"WorkgroupLocal",
319 StorageClassWorkgroupLocal,
320 SPV_OPCODE_FLAGS_NONE,
321 0,
322 {SPV_OPERAND_TYPE_NONE}},
323 {"WorkgroupGlobal",
324 StorageClassWorkgroupGlobal,
325 SPV_OPCODE_FLAGS_NONE,
326 0,
327 {SPV_OPERAND_TYPE_NONE}},
328 {"PrivateGlobal",
329 StorageClassPrivateGlobal,
330 SPV_OPCODE_FLAGS_CAPABILITIES,
331 CapabilityShader,
332 {SPV_OPERAND_TYPE_NONE}},
333 {"Function",
334 StorageClassFunction,
335 SPV_OPCODE_FLAGS_NONE,
336 0,
337 {SPV_OPERAND_TYPE_NONE}},
338 {"Generic",
339 StorageClassGeneric,
340 SPV_OPCODE_FLAGS_CAPABILITIES,
341 CapabilityKernel,
342 {SPV_OPERAND_TYPE_NONE}},
343 {"AtomicCounter",
344 StorageClassAtomicCounter,
345 SPV_OPCODE_FLAGS_CAPABILITIES,
346 CapabilityShader,
347 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400348 {"Image",
349 StorageClassImage,
350 SPV_OPCODE_FLAGS_NONE,
351 0,
352 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100353};
354
355static const spv_operand_desc_t dimensionalityEntries[] = {
356 {"1D", Dim1D, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_NONE}},
357 {"2D", Dim2D, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_NONE}},
358 {"3D", Dim3D, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_NONE}},
359 {"Cube",
360 DimCube,
361 SPV_OPCODE_FLAGS_CAPABILITIES,
362 CapabilityShader,
363 {SPV_OPERAND_TYPE_NONE}},
364 {"Rect",
365 DimRect,
366 SPV_OPCODE_FLAGS_CAPABILITIES,
367 CapabilityShader,
368 {SPV_OPERAND_TYPE_NONE}},
369 {"Buffer", DimBuffer, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_NONE}},
370};
371
372static const spv_operand_desc_t samplerAddressingModeEntries[] = {
373 {"None",
374 SamplerAddressingModeNone,
375 SPV_OPCODE_FLAGS_CAPABILITIES,
376 CapabilityKernel,
377 {SPV_OPERAND_TYPE_NONE}},
378 {"ClampToEdge",
379 SamplerAddressingModeClampToEdge,
380 SPV_OPCODE_FLAGS_CAPABILITIES,
381 CapabilityKernel,
382 {SPV_OPERAND_TYPE_NONE}},
383 {"Clamp",
384 SamplerAddressingModeClamp,
385 SPV_OPCODE_FLAGS_CAPABILITIES,
386 CapabilityKernel,
387 {SPV_OPERAND_TYPE_NONE}},
388 {"Repeat",
389 SamplerAddressingModeRepeat,
390 SPV_OPCODE_FLAGS_CAPABILITIES,
391 CapabilityKernel,
392 {SPV_OPERAND_TYPE_NONE}},
393 {"RepeatMirrored",
394 SamplerAddressingModeRepeatMirrored,
395 SPV_OPCODE_FLAGS_CAPABILITIES,
396 CapabilityKernel,
397 {SPV_OPERAND_TYPE_NONE}},
398};
399
400static const spv_operand_desc_t samplerFilterModeEntries[] = {
401 {"Nearest",
402 SamplerFilterModeNearest,
403 SPV_OPCODE_FLAGS_CAPABILITIES,
404 CapabilityKernel,
405 {SPV_OPERAND_TYPE_NONE}},
406 {"Linear",
407 SamplerFilterModeLinear,
408 SPV_OPCODE_FLAGS_CAPABILITIES,
409 CapabilityKernel,
410 {SPV_OPERAND_TYPE_NONE}},
411};
412
413static const spv_operand_desc_t fpFastMathModeEntries[] = {
414 {"None",
415 FPFastMathModeMaskNone,
416 SPV_OPCODE_FLAGS_NONE,
417 0,
418 {SPV_OPERAND_TYPE_NONE}},
419 {"NotNaN",
420 FPFastMathModeNotNaNMask,
421 SPV_OPCODE_FLAGS_CAPABILITIES,
422 CapabilityKernel,
423 {SPV_OPERAND_TYPE_NONE}},
424 {"NotInf",
425 FPFastMathModeNotInfMask,
426 SPV_OPCODE_FLAGS_CAPABILITIES,
427 CapabilityKernel,
428 {SPV_OPERAND_TYPE_NONE}},
429 {"NSZ",
430 FPFastMathModeNSZMask,
431 SPV_OPCODE_FLAGS_CAPABILITIES,
432 CapabilityKernel,
433 {SPV_OPERAND_TYPE_NONE}},
434 {"AllowRecip",
435 FPFastMathModeAllowRecipMask,
436 SPV_OPCODE_FLAGS_CAPABILITIES,
437 CapabilityKernel,
438 {SPV_OPERAND_TYPE_NONE}},
439 {"Fast",
440 FPFastMathModeFastMask,
441 SPV_OPCODE_FLAGS_CAPABILITIES,
442 CapabilityKernel,
443 {SPV_OPERAND_TYPE_NONE}},
444};
445
446static const spv_operand_desc_t fpRoundingModeEntries[] = {
447 {"RTE",
448 FPRoundingModeRTE,
449 SPV_OPCODE_FLAGS_CAPABILITIES,
450 CapabilityKernel,
451 {SPV_OPERAND_TYPE_NONE}},
452 {"RTZ",
453 FPRoundingModeRTZ,
454 SPV_OPCODE_FLAGS_CAPABILITIES,
455 CapabilityKernel,
456 {SPV_OPERAND_TYPE_NONE}},
457 {"RTP",
458 FPRoundingModeRTP,
459 SPV_OPCODE_FLAGS_CAPABILITIES,
460 CapabilityKernel,
461 {SPV_OPERAND_TYPE_NONE}},
462 {"RTN",
463 FPRoundingModeRTN,
464 SPV_OPCODE_FLAGS_CAPABILITIES,
465 CapabilityKernel,
466 {SPV_OPERAND_TYPE_NONE}},
467};
468
469static const spv_operand_desc_t linkageTypeEntries[] = {
470 {"Export",
471 LinkageTypeExport,
472 SPV_OPCODE_FLAGS_CAPABILITIES,
473 CapabilityLinkage,
474 {SPV_OPERAND_TYPE_NONE}},
475 {"Import",
476 LinkageTypeImport,
477 SPV_OPCODE_FLAGS_CAPABILITIES,
478 CapabilityLinkage,
479 {SPV_OPERAND_TYPE_NONE}},
480};
481
482static const spv_operand_desc_t accessQualifierEntries[] = {
483 {"ReadOnly",
484 AccessQualifierReadOnly,
485 SPV_OPCODE_FLAGS_CAPABILITIES,
486 CapabilityKernel,
487 {SPV_OPERAND_TYPE_NONE}},
488 {"WriteOnly",
489 AccessQualifierWriteOnly,
490 SPV_OPCODE_FLAGS_CAPABILITIES,
491 CapabilityKernel,
492 {SPV_OPERAND_TYPE_NONE}},
493 {"ReadWrite",
494 AccessQualifierReadWrite,
495 SPV_OPCODE_FLAGS_CAPABILITIES,
496 CapabilityKernel,
497 {SPV_OPERAND_TYPE_NONE}},
498};
499
500static const spv_operand_desc_t functionParameterAttributeEntries[] = {
501 {"Zext",
502 FunctionParameterAttributeZext,
503 SPV_OPCODE_FLAGS_CAPABILITIES,
504 CapabilityKernel,
505 {SPV_OPERAND_TYPE_NONE}},
506 {"Sext",
507 FunctionParameterAttributeSext,
508 SPV_OPCODE_FLAGS_CAPABILITIES,
509 CapabilityKernel,
510 {SPV_OPERAND_TYPE_NONE}},
511 {"ByVal",
512 FunctionParameterAttributeByVal,
513 SPV_OPCODE_FLAGS_CAPABILITIES,
514 CapabilityKernel,
515 {SPV_OPERAND_TYPE_NONE}},
516 {"Sret",
517 FunctionParameterAttributeSret,
518 SPV_OPCODE_FLAGS_CAPABILITIES,
519 CapabilityKernel,
520 {SPV_OPERAND_TYPE_NONE}},
521 {"NoAlias",
522 FunctionParameterAttributeNoAlias,
523 SPV_OPCODE_FLAGS_CAPABILITIES,
524 CapabilityKernel,
525 {SPV_OPERAND_TYPE_NONE}},
David Neto37547b22015-09-10 13:23:11 -0400526 {"NoCapture",
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100527 FunctionParameterAttributeNoCapture,
528 SPV_OPCODE_FLAGS_CAPABILITIES,
529 CapabilityKernel,
530 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100531 {"NoWrite",
532 FunctionParameterAttributeNoWrite,
533 SPV_OPCODE_FLAGS_CAPABILITIES,
534 CapabilityKernel,
535 {SPV_OPERAND_TYPE_NONE}},
536 {"NoReadWrite",
537 FunctionParameterAttributeNoReadWrite,
538 SPV_OPCODE_FLAGS_CAPABILITIES,
539 CapabilityKernel,
540 {SPV_OPERAND_TYPE_NONE}},
541};
542
543static const spv_operand_desc_t decorationEntries[] = {
Lei Zhang604e5ce2015-08-14 14:46:43 -0400544 {"RelaxedPrecision",
545 DecorationRelaxedPrecision,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100546 SPV_OPCODE_FLAGS_CAPABILITIES,
547 CapabilityShader,
548 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400549 {
550 "SpecId",
551 DecorationSpecId,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100552 SPV_OPCODE_FLAGS_CAPABILITIES,
553 CapabilityShader,
Lei Zhang604e5ce2015-08-14 14:46:43 -0400554 {SPV_OPERAND_TYPE_LITERAL_NUMBER},
555 },
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100556 {"Block",
557 DecorationBlock,
558 SPV_OPCODE_FLAGS_CAPABILITIES,
559 CapabilityShader,
560 {SPV_OPERAND_TYPE_NONE}},
561 {"BufferBlock",
562 DecorationBufferBlock,
563 SPV_OPCODE_FLAGS_CAPABILITIES,
564 CapabilityShader,
565 {SPV_OPERAND_TYPE_NONE}},
566 {"RowMajor",
567 DecorationRowMajor,
568 SPV_OPCODE_FLAGS_CAPABILITIES,
569 CapabilityMatrix,
570 {SPV_OPERAND_TYPE_NONE}},
571 {"ColMajor",
572 DecorationColMajor,
573 SPV_OPCODE_FLAGS_CAPABILITIES,
574 CapabilityMatrix,
575 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400576 {"ArrayStride",
577 DecorationArrayStride,
578 SPV_OPCODE_FLAGS_CAPABILITIES,
579 CapabilityShader,
580 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
581 {"MatrixStride",
582 DecorationMatrixStride,
583 SPV_OPCODE_FLAGS_CAPABILITIES,
584 CapabilityShader,
585 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100586 {"GLSLShared",
587 DecorationGLSLShared,
588 SPV_OPCODE_FLAGS_CAPABILITIES,
589 CapabilityShader,
590 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100591 {"GLSLPacked",
592 DecorationGLSLPacked,
593 SPV_OPCODE_FLAGS_CAPABILITIES,
594 CapabilityShader,
595 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400596 {"CPacked",
597 DecorationCPacked,
598 SPV_OPCODE_FLAGS_CAPABILITIES,
599 CapabilityKernel,
600 {SPV_OPERAND_TYPE_NONE}},
601 {"BuiltIn",
602 DecorationBuiltIn,
603 SPV_OPCODE_FLAGS_CAPABILITIES,
604 CapabilityShader,
605 {SPV_OPERAND_TYPE_BUILT_IN, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100606 {"Smooth",
607 DecorationSmooth,
608 SPV_OPCODE_FLAGS_CAPABILITIES,
609 CapabilityShader,
610 {SPV_OPERAND_TYPE_NONE}},
611 {"Noperspective",
612 DecorationNoperspective,
613 SPV_OPCODE_FLAGS_CAPABILITIES,
614 CapabilityShader,
615 {SPV_OPERAND_TYPE_NONE}},
616 {"Flat",
617 DecorationFlat,
618 SPV_OPCODE_FLAGS_CAPABILITIES,
619 CapabilityShader,
620 {SPV_OPERAND_TYPE_NONE}},
621 {"Patch",
622 DecorationPatch,
623 SPV_OPCODE_FLAGS_CAPABILITIES,
624 CapabilityTessellation,
625 {SPV_OPERAND_TYPE_NONE}},
626 {"Centroid",
627 DecorationCentroid,
628 SPV_OPCODE_FLAGS_CAPABILITIES,
629 CapabilityShader,
630 {SPV_OPERAND_TYPE_NONE}},
631 {"Sample",
632 DecorationSample,
633 SPV_OPCODE_FLAGS_CAPABILITIES,
634 CapabilityShader,
635 {SPV_OPERAND_TYPE_NONE}},
636 {"Invariant",
637 DecorationInvariant,
638 SPV_OPCODE_FLAGS_CAPABILITIES,
639 CapabilityShader,
640 {SPV_OPERAND_TYPE_NONE}},
641 {"Restrict",
642 DecorationRestrict,
643 SPV_OPCODE_FLAGS_NONE,
644 0,
645 {SPV_OPERAND_TYPE_NONE}},
646 {"Aliased",
647 DecorationAliased,
648 SPV_OPCODE_FLAGS_NONE,
649 0,
650 {SPV_OPERAND_TYPE_NONE}},
651 {"Volatile",
652 DecorationVolatile,
653 SPV_OPCODE_FLAGS_NONE,
654 0,
655 {SPV_OPERAND_TYPE_NONE}},
656 {"Constant",
657 DecorationConstant,
658 SPV_OPCODE_FLAGS_CAPABILITIES,
659 CapabilityKernel,
660 {SPV_OPERAND_TYPE_NONE}},
661 {"Coherent",
662 DecorationCoherent,
663 SPV_OPCODE_FLAGS_NONE,
664 0,
665 {SPV_OPERAND_TYPE_NONE}},
666 {"Nonwritable",
667 DecorationNonwritable,
668 SPV_OPCODE_FLAGS_NONE,
669 0,
670 {SPV_OPERAND_TYPE_NONE}},
671 {"Nonreadable",
672 DecorationNonreadable,
673 SPV_OPCODE_FLAGS_NONE,
674 0,
675 {SPV_OPERAND_TYPE_NONE}},
676 {"Uniform",
677 DecorationUniform,
678 SPV_OPCODE_FLAGS_CAPABILITIES,
679 CapabilityShader,
680 {SPV_OPERAND_TYPE_NONE}},
681 {"NoStaticUse",
682 DecorationNoStaticUse,
683 SPV_OPCODE_FLAGS_NONE,
684 0,
685 {SPV_OPERAND_TYPE_NONE}},
David Neto37547b22015-09-10 13:23:11 -0400686 {"SaturatedConversion",
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100687 DecorationSaturatedConversion,
688 SPV_OPCODE_FLAGS_CAPABILITIES,
689 CapabilityKernel,
690 {SPV_OPERAND_TYPE_NONE}},
691 {"Stream",
692 DecorationStream,
693 SPV_OPCODE_FLAGS_CAPABILITIES,
694 CapabilityGeometry,
695 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
696 {"Location",
697 DecorationLocation,
698 SPV_OPCODE_FLAGS_CAPABILITIES,
699 CapabilityShader,
700 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
701 {"Component",
702 DecorationComponent,
703 SPV_OPCODE_FLAGS_CAPABILITIES,
704 CapabilityShader,
705 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
706 {"Index",
707 DecorationIndex,
708 SPV_OPCODE_FLAGS_CAPABILITIES,
709 CapabilityShader,
710 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
711 {"Binding",
712 DecorationBinding,
713 SPV_OPCODE_FLAGS_CAPABILITIES,
714 CapabilityShader,
715 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
716 {"DescriptorSet",
717 DecorationDescriptorSet,
718 SPV_OPCODE_FLAGS_CAPABILITIES,
719 CapabilityShader,
720 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
721 {"Offset",
722 DecorationOffset,
723 SPV_OPCODE_FLAGS_NONE,
724 0,
725 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100726 {"XfbBuffer",
727 DecorationXfbBuffer,
728 SPV_OPCODE_FLAGS_CAPABILITIES,
729 CapabilityShader,
730 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400731 {"XfbStride",
732 DecorationXfbStride,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100733 SPV_OPCODE_FLAGS_CAPABILITIES,
734 CapabilityShader,
735 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100736 {"FuncParamAttr",
737 DecorationFuncParamAttr,
738 SPV_OPCODE_FLAGS_CAPABILITIES,
739 CapabilityKernel,
740 {SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE, SPV_OPERAND_TYPE_NONE}},
741 {"FPRoundingMode",
742 DecorationFPRoundingMode,
743 SPV_OPCODE_FLAGS_CAPABILITIES,
744 CapabilityKernel,
745 {SPV_OPERAND_TYPE_FP_ROUNDING_MODE, SPV_OPERAND_TYPE_NONE}},
746 {"FPFastMathMode",
David Neto37547b22015-09-10 13:23:11 -0400747 DecorationFPFastMathMode,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100748 SPV_OPCODE_FLAGS_CAPABILITIES,
749 CapabilityKernel,
750 {SPV_OPERAND_TYPE_FP_FAST_MATH_MODE, SPV_OPERAND_TYPE_NONE}},
751 {"LinkageAttributes",
752 DecorationLinkageAttributes,
753 SPV_OPCODE_FLAGS_CAPABILITIES,
754 CapabilityLinkage,
David Neto55bdfcb2015-09-10 15:51:57 -0400755 {SPV_OPERAND_TYPE_LITERAL_STRING, SPV_OPERAND_TYPE_LINKAGE_TYPE, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100756};
757
758static const spv_operand_desc_t builtInEntries[] = {
759 {"Position",
760 BuiltInPosition,
761 SPV_OPCODE_FLAGS_CAPABILITIES,
762 CapabilityShader,
763 {SPV_OPERAND_TYPE_NONE}},
764 {"PointSize",
765 BuiltInPointSize,
766 SPV_OPCODE_FLAGS_CAPABILITIES,
767 CapabilityShader,
768 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100769 {"ClipDistance",
770 BuiltInClipDistance,
771 SPV_OPCODE_FLAGS_CAPABILITIES,
772 CapabilityShader,
773 {SPV_OPERAND_TYPE_NONE}},
774 {"CullDistance",
775 BuiltInCullDistance,
776 SPV_OPCODE_FLAGS_CAPABILITIES,
777 CapabilityShader,
778 {SPV_OPERAND_TYPE_NONE}},
779 {"VertexId",
780 BuiltInVertexId,
781 SPV_OPCODE_FLAGS_CAPABILITIES,
782 CapabilityShader,
783 {SPV_OPERAND_TYPE_NONE}},
784 {"InstanceId",
785 BuiltInInstanceId,
786 SPV_OPCODE_FLAGS_CAPABILITIES,
787 CapabilityShader,
788 {SPV_OPERAND_TYPE_NONE}},
789 {"PrimitiveId",
790 BuiltInPrimitiveId,
791 SPV_OPCODE_FLAGS_CAPABILITIES,
792 CapabilityGeometry | CapabilityTessellation,
793 {SPV_OPERAND_TYPE_NONE}},
794 {"InvocationId",
795 BuiltInInvocationId,
796 SPV_OPCODE_FLAGS_CAPABILITIES,
797 CapabilityGeometry | CapabilityTessellation,
798 {SPV_OPERAND_TYPE_NONE}},
799 {"Layer",
800 BuiltInLayer,
801 SPV_OPCODE_FLAGS_CAPABILITIES,
802 CapabilityGeometry,
803 {SPV_OPERAND_TYPE_NONE}},
804 {"ViewportIndex",
805 BuiltInViewportIndex,
806 SPV_OPCODE_FLAGS_CAPABILITIES,
807 CapabilityGeometry,
808 {SPV_OPERAND_TYPE_NONE}},
809 {"TessLevelOuter",
810 BuiltInTessLevelOuter,
811 SPV_OPCODE_FLAGS_CAPABILITIES,
812 CapabilityTessellation,
813 {SPV_OPERAND_TYPE_NONE}},
814 {"TessLevelInner",
815 BuiltInTessLevelInner,
816 SPV_OPCODE_FLAGS_CAPABILITIES,
817 CapabilityTessellation,
818 {SPV_OPERAND_TYPE_NONE}},
819 {"TessCoord",
820 BuiltInTessCoord,
821 SPV_OPCODE_FLAGS_CAPABILITIES,
822 CapabilityTessellation,
823 {SPV_OPERAND_TYPE_NONE}},
824 {"PatchVertices",
825 BuiltInPatchVertices,
826 SPV_OPCODE_FLAGS_CAPABILITIES,
827 CapabilityTessellation,
828 {SPV_OPERAND_TYPE_NONE}},
829 {"FragCoord",
830 BuiltInFragCoord,
831 SPV_OPCODE_FLAGS_CAPABILITIES,
832 CapabilityShader,
833 {SPV_OPERAND_TYPE_NONE}},
834 {"PointCoord",
835 BuiltInPointCoord,
836 SPV_OPCODE_FLAGS_CAPABILITIES,
837 CapabilityShader,
838 {SPV_OPERAND_TYPE_NONE}},
839 {"FrontFacing",
840 BuiltInFrontFacing,
841 SPV_OPCODE_FLAGS_CAPABILITIES,
842 CapabilityShader,
843 {SPV_OPERAND_TYPE_NONE}},
844 {"SampleId",
845 BuiltInSampleId,
846 SPV_OPCODE_FLAGS_CAPABILITIES,
847 CapabilityShader,
848 {SPV_OPERAND_TYPE_NONE}},
849 {"SamplePosition",
850 BuiltInSamplePosition,
851 SPV_OPCODE_FLAGS_CAPABILITIES,
852 CapabilityShader,
853 {SPV_OPERAND_TYPE_NONE}},
854 {"SampleMask",
855 BuiltInSampleMask,
856 SPV_OPCODE_FLAGS_CAPABILITIES,
857 CapabilityShader,
858 {SPV_OPERAND_TYPE_NONE}},
859 {"FragColor",
860 BuiltInFragColor,
861 SPV_OPCODE_FLAGS_CAPABILITIES,
862 CapabilityShader,
863 {SPV_OPERAND_TYPE_NONE}},
864 {"FragDepth",
865 BuiltInFragDepth,
866 SPV_OPCODE_FLAGS_CAPABILITIES,
867 CapabilityShader,
868 {SPV_OPERAND_TYPE_NONE}},
869 {"HelperInvocation",
870 BuiltInHelperInvocation,
871 SPV_OPCODE_FLAGS_CAPABILITIES,
872 CapabilityShader,
873 {SPV_OPERAND_TYPE_NONE}},
874 {"NumWorkgroups",
875 BuiltInNumWorkgroups,
876 SPV_OPCODE_FLAGS_NONE,
877 0,
878 {SPV_OPERAND_TYPE_NONE}},
879 {"WorkgroupSize",
880 BuiltInWorkgroupSize,
881 SPV_OPCODE_FLAGS_NONE,
882 0,
883 {SPV_OPERAND_TYPE_NONE}},
884 {"WorkgroupId",
885 BuiltInWorkgroupId,
886 SPV_OPCODE_FLAGS_NONE,
887 0,
888 {SPV_OPERAND_TYPE_NONE}},
889 {"LocalInvocationId",
890 BuiltInLocalInvocationId,
891 SPV_OPCODE_FLAGS_NONE,
892 0,
893 {SPV_OPERAND_TYPE_NONE}},
894 {"GlobalInvocationId",
895 BuiltInGlobalInvocationId,
896 SPV_OPCODE_FLAGS_NONE,
897 0,
898 {SPV_OPERAND_TYPE_NONE}},
899 {"LocalInvocationIndex",
David Neto37547b22015-09-10 13:23:11 -0400900 BuiltInLocalInvocationIndex,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100901 SPV_OPCODE_FLAGS_CAPABILITIES,
902 CapabilityShader,
903 {SPV_OPERAND_TYPE_NONE}},
904 {"WorkDim",
905 BuiltInWorkDim,
906 SPV_OPCODE_FLAGS_CAPABILITIES,
907 CapabilityKernel,
908 {SPV_OPERAND_TYPE_NONE}},
909 {"GlobalSize",
910 BuiltInGlobalSize,
911 SPV_OPCODE_FLAGS_CAPABILITIES,
912 CapabilityKernel,
913 {SPV_OPERAND_TYPE_NONE}},
914 {"EnqueuedWorkgroupSize",
915 BuiltInEnqueuedWorkgroupSize,
916 SPV_OPCODE_FLAGS_CAPABILITIES,
917 CapabilityKernel,
918 {SPV_OPERAND_TYPE_NONE}},
919 {"GlobalOffset",
920 BuiltInGlobalOffset,
921 SPV_OPCODE_FLAGS_CAPABILITIES,
922 CapabilityKernel,
923 {SPV_OPERAND_TYPE_NONE}},
924 {"GlobalLinearId",
925 BuiltInGlobalLinearId,
926 SPV_OPCODE_FLAGS_CAPABILITIES,
927 CapabilityKernel,
928 {SPV_OPERAND_TYPE_NONE}},
929 {"WorkgroupLinearId",
930 BuiltInWorkgroupLinearId,
931 SPV_OPCODE_FLAGS_CAPABILITIES,
932 CapabilityKernel,
933 {SPV_OPERAND_TYPE_NONE}},
934 {"SubgroupSize",
935 BuiltInSubgroupSize,
936 SPV_OPCODE_FLAGS_CAPABILITIES,
937 CapabilityKernel,
938 {SPV_OPERAND_TYPE_NONE}},
939 {"SubgroupMaxSize",
940 BuiltInSubgroupMaxSize,
941 SPV_OPCODE_FLAGS_CAPABILITIES,
942 CapabilityKernel,
943 {SPV_OPERAND_TYPE_NONE}},
944 {"NumSubgroups",
945 BuiltInNumSubgroups,
946 SPV_OPCODE_FLAGS_CAPABILITIES,
947 CapabilityKernel,
948 {SPV_OPERAND_TYPE_NONE}},
949 {"NumEnqueuedSubgroups",
950 BuiltInNumEnqueuedSubgroups,
951 SPV_OPCODE_FLAGS_CAPABILITIES,
952 CapabilityKernel,
953 {SPV_OPERAND_TYPE_NONE}},
954 {"SubgroupId",
David Neto37547b22015-09-10 13:23:11 -0400955 BuiltInSubgroupId,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100956 SPV_OPCODE_FLAGS_CAPABILITIES,
957 CapabilityKernel,
958 {SPV_OPERAND_TYPE_NONE}},
959 {"SubgroupLocalInvocationId",
960 BuiltInSubgroupLocalInvocationId,
961 SPV_OPCODE_FLAGS_CAPABILITIES,
962 CapabilityKernel,
963 {SPV_OPERAND_TYPE_NONE}},
964};
965
966static const spv_operand_desc_t selectionControlEntries[] = {
967 {"None",
968 SelectionControlMaskNone,
969 SPV_OPCODE_FLAGS_NONE,
970 0,
971 {SPV_OPERAND_TYPE_NONE}},
972 {"Flatten",
973 SelectionControlFlattenMask,
974 SPV_OPCODE_FLAGS_NONE,
975 0,
976 {SPV_OPERAND_TYPE_NONE}},
977 {"DontFlatten",
978 SelectionControlDontFlattenMask,
979 SPV_OPCODE_FLAGS_NONE,
980 0,
981 {SPV_OPERAND_TYPE_NONE}},
982};
983
984static const spv_operand_desc_t loopControlEntries[] = {
985 {"None",
986 LoopControlMaskNone,
987 SPV_OPCODE_FLAGS_NONE,
988 0,
989 {SPV_OPERAND_TYPE_NONE}},
990 {"Unroll",
991 LoopControlUnrollMask,
992 SPV_OPCODE_FLAGS_NONE,
993 0,
994 {SPV_OPERAND_TYPE_NONE}},
995 {"DontUnroll",
996 LoopControlDontUnrollMask,
997 SPV_OPCODE_FLAGS_NONE,
998 0,
999 {SPV_OPERAND_TYPE_NONE}},
1000};
1001
1002static const spv_operand_desc_t functionControlEntries[] = {
1003 {"None",
1004 FunctionControlMaskNone,
1005 SPV_OPCODE_FLAGS_NONE,
1006 0,
1007 {SPV_OPERAND_TYPE_NONE}},
David Netof4fde6c2015-09-14 14:50:37 -04001008 {"Inline",
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001009 FunctionControlInlineMask,
1010 SPV_OPCODE_FLAGS_NONE,
1011 0,
1012 {SPV_OPERAND_TYPE_NONE}},
1013 {"DontInline",
1014 FunctionControlDontInlineMask,
1015 SPV_OPCODE_FLAGS_NONE,
1016 0,
1017 {SPV_OPERAND_TYPE_NONE}},
1018 {"Pure",
1019 FunctionControlPureMask,
1020 SPV_OPCODE_FLAGS_NONE,
1021 0,
1022 {SPV_OPERAND_TYPE_NONE}},
1023 {"Const",
1024 FunctionControlConstMask,
1025 SPV_OPCODE_FLAGS_NONE,
1026 0,
1027 {SPV_OPERAND_TYPE_NONE}},
1028};
1029
1030static const spv_operand_desc_t memorySemanticsEntries[] = {
1031 {"None",
1032 MemorySemanticsMaskNone,
1033 SPV_OPCODE_FLAGS_NONE,
1034 0,
1035 {SPV_OPERAND_TYPE_NONE}},
1036 {"Relaxed",
1037 MemorySemanticsRelaxedMask,
1038 SPV_OPCODE_FLAGS_NONE,
1039 0,
1040 {SPV_OPERAND_TYPE_NONE}},
1041 {"SequentiallyConsistent",
1042 MemorySemanticsSequentiallyConsistentMask,
1043 SPV_OPCODE_FLAGS_NONE,
1044 0,
1045 {SPV_OPERAND_TYPE_NONE}},
1046 {"Acquire",
1047 MemorySemanticsAcquireMask,
1048 SPV_OPCODE_FLAGS_NONE,
1049 0,
1050 {SPV_OPERAND_TYPE_NONE}},
1051 {"Release",
1052 MemorySemanticsReleaseMask,
1053 SPV_OPCODE_FLAGS_NONE,
1054 0,
1055 {SPV_OPERAND_TYPE_NONE}},
1056 {"UniformMemory",
1057 MemorySemanticsUniformMemoryMask,
1058 SPV_OPCODE_FLAGS_CAPABILITIES,
1059 CapabilityShader,
1060 {SPV_OPERAND_TYPE_NONE}},
1061 {"SubgroupMemory",
1062 MemorySemanticsSubgroupMemoryMask,
1063 SPV_OPCODE_FLAGS_NONE,
1064 0,
1065 {SPV_OPERAND_TYPE_NONE}},
1066 {"WorkgroupLocalMemory",
1067 MemorySemanticsWorkgroupLocalMemoryMask,
1068 SPV_OPCODE_FLAGS_NONE,
1069 0,
1070 {SPV_OPERAND_TYPE_NONE}},
1071 {"WorkgroupGlobalMemory",
1072 MemorySemanticsWorkgroupGlobalMemoryMask,
1073 SPV_OPCODE_FLAGS_NONE,
1074 0,
1075 {SPV_OPERAND_TYPE_NONE}},
1076 {"AtomicCounterMemory",
1077 MemorySemanticsAtomicCounterMemoryMask,
1078 SPV_OPCODE_FLAGS_CAPABILITIES,
1079 CapabilityShader,
1080 {SPV_OPERAND_TYPE_NONE}},
1081 {
1082 "ImageMemory",
1083 MemorySemanticsImageMemoryMask,
1084 SPV_OPCODE_FLAGS_NONE,
1085 0,
1086 {SPV_OPERAND_TYPE_NONE},
1087 },
1088};
1089
1090static const spv_operand_desc_t memoryAccessEntries[] = {
1091 {"None",
1092 MemoryAccessMaskNone,
1093 SPV_OPCODE_FLAGS_NONE,
1094 0,
1095 {SPV_OPERAND_TYPE_NONE}},
1096 {"Volatile",
1097 MemoryAccessVolatileMask,
1098 SPV_OPCODE_FLAGS_NONE,
1099 0,
1100 {SPV_OPERAND_TYPE_NONE}},
1101 {
1102 "Aligned",
1103 MemoryAccessAlignedMask,
1104 SPV_OPCODE_FLAGS_NONE,
1105 0,
David Neto4a291312015-09-14 15:08:48 -04001106 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001107 },
1108};
1109
1110static const spv_operand_desc_t scopeEntries[] = {
1111 {"CrossDevice",
1112 ScopeCrossDevice,
1113 SPV_OPCODE_FLAGS_NONE,
1114 0,
1115 {SPV_OPERAND_TYPE_NONE}},
1116 {"Device", ScopeDevice, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_NONE}},
1117 {"Workgroup",
1118 ScopeWorkgroup,
1119 SPV_OPCODE_FLAGS_NONE,
1120 0,
1121 {SPV_OPERAND_TYPE_NONE}},
1122 {"Subgroup",
1123 ScopeSubgroup,
1124 SPV_OPCODE_FLAGS_NONE,
1125 0,
1126 {SPV_OPERAND_TYPE_NONE}},
1127 {
1128 "Invocation",
1129 ScopeInvocation,
1130 SPV_OPCODE_FLAGS_NONE,
1131 0,
1132 {SPV_OPERAND_TYPE_NONE},
1133 },
1134};
1135
1136static const spv_operand_desc_t groupOperationEntries[] = {
1137 {"Reduce",
1138 GroupOperationReduce,
1139 SPV_OPCODE_FLAGS_CAPABILITIES,
1140 CapabilityKernel,
1141 {SPV_OPERAND_TYPE_NONE}},
1142 {"InclusiveScan",
1143 GroupOperationInclusiveScan,
1144 SPV_OPCODE_FLAGS_CAPABILITIES,
1145 CapabilityKernel,
1146 {SPV_OPERAND_TYPE_NONE}},
1147 {"ExclusiveScan",
1148 GroupOperationExclusiveScan,
1149 SPV_OPCODE_FLAGS_CAPABILITIES,
1150 CapabilityKernel,
1151 {SPV_OPERAND_TYPE_NONE}},
1152};
1153
1154static const spv_operand_desc_t kernelKernelEnqueueFlagssEntries[] = {
1155 {"NoWait",
1156 KernelEnqueueFlagsNoWait,
1157 SPV_OPCODE_FLAGS_CAPABILITIES,
1158 CapabilityKernel,
1159 {SPV_OPERAND_TYPE_NONE}},
1160 {"WaitKernel",
1161 KernelEnqueueFlagsWaitKernel,
1162 SPV_OPCODE_FLAGS_CAPABILITIES,
1163 CapabilityKernel,
1164 {SPV_OPERAND_TYPE_NONE}},
1165 {"WaitWorkGroup",
1166 KernelEnqueueFlagsWaitWorkGroup,
1167 SPV_OPCODE_FLAGS_CAPABILITIES,
1168 CapabilityKernel,
1169 {SPV_OPERAND_TYPE_NONE}},
1170};
1171
1172static const spv_operand_desc_t kernelProfilingInfoEntries[] = {
1173 {"None",
1174 KernelProfilingInfoMaskNone,
1175 SPV_OPCODE_FLAGS_NONE,
1176 0,
1177 {SPV_OPERAND_TYPE_NONE}},
1178 {"CmdExecTime",
1179 KernelProfilingInfoCmdExecTimeMask,
1180 SPV_OPCODE_FLAGS_CAPABILITIES,
1181 CapabilityKernel,
1182 {SPV_OPERAND_TYPE_NONE}},
1183};
1184
1185static const spv_operand_desc_t capabilityInfoEntries[] = {
1186 {"Matrix",
1187 CapabilityMatrix,
1188 SPV_OPCODE_FLAGS_NONE,
1189 0,
1190 {SPV_OPERAND_TYPE_NONE}},
1191 {"Shader",
1192 CapabilityShader,
1193 SPV_OPCODE_FLAGS_CAPABILITIES,
1194 CapabilityMatrix,
1195 {SPV_OPERAND_TYPE_NONE}},
1196 {"Geometry",
1197 CapabilityGeometry,
1198 SPV_OPCODE_FLAGS_CAPABILITIES,
1199 CapabilityShader,
1200 {SPV_OPERAND_TYPE_NONE}},
1201 {"Tessellation",
1202 CapabilityTessellation,
1203 SPV_OPCODE_FLAGS_CAPABILITIES,
1204 CapabilityShader,
1205 {SPV_OPERAND_TYPE_NONE}},
1206 {"Addresses",
1207 CapabilityAddresses,
1208 SPV_OPCODE_FLAGS_NONE,
1209 0,
1210 {SPV_OPERAND_TYPE_NONE}},
1211 {"Linkage",
1212 CapabilityLinkage,
1213 SPV_OPCODE_FLAGS_NONE,
1214 0,
1215 {SPV_OPERAND_TYPE_NONE}},
1216 {"Kernel",
1217 CapabilityKernel,
1218 SPV_OPCODE_FLAGS_NONE,
1219 0,
1220 {SPV_OPERAND_TYPE_NONE}},
1221 {"Vector16",
1222 CapabilityVector16,
1223 SPV_OPCODE_FLAGS_NONE,
1224 0,
1225 {SPV_OPERAND_TYPE_NONE}},
1226 {"Float16Buffer",
1227 CapabilityFloat16Buffer,
1228 SPV_OPCODE_FLAGS_NONE,
1229 0,
1230 {SPV_OPERAND_TYPE_NONE}},
1231 {"Float16",
1232 CapabilityFloat16,
1233 SPV_OPCODE_FLAGS_NONE,
1234 0,
1235 {SPV_OPERAND_TYPE_NONE}},
1236 {"Float64",
1237 CapabilityFloat64,
1238 SPV_OPCODE_FLAGS_NONE,
1239 0,
1240 {SPV_OPERAND_TYPE_NONE}},
1241 {"Int64",
1242 CapabilityInt64,
1243 SPV_OPCODE_FLAGS_NONE,
1244 0,
1245 {SPV_OPERAND_TYPE_NONE}},
1246 {"Int64Atomics",
1247 CapabilityInt64Atomics,
1248 SPV_OPCODE_FLAGS_NONE,
1249 0,
1250 {SPV_OPERAND_TYPE_NONE}},
1251 {"ImageBasic",
1252 CapabilityImageBasic,
1253 SPV_OPCODE_FLAGS_NONE,
1254 0,
1255 {SPV_OPERAND_TYPE_NONE}},
1256 {"ImageReadWrite",
1257 CapabilityImageReadWrite,
1258 SPV_OPCODE_FLAGS_NONE,
1259 0,
1260 {SPV_OPERAND_TYPE_NONE}},
David Netoc6402d62015-09-10 16:39:09 -04001261 {"ImageMipmap",
1262 CapabilityImageMipmap,
1263 SPV_OPCODE_FLAGS_NONE,
1264 0,
1265 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001266 {"ImageSRGBWrite",
1267 CapabilityImageSRGBWrite,
1268 SPV_OPCODE_FLAGS_NONE,
1269 0,
1270 {SPV_OPERAND_TYPE_NONE}},
1271 {"Pipes",
1272 CapabilityPipes,
1273 SPV_OPCODE_FLAGS_NONE,
1274 0,
1275 {SPV_OPERAND_TYPE_NONE}},
1276 {"Groups",
1277 CapabilityGroups,
1278 SPV_OPCODE_FLAGS_NONE,
1279 0,
1280 {SPV_OPERAND_TYPE_NONE}},
1281 {"DeviceEnqueue",
1282 CapabilityDeviceEnqueue,
1283 SPV_OPCODE_FLAGS_NONE,
1284 0,
1285 {SPV_OPERAND_TYPE_NONE}},
David Netoc6402d62015-09-10 16:39:09 -04001286// A macro for defining a capability that doesn't depend on other capabilities.
David Netoe994e2e2015-09-11 12:15:58 -04001287// TODO(dneto): Rev32 adds many dependencies between capbilities.
David Netoc6402d62015-09-10 16:39:09 -04001288#define CASE(NAME) { #NAME, Capability##NAME, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_NONE}}
1289 CASE(LiteralSampler),
1290 CASE(AtomicStorage),
1291 CASE(Int16),
1292 CASE(TessellationPointSize),
1293 CASE(GeometryPointSize),
1294 CASE(ImageGatherExtended),
1295 CASE(StorageImageExtendedFormats),
1296 CASE(StorageImageMultisample),
1297 CASE(UniformBufferArrayDynamicIndexing),
1298 CASE(SampledImageArrayDynamicIndexing),
1299 CASE(StorageBufferArrayDynamicIndexing),
1300 CASE(StorageImageArrayDynamicIndexing),
1301 CASE(ClipDistance),
1302 CASE(CullDistance),
1303 CASE(ImageCubeArray),
1304 CASE(SampleRateShading),
1305#undef CASE
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001306};
1307
1308static const spv_operand_desc_group_t opcodeEntryTypes[] = {
1309 {SPV_OPERAND_TYPE_SOURCE_LANGUAGE,
1310 sizeof(sourceLanguageEntries) / sizeof(spv_operand_desc_t),
1311 sourceLanguageEntries},
1312 {SPV_OPERAND_TYPE_EXECUTION_MODEL,
1313 sizeof(executionModelEntries) / sizeof(spv_operand_desc_t),
1314 executionModelEntries},
1315 {SPV_OPERAND_TYPE_ADDRESSING_MODEL,
1316 sizeof(addressingModelEntries) / sizeof(spv_operand_desc_t),
1317 addressingModelEntries},
1318 {SPV_OPERAND_TYPE_MEMORY_MODEL,
1319 sizeof(memoryModelEntries) / sizeof(spv_operand_desc_t),
1320 memoryModelEntries},
1321 {SPV_OPERAND_TYPE_EXECUTION_MODE,
1322 sizeof(executionModeEntries) / sizeof(spv_operand_desc_t),
1323 executionModeEntries},
1324 {SPV_OPERAND_TYPE_STORAGE_CLASS,
1325 sizeof(storageClassEntries) / sizeof(spv_operand_desc_t),
1326 storageClassEntries},
1327 {SPV_OPERAND_TYPE_DIMENSIONALITY,
1328 sizeof(dimensionalityEntries) / sizeof(spv_operand_desc_t),
1329 dimensionalityEntries},
1330 {SPV_OPERAND_TYPE_SAMPLER_ADDRESSING_MODE,
1331 sizeof(samplerAddressingModeEntries) / sizeof(spv_operand_desc_t),
1332 samplerAddressingModeEntries},
1333 {SPV_OPERAND_TYPE_SAMPLER_FILTER_MODE,
1334 sizeof(samplerFilterModeEntries) / sizeof(spv_operand_desc_t),
1335 samplerFilterModeEntries},
1336 {SPV_OPERAND_TYPE_FP_FAST_MATH_MODE,
1337 sizeof(fpFastMathModeEntries) / sizeof(spv_operand_desc_t),
1338 fpFastMathModeEntries},
1339 {SPV_OPERAND_TYPE_FP_ROUNDING_MODE,
1340 sizeof(fpRoundingModeEntries) / sizeof(spv_operand_desc_t),
1341 fpRoundingModeEntries},
1342 {SPV_OPERAND_TYPE_LINKAGE_TYPE,
1343 sizeof(linkageTypeEntries) / sizeof(spv_operand_desc_t),
1344 linkageTypeEntries},
1345 {SPV_OPERAND_TYPE_ACCESS_QUALIFIER,
1346 sizeof(accessQualifierEntries) / sizeof(spv_operand_desc_t),
1347 accessQualifierEntries},
1348 {SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE,
1349 sizeof(functionParameterAttributeEntries) / sizeof(spv_operand_desc_t),
1350 functionParameterAttributeEntries},
1351 {SPV_OPERAND_TYPE_DECORATION,
1352 sizeof(decorationEntries) / sizeof(spv_operand_desc_t), decorationEntries},
1353 {SPV_OPERAND_TYPE_BUILT_IN,
1354 sizeof(builtInEntries) / sizeof(spv_operand_desc_t), builtInEntries},
1355 {SPV_OPERAND_TYPE_SELECTION_CONTROL,
1356 sizeof(selectionControlEntries) / sizeof(spv_operand_desc_t),
1357 selectionControlEntries},
1358 {SPV_OPERAND_TYPE_LOOP_CONTROL,
1359 sizeof(loopControlEntries) / sizeof(spv_operand_desc_t),
1360 loopControlEntries},
1361 {SPV_OPERAND_TYPE_FUNCTION_CONTROL,
1362 sizeof(functionControlEntries) / sizeof(spv_operand_desc_t),
1363 functionControlEntries},
1364 {SPV_OPERAND_TYPE_MEMORY_SEMANTICS,
1365 sizeof(memorySemanticsEntries) / sizeof(spv_operand_desc_t),
1366 memorySemanticsEntries},
David Neto78c3b432015-08-27 13:03:52 -04001367 {SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001368 sizeof(memoryAccessEntries) / sizeof(spv_operand_desc_t),
1369 memoryAccessEntries},
1370 {SPV_OPERAND_TYPE_EXECUTION_SCOPE,
1371 sizeof(scopeEntries) / sizeof(spv_operand_desc_t), scopeEntries},
1372 {SPV_OPERAND_TYPE_GROUP_OPERATION,
1373 sizeof(groupOperationEntries) / sizeof(spv_operand_desc_t),
1374 groupOperationEntries},
1375 {SPV_OPERAND_TYPE_KERNEL_ENQ_FLAGS,
1376 sizeof(kernelKernelEnqueueFlagssEntries) / sizeof(spv_operand_desc_t),
1377 kernelKernelEnqueueFlagssEntries},
David Neto47994822015-08-27 13:11:01 -04001378 {SPV_OPERAND_TYPE_KERNEL_PROFILING_INFO,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001379 sizeof(kernelProfilingInfoEntries) / sizeof(spv_operand_desc_t),
1380 kernelProfilingInfoEntries},
1381 {SPV_OPERAND_TYPE_CAPABILITY,
1382 sizeof(capabilityInfoEntries) / sizeof(spv_operand_desc_t),
1383 capabilityInfoEntries},
1384};
1385
1386spv_result_t spvOperandTableGet(spv_operand_table *pOperandTable) {
Lei Zhang40056702015-09-11 14:31:27 -04001387 if (!pOperandTable) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001388
1389 static const spv_operand_table_t table = {
1390 sizeof(opcodeEntryTypes) / sizeof(spv_operand_desc_group_t),
1391 opcodeEntryTypes};
1392
1393 *pOperandTable = &table;
1394
1395 return SPV_SUCCESS;
1396}
1397
1398spv_result_t spvOperandTableNameLookup(const spv_operand_table table,
1399 const spv_operand_type_t type,
1400 const char *name,
1401 spv_operand_desc *pEntry) {
Lei Zhang40056702015-09-11 14:31:27 -04001402 if (!table) return SPV_ERROR_INVALID_TABLE;
1403 if (!name || !pEntry) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001404
1405 const uint64_t nameLength = strlen(name);
1406 for (uint64_t typeIndex = 0; typeIndex < table->count; ++typeIndex) {
1407 if (type == table->types[typeIndex].type) {
1408 for (uint64_t operandIndex = 0;
1409 operandIndex < table->types[typeIndex].count; ++operandIndex) {
1410 if (nameLength ==
1411 strlen(table->types[typeIndex].entries[operandIndex].name) &&
1412 !strncmp(table->types[typeIndex].entries[operandIndex].name, name,
1413 strlen(name))) {
1414 *pEntry = &table->types[typeIndex].entries[operandIndex];
1415 return SPV_SUCCESS;
1416 }
1417 }
1418 }
1419 }
1420
1421 return SPV_ERROR_INVALID_LOOKUP;
1422}
1423
1424spv_result_t spvOperandTableValueLookup(const spv_operand_table table,
1425 const spv_operand_type_t type,
1426 const uint32_t value,
1427 spv_operand_desc *pEntry) {
Lei Zhang40056702015-09-11 14:31:27 -04001428 if (!table) return SPV_ERROR_INVALID_TABLE;
1429 if (!pEntry) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001430
1431 for (uint64_t typeIndex = 0; typeIndex < table->count; ++typeIndex) {
1432 if (type == table->types[typeIndex].type) {
1433 for (uint64_t operandIndex = 0;
1434 operandIndex < table->types[typeIndex].count; ++operandIndex) {
1435 if (value == table->types[typeIndex].entries[operandIndex].value) {
1436 *pEntry = &table->types[typeIndex].entries[operandIndex];
1437 return SPV_SUCCESS;
1438 }
1439 }
1440 }
1441 }
1442
1443 return SPV_ERROR_INVALID_LOOKUP;
1444}
1445
1446const char *spvOperandTypeStr(spv_operand_type_t type) {
1447 switch (type) {
1448 case SPV_OPERAND_TYPE_ID:
David Netofadbf622015-09-14 17:07:11 -04001449 case SPV_OPERAND_TYPE_OPTIONAL_ID:
1450 case SPV_OPERAND_TYPE_ID_IN_OPTIONAL_TUPLE:
1451 return "ID";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001452 case SPV_OPERAND_TYPE_RESULT_ID:
1453 return "result ID";
1454 case SPV_OPERAND_TYPE_LITERAL:
1455 return "literal";
1456 case SPV_OPERAND_TYPE_LITERAL_NUMBER:
1457 return "literal number";
Lei Zhangb41d1502015-09-14 15:22:23 -04001458 case SPV_OPERAND_TYPE_MULTIWORD_LITERAL_NUMBER:
1459 return "multiple word literal number";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001460 case SPV_OPERAND_TYPE_LITERAL_STRING:
1461 return "literal string";
1462 case SPV_OPERAND_TYPE_SOURCE_LANGUAGE:
1463 return "source langauge";
1464 case SPV_OPERAND_TYPE_EXECUTION_MODEL:
1465 return "execution model";
1466 case SPV_OPERAND_TYPE_ADDRESSING_MODEL:
1467 return "addressing model";
1468 case SPV_OPERAND_TYPE_MEMORY_MODEL:
1469 return "memory model";
1470 case SPV_OPERAND_TYPE_EXECUTION_MODE:
1471 return "execution mode";
1472 case SPV_OPERAND_TYPE_STORAGE_CLASS:
1473 return "storage class";
1474 case SPV_OPERAND_TYPE_DIMENSIONALITY:
1475 return "dimensionality";
1476 case SPV_OPERAND_TYPE_SAMPLER_ADDRESSING_MODE:
1477 return "addressing mode";
1478 case SPV_OPERAND_TYPE_SAMPLER_FILTER_MODE:
1479 return "sampler filter mode";
1480 case SPV_OPERAND_TYPE_FP_FAST_MATH_MODE:
1481 return "floating pointer fast math mode";
1482 case SPV_OPERAND_TYPE_FP_ROUNDING_MODE:
1483 return "floating point rounding mode";
1484 case SPV_OPERAND_TYPE_LINKAGE_TYPE:
1485 return "linkage type";
1486 case SPV_OPERAND_TYPE_ACCESS_QUALIFIER:
1487 return "access qualifier";
1488 case SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE:
1489 return "function parameter attribute";
1490 case SPV_OPERAND_TYPE_DECORATION:
1491 return "decoration";
1492 case SPV_OPERAND_TYPE_BUILT_IN:
1493 return "built in";
1494 case SPV_OPERAND_TYPE_SELECTION_CONTROL:
1495 return "selection control";
1496 case SPV_OPERAND_TYPE_LOOP_CONTROL:
1497 return "loop control";
1498 case SPV_OPERAND_TYPE_FUNCTION_CONTROL:
1499 return "function control";
1500 case SPV_OPERAND_TYPE_MEMORY_SEMANTICS:
1501 return "memory semantics";
David Neto78c3b432015-08-27 13:03:52 -04001502 case SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001503 return "memory access";
1504 case SPV_OPERAND_TYPE_EXECUTION_SCOPE:
David Netofadbf622015-09-14 17:07:11 -04001505 return "execution scope ID";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001506 case SPV_OPERAND_TYPE_GROUP_OPERATION:
1507 return "group operation";
1508 case SPV_OPERAND_TYPE_KERNEL_ENQ_FLAGS:
1509 return "kernel enqeue flags";
David Neto47994822015-08-27 13:11:01 -04001510 case SPV_OPERAND_TYPE_KERNEL_PROFILING_INFO:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001511 return "kernel profiling info";
1512 case SPV_OPERAND_TYPE_CAPABILITY:
1513 return "capability";
David Neto78c3b432015-08-27 13:03:52 -04001514 case SPV_OPERAND_TYPE_NONE:
1515 return "NONE";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001516 default:
1517 assert(0 && "Unhandled operand type!");
1518 break;
1519 }
1520 return "unknown";
1521}
David Neto78c3b432015-08-27 13:03:52 -04001522
1523void spvPrependOperandTypes(const spv_operand_type_t* types,
1524 spv_operand_pattern_t* pattern) {
1525 const spv_operand_type_t* endTypes;
1526 for (endTypes = types ; *endTypes != SPV_OPERAND_TYPE_NONE ; ++endTypes)
1527 ;
1528 pattern->insert(pattern->begin(), types, endTypes);
1529}
1530
1531bool spvOperandIsOptional(spv_operand_type_t type) {
1532 // Variable means zero or more times.
1533 if (spvOperandIsVariable(type))
1534 return true;
1535
1536 switch (type) {
1537 case SPV_OPERAND_TYPE_OPTIONAL_ID:
1538 case SPV_OPERAND_TYPE_OPTIONAL_IMAGE:
1539 case SPV_OPERAND_TYPE_OPTIONAL_LITERAL:
1540 case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_STRING:
1541 case SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS:
1542 case SPV_OPERAND_TYPE_OPTIONAL_EXECUTION_MODE:
1543 return true;
1544 default:
1545 break;
1546 }
1547 return false;
1548}
1549
1550bool spvOperandIsVariable(spv_operand_type_t type) {
1551 switch (type) {
1552 case SPV_OPERAND_TYPE_VARIABLE_ID:
1553 case SPV_OPERAND_TYPE_VARIABLE_LITERAL:
1554 case SPV_OPERAND_TYPE_VARIABLE_ID_LITERAL:
1555 case SPV_OPERAND_TYPE_VARIABLE_LITERAL_ID:
1556 case SPV_OPERAND_TYPE_VARIABLE_MEMORY_ACCESS:
1557 case SPV_OPERAND_TYPE_VARIABLE_EXECUTION_MODE:
1558 return true;
1559 default:
1560 break;
1561 }
1562 return false;
1563}
1564
1565
1566bool spvExpandOperandSequenceOnce(spv_operand_type_t type,
1567 spv_operand_pattern_t* pattern) {
1568 switch (type) {
1569 case SPV_OPERAND_TYPE_VARIABLE_ID:
1570 pattern->insert(pattern->begin(), {SPV_OPERAND_TYPE_OPTIONAL_ID, type});
1571 return true;
1572 case SPV_OPERAND_TYPE_VARIABLE_LITERAL:
1573 pattern->insert(pattern->begin(),
1574 {SPV_OPERAND_TYPE_OPTIONAL_LITERAL, type});
1575 return true;
1576 case SPV_OPERAND_TYPE_VARIABLE_LITERAL_ID:
1577 // Represents Zero or more (Literal, Id) pairs.
1578 pattern->insert(pattern->begin(),
1579 {SPV_OPERAND_TYPE_OPTIONAL_LITERAL,
1580 SPV_OPERAND_TYPE_ID_IN_OPTIONAL_TUPLE, type});
1581 return true;
1582 case SPV_OPERAND_TYPE_VARIABLE_ID_LITERAL:
1583 // Represents Zero or more (Id, Literal) pairs.
1584 pattern->insert(pattern->begin(),
1585 {SPV_OPERAND_TYPE_OPTIONAL_ID,
1586 SPV_OPERAND_TYPE_LITERAL_IN_OPTIONAL_TUPLE, type});
1587 return true;
1588 case SPV_OPERAND_TYPE_VARIABLE_MEMORY_ACCESS:
1589 pattern->insert(pattern->begin(), {SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS, type});
1590 return true;
1591 case SPV_OPERAND_TYPE_VARIABLE_EXECUTION_MODE:
1592 pattern->insert(pattern->begin(), {SPV_OPERAND_TYPE_OPTIONAL_EXECUTION_MODE, type});
1593 return true;
1594 default:
1595 break;
1596 }
1597 return false;
1598}
1599
1600spv_operand_type_t spvTakeFirstMatchableOperand(spv_operand_pattern_t* pattern) {
1601 assert(!pattern->empty());
1602 spv_operand_type_t result;
1603 do {
1604 result = pattern->front();
1605 pattern->pop_front();
1606 } while(spvExpandOperandSequenceOnce(result, pattern));
1607 return result;
1608}