blob: 84d41d493321a6755dc007a2b35cfb93c460269d [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[] = {
297 {"UniformConstant",
298 StorageClassUniformConstant,
299 SPV_OPCODE_FLAGS_NONE,
300 0,
301 {SPV_OPERAND_TYPE_NONE}},
302 {"Input",
303 StorageClassInput,
304 SPV_OPCODE_FLAGS_CAPABILITIES,
305 CapabilityShader,
306 {SPV_OPERAND_TYPE_NONE}},
307 {"Uniform",
308 StorageClassUniform,
309 SPV_OPCODE_FLAGS_CAPABILITIES,
310 CapabilityShader,
311 {SPV_OPERAND_TYPE_NONE}},
312 {"Output",
313 StorageClassOutput,
314 SPV_OPCODE_FLAGS_CAPABILITIES,
315 CapabilityShader,
316 {SPV_OPERAND_TYPE_NONE}},
317 {"WorkgroupLocal",
318 StorageClassWorkgroupLocal,
319 SPV_OPCODE_FLAGS_NONE,
320 0,
321 {SPV_OPERAND_TYPE_NONE}},
322 {"WorkgroupGlobal",
323 StorageClassWorkgroupGlobal,
324 SPV_OPCODE_FLAGS_NONE,
325 0,
326 {SPV_OPERAND_TYPE_NONE}},
327 {"PrivateGlobal",
328 StorageClassPrivateGlobal,
329 SPV_OPCODE_FLAGS_CAPABILITIES,
330 CapabilityShader,
331 {SPV_OPERAND_TYPE_NONE}},
332 {"Function",
333 StorageClassFunction,
334 SPV_OPCODE_FLAGS_NONE,
335 0,
336 {SPV_OPERAND_TYPE_NONE}},
337 {"Generic",
338 StorageClassGeneric,
339 SPV_OPCODE_FLAGS_CAPABILITIES,
340 CapabilityKernel,
341 {SPV_OPERAND_TYPE_NONE}},
342 {"AtomicCounter",
343 StorageClassAtomicCounter,
344 SPV_OPCODE_FLAGS_CAPABILITIES,
345 CapabilityShader,
346 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400347 {"Image",
348 StorageClassImage,
349 SPV_OPCODE_FLAGS_NONE,
350 0,
351 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100352};
353
354static const spv_operand_desc_t dimensionalityEntries[] = {
355 {"1D", Dim1D, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_NONE}},
356 {"2D", Dim2D, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_NONE}},
357 {"3D", Dim3D, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_NONE}},
358 {"Cube",
359 DimCube,
360 SPV_OPCODE_FLAGS_CAPABILITIES,
361 CapabilityShader,
362 {SPV_OPERAND_TYPE_NONE}},
363 {"Rect",
364 DimRect,
365 SPV_OPCODE_FLAGS_CAPABILITIES,
366 CapabilityShader,
367 {SPV_OPERAND_TYPE_NONE}},
368 {"Buffer", DimBuffer, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_NONE}},
369};
370
371static const spv_operand_desc_t samplerAddressingModeEntries[] = {
372 {"None",
373 SamplerAddressingModeNone,
374 SPV_OPCODE_FLAGS_CAPABILITIES,
375 CapabilityKernel,
376 {SPV_OPERAND_TYPE_NONE}},
377 {"ClampToEdge",
378 SamplerAddressingModeClampToEdge,
379 SPV_OPCODE_FLAGS_CAPABILITIES,
380 CapabilityKernel,
381 {SPV_OPERAND_TYPE_NONE}},
382 {"Clamp",
383 SamplerAddressingModeClamp,
384 SPV_OPCODE_FLAGS_CAPABILITIES,
385 CapabilityKernel,
386 {SPV_OPERAND_TYPE_NONE}},
387 {"Repeat",
388 SamplerAddressingModeRepeat,
389 SPV_OPCODE_FLAGS_CAPABILITIES,
390 CapabilityKernel,
391 {SPV_OPERAND_TYPE_NONE}},
392 {"RepeatMirrored",
393 SamplerAddressingModeRepeatMirrored,
394 SPV_OPCODE_FLAGS_CAPABILITIES,
395 CapabilityKernel,
396 {SPV_OPERAND_TYPE_NONE}},
397};
398
399static const spv_operand_desc_t samplerFilterModeEntries[] = {
400 {"Nearest",
401 SamplerFilterModeNearest,
402 SPV_OPCODE_FLAGS_CAPABILITIES,
403 CapabilityKernel,
404 {SPV_OPERAND_TYPE_NONE}},
405 {"Linear",
406 SamplerFilterModeLinear,
407 SPV_OPCODE_FLAGS_CAPABILITIES,
408 CapabilityKernel,
409 {SPV_OPERAND_TYPE_NONE}},
410};
411
412static const spv_operand_desc_t fpFastMathModeEntries[] = {
413 {"None",
414 FPFastMathModeMaskNone,
415 SPV_OPCODE_FLAGS_NONE,
416 0,
417 {SPV_OPERAND_TYPE_NONE}},
418 {"NotNaN",
419 FPFastMathModeNotNaNMask,
420 SPV_OPCODE_FLAGS_CAPABILITIES,
421 CapabilityKernel,
422 {SPV_OPERAND_TYPE_NONE}},
423 {"NotInf",
424 FPFastMathModeNotInfMask,
425 SPV_OPCODE_FLAGS_CAPABILITIES,
426 CapabilityKernel,
427 {SPV_OPERAND_TYPE_NONE}},
428 {"NSZ",
429 FPFastMathModeNSZMask,
430 SPV_OPCODE_FLAGS_CAPABILITIES,
431 CapabilityKernel,
432 {SPV_OPERAND_TYPE_NONE}},
433 {"AllowRecip",
434 FPFastMathModeAllowRecipMask,
435 SPV_OPCODE_FLAGS_CAPABILITIES,
436 CapabilityKernel,
437 {SPV_OPERAND_TYPE_NONE}},
438 {"Fast",
439 FPFastMathModeFastMask,
440 SPV_OPCODE_FLAGS_CAPABILITIES,
441 CapabilityKernel,
442 {SPV_OPERAND_TYPE_NONE}},
443};
444
445static const spv_operand_desc_t fpRoundingModeEntries[] = {
446 {"RTE",
447 FPRoundingModeRTE,
448 SPV_OPCODE_FLAGS_CAPABILITIES,
449 CapabilityKernel,
450 {SPV_OPERAND_TYPE_NONE}},
451 {"RTZ",
452 FPRoundingModeRTZ,
453 SPV_OPCODE_FLAGS_CAPABILITIES,
454 CapabilityKernel,
455 {SPV_OPERAND_TYPE_NONE}},
456 {"RTP",
457 FPRoundingModeRTP,
458 SPV_OPCODE_FLAGS_CAPABILITIES,
459 CapabilityKernel,
460 {SPV_OPERAND_TYPE_NONE}},
461 {"RTN",
462 FPRoundingModeRTN,
463 SPV_OPCODE_FLAGS_CAPABILITIES,
464 CapabilityKernel,
465 {SPV_OPERAND_TYPE_NONE}},
466};
467
468static const spv_operand_desc_t linkageTypeEntries[] = {
469 {"Export",
470 LinkageTypeExport,
471 SPV_OPCODE_FLAGS_CAPABILITIES,
472 CapabilityLinkage,
473 {SPV_OPERAND_TYPE_NONE}},
474 {"Import",
475 LinkageTypeImport,
476 SPV_OPCODE_FLAGS_CAPABILITIES,
477 CapabilityLinkage,
478 {SPV_OPERAND_TYPE_NONE}},
479};
480
481static const spv_operand_desc_t accessQualifierEntries[] = {
482 {"ReadOnly",
483 AccessQualifierReadOnly,
484 SPV_OPCODE_FLAGS_CAPABILITIES,
485 CapabilityKernel,
486 {SPV_OPERAND_TYPE_NONE}},
487 {"WriteOnly",
488 AccessQualifierWriteOnly,
489 SPV_OPCODE_FLAGS_CAPABILITIES,
490 CapabilityKernel,
491 {SPV_OPERAND_TYPE_NONE}},
492 {"ReadWrite",
493 AccessQualifierReadWrite,
494 SPV_OPCODE_FLAGS_CAPABILITIES,
495 CapabilityKernel,
496 {SPV_OPERAND_TYPE_NONE}},
497};
498
499static const spv_operand_desc_t functionParameterAttributeEntries[] = {
500 {"Zext",
501 FunctionParameterAttributeZext,
502 SPV_OPCODE_FLAGS_CAPABILITIES,
503 CapabilityKernel,
504 {SPV_OPERAND_TYPE_NONE}},
505 {"Sext",
506 FunctionParameterAttributeSext,
507 SPV_OPCODE_FLAGS_CAPABILITIES,
508 CapabilityKernel,
509 {SPV_OPERAND_TYPE_NONE}},
510 {"ByVal",
511 FunctionParameterAttributeByVal,
512 SPV_OPCODE_FLAGS_CAPABILITIES,
513 CapabilityKernel,
514 {SPV_OPERAND_TYPE_NONE}},
515 {"Sret",
516 FunctionParameterAttributeSret,
517 SPV_OPCODE_FLAGS_CAPABILITIES,
518 CapabilityKernel,
519 {SPV_OPERAND_TYPE_NONE}},
520 {"NoAlias",
521 FunctionParameterAttributeNoAlias,
522 SPV_OPCODE_FLAGS_CAPABILITIES,
523 CapabilityKernel,
524 {SPV_OPERAND_TYPE_NONE}},
David Neto37547b22015-09-10 13:23:11 -0400525 {"NoCapture",
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100526 FunctionParameterAttributeNoCapture,
527 SPV_OPCODE_FLAGS_CAPABILITIES,
528 CapabilityKernel,
529 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100530 {"NoWrite",
531 FunctionParameterAttributeNoWrite,
532 SPV_OPCODE_FLAGS_CAPABILITIES,
533 CapabilityKernel,
534 {SPV_OPERAND_TYPE_NONE}},
535 {"NoReadWrite",
536 FunctionParameterAttributeNoReadWrite,
537 SPV_OPCODE_FLAGS_CAPABILITIES,
538 CapabilityKernel,
539 {SPV_OPERAND_TYPE_NONE}},
540};
541
542static const spv_operand_desc_t decorationEntries[] = {
Lei Zhang604e5ce2015-08-14 14:46:43 -0400543 {"RelaxedPrecision",
544 DecorationRelaxedPrecision,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100545 SPV_OPCODE_FLAGS_CAPABILITIES,
546 CapabilityShader,
547 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400548 {
549 "SpecId",
550 DecorationSpecId,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100551 SPV_OPCODE_FLAGS_CAPABILITIES,
552 CapabilityShader,
Lei Zhang604e5ce2015-08-14 14:46:43 -0400553 {SPV_OPERAND_TYPE_LITERAL_NUMBER},
554 },
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100555 {"Block",
556 DecorationBlock,
557 SPV_OPCODE_FLAGS_CAPABILITIES,
558 CapabilityShader,
559 {SPV_OPERAND_TYPE_NONE}},
560 {"BufferBlock",
561 DecorationBufferBlock,
562 SPV_OPCODE_FLAGS_CAPABILITIES,
563 CapabilityShader,
564 {SPV_OPERAND_TYPE_NONE}},
565 {"RowMajor",
566 DecorationRowMajor,
567 SPV_OPCODE_FLAGS_CAPABILITIES,
568 CapabilityMatrix,
569 {SPV_OPERAND_TYPE_NONE}},
570 {"ColMajor",
571 DecorationColMajor,
572 SPV_OPCODE_FLAGS_CAPABILITIES,
573 CapabilityMatrix,
574 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400575 {"ArrayStride",
576 DecorationArrayStride,
577 SPV_OPCODE_FLAGS_CAPABILITIES,
578 CapabilityShader,
579 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
580 {"MatrixStride",
581 DecorationMatrixStride,
582 SPV_OPCODE_FLAGS_CAPABILITIES,
583 CapabilityShader,
584 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100585 {"GLSLShared",
586 DecorationGLSLShared,
587 SPV_OPCODE_FLAGS_CAPABILITIES,
588 CapabilityShader,
589 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100590 {"GLSLPacked",
591 DecorationGLSLPacked,
592 SPV_OPCODE_FLAGS_CAPABILITIES,
593 CapabilityShader,
594 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400595 {"CPacked",
596 DecorationCPacked,
597 SPV_OPCODE_FLAGS_CAPABILITIES,
598 CapabilityKernel,
599 {SPV_OPERAND_TYPE_NONE}},
600 {"BuiltIn",
601 DecorationBuiltIn,
602 SPV_OPCODE_FLAGS_CAPABILITIES,
603 CapabilityShader,
604 {SPV_OPERAND_TYPE_BUILT_IN, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100605 {"Smooth",
606 DecorationSmooth,
607 SPV_OPCODE_FLAGS_CAPABILITIES,
608 CapabilityShader,
609 {SPV_OPERAND_TYPE_NONE}},
610 {"Noperspective",
611 DecorationNoperspective,
612 SPV_OPCODE_FLAGS_CAPABILITIES,
613 CapabilityShader,
614 {SPV_OPERAND_TYPE_NONE}},
615 {"Flat",
616 DecorationFlat,
617 SPV_OPCODE_FLAGS_CAPABILITIES,
618 CapabilityShader,
619 {SPV_OPERAND_TYPE_NONE}},
620 {"Patch",
621 DecorationPatch,
622 SPV_OPCODE_FLAGS_CAPABILITIES,
623 CapabilityTessellation,
624 {SPV_OPERAND_TYPE_NONE}},
625 {"Centroid",
626 DecorationCentroid,
627 SPV_OPCODE_FLAGS_CAPABILITIES,
628 CapabilityShader,
629 {SPV_OPERAND_TYPE_NONE}},
630 {"Sample",
631 DecorationSample,
632 SPV_OPCODE_FLAGS_CAPABILITIES,
633 CapabilityShader,
634 {SPV_OPERAND_TYPE_NONE}},
635 {"Invariant",
636 DecorationInvariant,
637 SPV_OPCODE_FLAGS_CAPABILITIES,
638 CapabilityShader,
639 {SPV_OPERAND_TYPE_NONE}},
640 {"Restrict",
641 DecorationRestrict,
642 SPV_OPCODE_FLAGS_NONE,
643 0,
644 {SPV_OPERAND_TYPE_NONE}},
645 {"Aliased",
646 DecorationAliased,
647 SPV_OPCODE_FLAGS_NONE,
648 0,
649 {SPV_OPERAND_TYPE_NONE}},
650 {"Volatile",
651 DecorationVolatile,
652 SPV_OPCODE_FLAGS_NONE,
653 0,
654 {SPV_OPERAND_TYPE_NONE}},
655 {"Constant",
656 DecorationConstant,
657 SPV_OPCODE_FLAGS_CAPABILITIES,
658 CapabilityKernel,
659 {SPV_OPERAND_TYPE_NONE}},
660 {"Coherent",
661 DecorationCoherent,
662 SPV_OPCODE_FLAGS_NONE,
663 0,
664 {SPV_OPERAND_TYPE_NONE}},
665 {"Nonwritable",
666 DecorationNonwritable,
667 SPV_OPCODE_FLAGS_NONE,
668 0,
669 {SPV_OPERAND_TYPE_NONE}},
670 {"Nonreadable",
671 DecorationNonreadable,
672 SPV_OPCODE_FLAGS_NONE,
673 0,
674 {SPV_OPERAND_TYPE_NONE}},
675 {"Uniform",
676 DecorationUniform,
677 SPV_OPCODE_FLAGS_CAPABILITIES,
678 CapabilityShader,
679 {SPV_OPERAND_TYPE_NONE}},
680 {"NoStaticUse",
681 DecorationNoStaticUse,
682 SPV_OPCODE_FLAGS_NONE,
683 0,
684 {SPV_OPERAND_TYPE_NONE}},
David Neto37547b22015-09-10 13:23:11 -0400685 {"SaturatedConversion",
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100686 DecorationSaturatedConversion,
687 SPV_OPCODE_FLAGS_CAPABILITIES,
688 CapabilityKernel,
689 {SPV_OPERAND_TYPE_NONE}},
690 {"Stream",
691 DecorationStream,
692 SPV_OPCODE_FLAGS_CAPABILITIES,
693 CapabilityGeometry,
694 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
695 {"Location",
696 DecorationLocation,
697 SPV_OPCODE_FLAGS_CAPABILITIES,
698 CapabilityShader,
699 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
700 {"Component",
701 DecorationComponent,
702 SPV_OPCODE_FLAGS_CAPABILITIES,
703 CapabilityShader,
704 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
705 {"Index",
706 DecorationIndex,
707 SPV_OPCODE_FLAGS_CAPABILITIES,
708 CapabilityShader,
709 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
710 {"Binding",
711 DecorationBinding,
712 SPV_OPCODE_FLAGS_CAPABILITIES,
713 CapabilityShader,
714 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
715 {"DescriptorSet",
716 DecorationDescriptorSet,
717 SPV_OPCODE_FLAGS_CAPABILITIES,
718 CapabilityShader,
719 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
720 {"Offset",
721 DecorationOffset,
722 SPV_OPCODE_FLAGS_NONE,
723 0,
724 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100725 {"XfbBuffer",
726 DecorationXfbBuffer,
727 SPV_OPCODE_FLAGS_CAPABILITIES,
728 CapabilityShader,
729 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400730 {"XfbStride",
731 DecorationXfbStride,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100732 SPV_OPCODE_FLAGS_CAPABILITIES,
733 CapabilityShader,
734 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100735 {"FuncParamAttr",
736 DecorationFuncParamAttr,
737 SPV_OPCODE_FLAGS_CAPABILITIES,
738 CapabilityKernel,
739 {SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE, SPV_OPERAND_TYPE_NONE}},
740 {"FPRoundingMode",
741 DecorationFPRoundingMode,
742 SPV_OPCODE_FLAGS_CAPABILITIES,
743 CapabilityKernel,
744 {SPV_OPERAND_TYPE_FP_ROUNDING_MODE, SPV_OPERAND_TYPE_NONE}},
745 {"FPFastMathMode",
David Neto37547b22015-09-10 13:23:11 -0400746 DecorationFPFastMathMode,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100747 SPV_OPCODE_FLAGS_CAPABILITIES,
748 CapabilityKernel,
749 {SPV_OPERAND_TYPE_FP_FAST_MATH_MODE, SPV_OPERAND_TYPE_NONE}},
750 {"LinkageAttributes",
751 DecorationLinkageAttributes,
752 SPV_OPCODE_FLAGS_CAPABILITIES,
753 CapabilityLinkage,
David Neto55bdfcb2015-09-10 15:51:57 -0400754 {SPV_OPERAND_TYPE_LITERAL_STRING, SPV_OPERAND_TYPE_LINKAGE_TYPE, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100755};
756
757static const spv_operand_desc_t builtInEntries[] = {
758 {"Position",
759 BuiltInPosition,
760 SPV_OPCODE_FLAGS_CAPABILITIES,
761 CapabilityShader,
762 {SPV_OPERAND_TYPE_NONE}},
763 {"PointSize",
764 BuiltInPointSize,
765 SPV_OPCODE_FLAGS_CAPABILITIES,
766 CapabilityShader,
767 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100768 {"ClipDistance",
769 BuiltInClipDistance,
770 SPV_OPCODE_FLAGS_CAPABILITIES,
771 CapabilityShader,
772 {SPV_OPERAND_TYPE_NONE}},
773 {"CullDistance",
774 BuiltInCullDistance,
775 SPV_OPCODE_FLAGS_CAPABILITIES,
776 CapabilityShader,
777 {SPV_OPERAND_TYPE_NONE}},
778 {"VertexId",
779 BuiltInVertexId,
780 SPV_OPCODE_FLAGS_CAPABILITIES,
781 CapabilityShader,
782 {SPV_OPERAND_TYPE_NONE}},
783 {"InstanceId",
784 BuiltInInstanceId,
785 SPV_OPCODE_FLAGS_CAPABILITIES,
786 CapabilityShader,
787 {SPV_OPERAND_TYPE_NONE}},
788 {"PrimitiveId",
789 BuiltInPrimitiveId,
790 SPV_OPCODE_FLAGS_CAPABILITIES,
791 CapabilityGeometry | CapabilityTessellation,
792 {SPV_OPERAND_TYPE_NONE}},
793 {"InvocationId",
794 BuiltInInvocationId,
795 SPV_OPCODE_FLAGS_CAPABILITIES,
796 CapabilityGeometry | CapabilityTessellation,
797 {SPV_OPERAND_TYPE_NONE}},
798 {"Layer",
799 BuiltInLayer,
800 SPV_OPCODE_FLAGS_CAPABILITIES,
801 CapabilityGeometry,
802 {SPV_OPERAND_TYPE_NONE}},
803 {"ViewportIndex",
804 BuiltInViewportIndex,
805 SPV_OPCODE_FLAGS_CAPABILITIES,
806 CapabilityGeometry,
807 {SPV_OPERAND_TYPE_NONE}},
808 {"TessLevelOuter",
809 BuiltInTessLevelOuter,
810 SPV_OPCODE_FLAGS_CAPABILITIES,
811 CapabilityTessellation,
812 {SPV_OPERAND_TYPE_NONE}},
813 {"TessLevelInner",
814 BuiltInTessLevelInner,
815 SPV_OPCODE_FLAGS_CAPABILITIES,
816 CapabilityTessellation,
817 {SPV_OPERAND_TYPE_NONE}},
818 {"TessCoord",
819 BuiltInTessCoord,
820 SPV_OPCODE_FLAGS_CAPABILITIES,
821 CapabilityTessellation,
822 {SPV_OPERAND_TYPE_NONE}},
823 {"PatchVertices",
824 BuiltInPatchVertices,
825 SPV_OPCODE_FLAGS_CAPABILITIES,
826 CapabilityTessellation,
827 {SPV_OPERAND_TYPE_NONE}},
828 {"FragCoord",
829 BuiltInFragCoord,
830 SPV_OPCODE_FLAGS_CAPABILITIES,
831 CapabilityShader,
832 {SPV_OPERAND_TYPE_NONE}},
833 {"PointCoord",
834 BuiltInPointCoord,
835 SPV_OPCODE_FLAGS_CAPABILITIES,
836 CapabilityShader,
837 {SPV_OPERAND_TYPE_NONE}},
838 {"FrontFacing",
839 BuiltInFrontFacing,
840 SPV_OPCODE_FLAGS_CAPABILITIES,
841 CapabilityShader,
842 {SPV_OPERAND_TYPE_NONE}},
843 {"SampleId",
844 BuiltInSampleId,
845 SPV_OPCODE_FLAGS_CAPABILITIES,
846 CapabilityShader,
847 {SPV_OPERAND_TYPE_NONE}},
848 {"SamplePosition",
849 BuiltInSamplePosition,
850 SPV_OPCODE_FLAGS_CAPABILITIES,
851 CapabilityShader,
852 {SPV_OPERAND_TYPE_NONE}},
853 {"SampleMask",
854 BuiltInSampleMask,
855 SPV_OPCODE_FLAGS_CAPABILITIES,
856 CapabilityShader,
857 {SPV_OPERAND_TYPE_NONE}},
858 {"FragColor",
859 BuiltInFragColor,
860 SPV_OPCODE_FLAGS_CAPABILITIES,
861 CapabilityShader,
862 {SPV_OPERAND_TYPE_NONE}},
863 {"FragDepth",
864 BuiltInFragDepth,
865 SPV_OPCODE_FLAGS_CAPABILITIES,
866 CapabilityShader,
867 {SPV_OPERAND_TYPE_NONE}},
868 {"HelperInvocation",
869 BuiltInHelperInvocation,
870 SPV_OPCODE_FLAGS_CAPABILITIES,
871 CapabilityShader,
872 {SPV_OPERAND_TYPE_NONE}},
873 {"NumWorkgroups",
874 BuiltInNumWorkgroups,
875 SPV_OPCODE_FLAGS_NONE,
876 0,
877 {SPV_OPERAND_TYPE_NONE}},
878 {"WorkgroupSize",
879 BuiltInWorkgroupSize,
880 SPV_OPCODE_FLAGS_NONE,
881 0,
882 {SPV_OPERAND_TYPE_NONE}},
883 {"WorkgroupId",
884 BuiltInWorkgroupId,
885 SPV_OPCODE_FLAGS_NONE,
886 0,
887 {SPV_OPERAND_TYPE_NONE}},
888 {"LocalInvocationId",
889 BuiltInLocalInvocationId,
890 SPV_OPCODE_FLAGS_NONE,
891 0,
892 {SPV_OPERAND_TYPE_NONE}},
893 {"GlobalInvocationId",
894 BuiltInGlobalInvocationId,
895 SPV_OPCODE_FLAGS_NONE,
896 0,
897 {SPV_OPERAND_TYPE_NONE}},
898 {"LocalInvocationIndex",
David Neto37547b22015-09-10 13:23:11 -0400899 BuiltInLocalInvocationIndex,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100900 SPV_OPCODE_FLAGS_CAPABILITIES,
901 CapabilityShader,
902 {SPV_OPERAND_TYPE_NONE}},
903 {"WorkDim",
904 BuiltInWorkDim,
905 SPV_OPCODE_FLAGS_CAPABILITIES,
906 CapabilityKernel,
907 {SPV_OPERAND_TYPE_NONE}},
908 {"GlobalSize",
909 BuiltInGlobalSize,
910 SPV_OPCODE_FLAGS_CAPABILITIES,
911 CapabilityKernel,
912 {SPV_OPERAND_TYPE_NONE}},
913 {"EnqueuedWorkgroupSize",
914 BuiltInEnqueuedWorkgroupSize,
915 SPV_OPCODE_FLAGS_CAPABILITIES,
916 CapabilityKernel,
917 {SPV_OPERAND_TYPE_NONE}},
918 {"GlobalOffset",
919 BuiltInGlobalOffset,
920 SPV_OPCODE_FLAGS_CAPABILITIES,
921 CapabilityKernel,
922 {SPV_OPERAND_TYPE_NONE}},
923 {"GlobalLinearId",
924 BuiltInGlobalLinearId,
925 SPV_OPCODE_FLAGS_CAPABILITIES,
926 CapabilityKernel,
927 {SPV_OPERAND_TYPE_NONE}},
928 {"WorkgroupLinearId",
929 BuiltInWorkgroupLinearId,
930 SPV_OPCODE_FLAGS_CAPABILITIES,
931 CapabilityKernel,
932 {SPV_OPERAND_TYPE_NONE}},
933 {"SubgroupSize",
934 BuiltInSubgroupSize,
935 SPV_OPCODE_FLAGS_CAPABILITIES,
936 CapabilityKernel,
937 {SPV_OPERAND_TYPE_NONE}},
938 {"SubgroupMaxSize",
939 BuiltInSubgroupMaxSize,
940 SPV_OPCODE_FLAGS_CAPABILITIES,
941 CapabilityKernel,
942 {SPV_OPERAND_TYPE_NONE}},
943 {"NumSubgroups",
944 BuiltInNumSubgroups,
945 SPV_OPCODE_FLAGS_CAPABILITIES,
946 CapabilityKernel,
947 {SPV_OPERAND_TYPE_NONE}},
948 {"NumEnqueuedSubgroups",
949 BuiltInNumEnqueuedSubgroups,
950 SPV_OPCODE_FLAGS_CAPABILITIES,
951 CapabilityKernel,
952 {SPV_OPERAND_TYPE_NONE}},
953 {"SubgroupId",
David Neto37547b22015-09-10 13:23:11 -0400954 BuiltInSubgroupId,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100955 SPV_OPCODE_FLAGS_CAPABILITIES,
956 CapabilityKernel,
957 {SPV_OPERAND_TYPE_NONE}},
958 {"SubgroupLocalInvocationId",
959 BuiltInSubgroupLocalInvocationId,
960 SPV_OPCODE_FLAGS_CAPABILITIES,
961 CapabilityKernel,
962 {SPV_OPERAND_TYPE_NONE}},
963};
964
965static const spv_operand_desc_t selectionControlEntries[] = {
966 {"None",
967 SelectionControlMaskNone,
968 SPV_OPCODE_FLAGS_NONE,
969 0,
970 {SPV_OPERAND_TYPE_NONE}},
971 {"Flatten",
972 SelectionControlFlattenMask,
973 SPV_OPCODE_FLAGS_NONE,
974 0,
975 {SPV_OPERAND_TYPE_NONE}},
976 {"DontFlatten",
977 SelectionControlDontFlattenMask,
978 SPV_OPCODE_FLAGS_NONE,
979 0,
980 {SPV_OPERAND_TYPE_NONE}},
981};
982
983static const spv_operand_desc_t loopControlEntries[] = {
984 {"None",
985 LoopControlMaskNone,
986 SPV_OPCODE_FLAGS_NONE,
987 0,
988 {SPV_OPERAND_TYPE_NONE}},
989 {"Unroll",
990 LoopControlUnrollMask,
991 SPV_OPCODE_FLAGS_NONE,
992 0,
993 {SPV_OPERAND_TYPE_NONE}},
994 {"DontUnroll",
995 LoopControlDontUnrollMask,
996 SPV_OPCODE_FLAGS_NONE,
997 0,
998 {SPV_OPERAND_TYPE_NONE}},
999};
1000
1001static const spv_operand_desc_t functionControlEntries[] = {
1002 {"None",
1003 FunctionControlMaskNone,
1004 SPV_OPCODE_FLAGS_NONE,
1005 0,
1006 {SPV_OPERAND_TYPE_NONE}},
1007 {"InLine",
1008 FunctionControlInlineMask,
1009 SPV_OPCODE_FLAGS_NONE,
1010 0,
1011 {SPV_OPERAND_TYPE_NONE}},
1012 {"DontInline",
1013 FunctionControlDontInlineMask,
1014 SPV_OPCODE_FLAGS_NONE,
1015 0,
1016 {SPV_OPERAND_TYPE_NONE}},
1017 {"Pure",
1018 FunctionControlPureMask,
1019 SPV_OPCODE_FLAGS_NONE,
1020 0,
1021 {SPV_OPERAND_TYPE_NONE}},
1022 {"Const",
1023 FunctionControlConstMask,
1024 SPV_OPCODE_FLAGS_NONE,
1025 0,
1026 {SPV_OPERAND_TYPE_NONE}},
1027};
1028
1029static const spv_operand_desc_t memorySemanticsEntries[] = {
1030 {"None",
1031 MemorySemanticsMaskNone,
1032 SPV_OPCODE_FLAGS_NONE,
1033 0,
1034 {SPV_OPERAND_TYPE_NONE}},
1035 {"Relaxed",
1036 MemorySemanticsRelaxedMask,
1037 SPV_OPCODE_FLAGS_NONE,
1038 0,
1039 {SPV_OPERAND_TYPE_NONE}},
1040 {"SequentiallyConsistent",
1041 MemorySemanticsSequentiallyConsistentMask,
1042 SPV_OPCODE_FLAGS_NONE,
1043 0,
1044 {SPV_OPERAND_TYPE_NONE}},
1045 {"Acquire",
1046 MemorySemanticsAcquireMask,
1047 SPV_OPCODE_FLAGS_NONE,
1048 0,
1049 {SPV_OPERAND_TYPE_NONE}},
1050 {"Release",
1051 MemorySemanticsReleaseMask,
1052 SPV_OPCODE_FLAGS_NONE,
1053 0,
1054 {SPV_OPERAND_TYPE_NONE}},
1055 {"UniformMemory",
1056 MemorySemanticsUniformMemoryMask,
1057 SPV_OPCODE_FLAGS_CAPABILITIES,
1058 CapabilityShader,
1059 {SPV_OPERAND_TYPE_NONE}},
1060 {"SubgroupMemory",
1061 MemorySemanticsSubgroupMemoryMask,
1062 SPV_OPCODE_FLAGS_NONE,
1063 0,
1064 {SPV_OPERAND_TYPE_NONE}},
1065 {"WorkgroupLocalMemory",
1066 MemorySemanticsWorkgroupLocalMemoryMask,
1067 SPV_OPCODE_FLAGS_NONE,
1068 0,
1069 {SPV_OPERAND_TYPE_NONE}},
1070 {"WorkgroupGlobalMemory",
1071 MemorySemanticsWorkgroupGlobalMemoryMask,
1072 SPV_OPCODE_FLAGS_NONE,
1073 0,
1074 {SPV_OPERAND_TYPE_NONE}},
1075 {"AtomicCounterMemory",
1076 MemorySemanticsAtomicCounterMemoryMask,
1077 SPV_OPCODE_FLAGS_CAPABILITIES,
1078 CapabilityShader,
1079 {SPV_OPERAND_TYPE_NONE}},
1080 {
1081 "ImageMemory",
1082 MemorySemanticsImageMemoryMask,
1083 SPV_OPCODE_FLAGS_NONE,
1084 0,
1085 {SPV_OPERAND_TYPE_NONE},
1086 },
1087};
1088
1089static const spv_operand_desc_t memoryAccessEntries[] = {
1090 {"None",
1091 MemoryAccessMaskNone,
1092 SPV_OPCODE_FLAGS_NONE,
1093 0,
1094 {SPV_OPERAND_TYPE_NONE}},
1095 {"Volatile",
1096 MemoryAccessVolatileMask,
1097 SPV_OPCODE_FLAGS_NONE,
1098 0,
1099 {SPV_OPERAND_TYPE_NONE}},
1100 {
1101 "Aligned",
1102 MemoryAccessAlignedMask,
1103 SPV_OPCODE_FLAGS_NONE,
1104 0,
1105 {SPV_OPERAND_TYPE_NONE},
1106 },
1107};
1108
1109static const spv_operand_desc_t scopeEntries[] = {
1110 {"CrossDevice",
1111 ScopeCrossDevice,
1112 SPV_OPCODE_FLAGS_NONE,
1113 0,
1114 {SPV_OPERAND_TYPE_NONE}},
1115 {"Device", ScopeDevice, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_NONE}},
1116 {"Workgroup",
1117 ScopeWorkgroup,
1118 SPV_OPCODE_FLAGS_NONE,
1119 0,
1120 {SPV_OPERAND_TYPE_NONE}},
1121 {"Subgroup",
1122 ScopeSubgroup,
1123 SPV_OPCODE_FLAGS_NONE,
1124 0,
1125 {SPV_OPERAND_TYPE_NONE}},
1126 {
1127 "Invocation",
1128 ScopeInvocation,
1129 SPV_OPCODE_FLAGS_NONE,
1130 0,
1131 {SPV_OPERAND_TYPE_NONE},
1132 },
1133};
1134
1135static const spv_operand_desc_t groupOperationEntries[] = {
1136 {"Reduce",
1137 GroupOperationReduce,
1138 SPV_OPCODE_FLAGS_CAPABILITIES,
1139 CapabilityKernel,
1140 {SPV_OPERAND_TYPE_NONE}},
1141 {"InclusiveScan",
1142 GroupOperationInclusiveScan,
1143 SPV_OPCODE_FLAGS_CAPABILITIES,
1144 CapabilityKernel,
1145 {SPV_OPERAND_TYPE_NONE}},
1146 {"ExclusiveScan",
1147 GroupOperationExclusiveScan,
1148 SPV_OPCODE_FLAGS_CAPABILITIES,
1149 CapabilityKernel,
1150 {SPV_OPERAND_TYPE_NONE}},
1151};
1152
1153static const spv_operand_desc_t kernelKernelEnqueueFlagssEntries[] = {
1154 {"NoWait",
1155 KernelEnqueueFlagsNoWait,
1156 SPV_OPCODE_FLAGS_CAPABILITIES,
1157 CapabilityKernel,
1158 {SPV_OPERAND_TYPE_NONE}},
1159 {"WaitKernel",
1160 KernelEnqueueFlagsWaitKernel,
1161 SPV_OPCODE_FLAGS_CAPABILITIES,
1162 CapabilityKernel,
1163 {SPV_OPERAND_TYPE_NONE}},
1164 {"WaitWorkGroup",
1165 KernelEnqueueFlagsWaitWorkGroup,
1166 SPV_OPCODE_FLAGS_CAPABILITIES,
1167 CapabilityKernel,
1168 {SPV_OPERAND_TYPE_NONE}},
1169};
1170
1171static const spv_operand_desc_t kernelProfilingInfoEntries[] = {
1172 {"None",
1173 KernelProfilingInfoMaskNone,
1174 SPV_OPCODE_FLAGS_NONE,
1175 0,
1176 {SPV_OPERAND_TYPE_NONE}},
1177 {"CmdExecTime",
1178 KernelProfilingInfoCmdExecTimeMask,
1179 SPV_OPCODE_FLAGS_CAPABILITIES,
1180 CapabilityKernel,
1181 {SPV_OPERAND_TYPE_NONE}},
1182};
1183
1184static const spv_operand_desc_t capabilityInfoEntries[] = {
1185 {"Matrix",
1186 CapabilityMatrix,
1187 SPV_OPCODE_FLAGS_NONE,
1188 0,
1189 {SPV_OPERAND_TYPE_NONE}},
1190 {"Shader",
1191 CapabilityShader,
1192 SPV_OPCODE_FLAGS_CAPABILITIES,
1193 CapabilityMatrix,
1194 {SPV_OPERAND_TYPE_NONE}},
1195 {"Geometry",
1196 CapabilityGeometry,
1197 SPV_OPCODE_FLAGS_CAPABILITIES,
1198 CapabilityShader,
1199 {SPV_OPERAND_TYPE_NONE}},
1200 {"Tessellation",
1201 CapabilityTessellation,
1202 SPV_OPCODE_FLAGS_CAPABILITIES,
1203 CapabilityShader,
1204 {SPV_OPERAND_TYPE_NONE}},
1205 {"Addresses",
1206 CapabilityAddresses,
1207 SPV_OPCODE_FLAGS_NONE,
1208 0,
1209 {SPV_OPERAND_TYPE_NONE}},
1210 {"Linkage",
1211 CapabilityLinkage,
1212 SPV_OPCODE_FLAGS_NONE,
1213 0,
1214 {SPV_OPERAND_TYPE_NONE}},
1215 {"Kernel",
1216 CapabilityKernel,
1217 SPV_OPCODE_FLAGS_NONE,
1218 0,
1219 {SPV_OPERAND_TYPE_NONE}},
1220 {"Vector16",
1221 CapabilityVector16,
1222 SPV_OPCODE_FLAGS_NONE,
1223 0,
1224 {SPV_OPERAND_TYPE_NONE}},
1225 {"Float16Buffer",
1226 CapabilityFloat16Buffer,
1227 SPV_OPCODE_FLAGS_NONE,
1228 0,
1229 {SPV_OPERAND_TYPE_NONE}},
1230 {"Float16",
1231 CapabilityFloat16,
1232 SPV_OPCODE_FLAGS_NONE,
1233 0,
1234 {SPV_OPERAND_TYPE_NONE}},
1235 {"Float64",
1236 CapabilityFloat64,
1237 SPV_OPCODE_FLAGS_NONE,
1238 0,
1239 {SPV_OPERAND_TYPE_NONE}},
1240 {"Int64",
1241 CapabilityInt64,
1242 SPV_OPCODE_FLAGS_NONE,
1243 0,
1244 {SPV_OPERAND_TYPE_NONE}},
1245 {"Int64Atomics",
1246 CapabilityInt64Atomics,
1247 SPV_OPCODE_FLAGS_NONE,
1248 0,
1249 {SPV_OPERAND_TYPE_NONE}},
1250 {"ImageBasic",
1251 CapabilityImageBasic,
1252 SPV_OPCODE_FLAGS_NONE,
1253 0,
1254 {SPV_OPERAND_TYPE_NONE}},
1255 {"ImageReadWrite",
1256 CapabilityImageReadWrite,
1257 SPV_OPCODE_FLAGS_NONE,
1258 0,
1259 {SPV_OPERAND_TYPE_NONE}},
David Netoc6402d62015-09-10 16:39:09 -04001260 {"ImageMipmap",
1261 CapabilityImageMipmap,
1262 SPV_OPCODE_FLAGS_NONE,
1263 0,
1264 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001265 {"ImageSRGBWrite",
1266 CapabilityImageSRGBWrite,
1267 SPV_OPCODE_FLAGS_NONE,
1268 0,
1269 {SPV_OPERAND_TYPE_NONE}},
1270 {"Pipes",
1271 CapabilityPipes,
1272 SPV_OPCODE_FLAGS_NONE,
1273 0,
1274 {SPV_OPERAND_TYPE_NONE}},
1275 {"Groups",
1276 CapabilityGroups,
1277 SPV_OPCODE_FLAGS_NONE,
1278 0,
1279 {SPV_OPERAND_TYPE_NONE}},
1280 {"DeviceEnqueue",
1281 CapabilityDeviceEnqueue,
1282 SPV_OPCODE_FLAGS_NONE,
1283 0,
1284 {SPV_OPERAND_TYPE_NONE}},
David Netoc6402d62015-09-10 16:39:09 -04001285// A macro for defining a capability that doesn't depend on other capabilities.
David Netoe994e2e2015-09-11 12:15:58 -04001286// TODO(dneto): Rev32 adds many dependencies between capbilities.
David Netoc6402d62015-09-10 16:39:09 -04001287#define CASE(NAME) { #NAME, Capability##NAME, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_NONE}}
1288 CASE(LiteralSampler),
1289 CASE(AtomicStorage),
1290 CASE(Int16),
1291 CASE(TessellationPointSize),
1292 CASE(GeometryPointSize),
1293 CASE(ImageGatherExtended),
1294 CASE(StorageImageExtendedFormats),
1295 CASE(StorageImageMultisample),
1296 CASE(UniformBufferArrayDynamicIndexing),
1297 CASE(SampledImageArrayDynamicIndexing),
1298 CASE(StorageBufferArrayDynamicIndexing),
1299 CASE(StorageImageArrayDynamicIndexing),
1300 CASE(ClipDistance),
1301 CASE(CullDistance),
1302 CASE(ImageCubeArray),
1303 CASE(SampleRateShading),
1304#undef CASE
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001305};
1306
1307static const spv_operand_desc_group_t opcodeEntryTypes[] = {
1308 {SPV_OPERAND_TYPE_SOURCE_LANGUAGE,
1309 sizeof(sourceLanguageEntries) / sizeof(spv_operand_desc_t),
1310 sourceLanguageEntries},
1311 {SPV_OPERAND_TYPE_EXECUTION_MODEL,
1312 sizeof(executionModelEntries) / sizeof(spv_operand_desc_t),
1313 executionModelEntries},
1314 {SPV_OPERAND_TYPE_ADDRESSING_MODEL,
1315 sizeof(addressingModelEntries) / sizeof(spv_operand_desc_t),
1316 addressingModelEntries},
1317 {SPV_OPERAND_TYPE_MEMORY_MODEL,
1318 sizeof(memoryModelEntries) / sizeof(spv_operand_desc_t),
1319 memoryModelEntries},
1320 {SPV_OPERAND_TYPE_EXECUTION_MODE,
1321 sizeof(executionModeEntries) / sizeof(spv_operand_desc_t),
1322 executionModeEntries},
1323 {SPV_OPERAND_TYPE_STORAGE_CLASS,
1324 sizeof(storageClassEntries) / sizeof(spv_operand_desc_t),
1325 storageClassEntries},
1326 {SPV_OPERAND_TYPE_DIMENSIONALITY,
1327 sizeof(dimensionalityEntries) / sizeof(spv_operand_desc_t),
1328 dimensionalityEntries},
1329 {SPV_OPERAND_TYPE_SAMPLER_ADDRESSING_MODE,
1330 sizeof(samplerAddressingModeEntries) / sizeof(spv_operand_desc_t),
1331 samplerAddressingModeEntries},
1332 {SPV_OPERAND_TYPE_SAMPLER_FILTER_MODE,
1333 sizeof(samplerFilterModeEntries) / sizeof(spv_operand_desc_t),
1334 samplerFilterModeEntries},
1335 {SPV_OPERAND_TYPE_FP_FAST_MATH_MODE,
1336 sizeof(fpFastMathModeEntries) / sizeof(spv_operand_desc_t),
1337 fpFastMathModeEntries},
1338 {SPV_OPERAND_TYPE_FP_ROUNDING_MODE,
1339 sizeof(fpRoundingModeEntries) / sizeof(spv_operand_desc_t),
1340 fpRoundingModeEntries},
1341 {SPV_OPERAND_TYPE_LINKAGE_TYPE,
1342 sizeof(linkageTypeEntries) / sizeof(spv_operand_desc_t),
1343 linkageTypeEntries},
1344 {SPV_OPERAND_TYPE_ACCESS_QUALIFIER,
1345 sizeof(accessQualifierEntries) / sizeof(spv_operand_desc_t),
1346 accessQualifierEntries},
1347 {SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE,
1348 sizeof(functionParameterAttributeEntries) / sizeof(spv_operand_desc_t),
1349 functionParameterAttributeEntries},
1350 {SPV_OPERAND_TYPE_DECORATION,
1351 sizeof(decorationEntries) / sizeof(spv_operand_desc_t), decorationEntries},
1352 {SPV_OPERAND_TYPE_BUILT_IN,
1353 sizeof(builtInEntries) / sizeof(spv_operand_desc_t), builtInEntries},
1354 {SPV_OPERAND_TYPE_SELECTION_CONTROL,
1355 sizeof(selectionControlEntries) / sizeof(spv_operand_desc_t),
1356 selectionControlEntries},
1357 {SPV_OPERAND_TYPE_LOOP_CONTROL,
1358 sizeof(loopControlEntries) / sizeof(spv_operand_desc_t),
1359 loopControlEntries},
1360 {SPV_OPERAND_TYPE_FUNCTION_CONTROL,
1361 sizeof(functionControlEntries) / sizeof(spv_operand_desc_t),
1362 functionControlEntries},
1363 {SPV_OPERAND_TYPE_MEMORY_SEMANTICS,
1364 sizeof(memorySemanticsEntries) / sizeof(spv_operand_desc_t),
1365 memorySemanticsEntries},
David Neto78c3b432015-08-27 13:03:52 -04001366 {SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001367 sizeof(memoryAccessEntries) / sizeof(spv_operand_desc_t),
1368 memoryAccessEntries},
1369 {SPV_OPERAND_TYPE_EXECUTION_SCOPE,
1370 sizeof(scopeEntries) / sizeof(spv_operand_desc_t), scopeEntries},
1371 {SPV_OPERAND_TYPE_GROUP_OPERATION,
1372 sizeof(groupOperationEntries) / sizeof(spv_operand_desc_t),
1373 groupOperationEntries},
1374 {SPV_OPERAND_TYPE_KERNEL_ENQ_FLAGS,
1375 sizeof(kernelKernelEnqueueFlagssEntries) / sizeof(spv_operand_desc_t),
1376 kernelKernelEnqueueFlagssEntries},
David Neto47994822015-08-27 13:11:01 -04001377 {SPV_OPERAND_TYPE_KERNEL_PROFILING_INFO,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001378 sizeof(kernelProfilingInfoEntries) / sizeof(spv_operand_desc_t),
1379 kernelProfilingInfoEntries},
1380 {SPV_OPERAND_TYPE_CAPABILITY,
1381 sizeof(capabilityInfoEntries) / sizeof(spv_operand_desc_t),
1382 capabilityInfoEntries},
1383};
1384
1385spv_result_t spvOperandTableGet(spv_operand_table *pOperandTable) {
1386 spvCheck(!pOperandTable, return SPV_ERROR_INVALID_POINTER);
1387
1388 static const spv_operand_table_t table = {
1389 sizeof(opcodeEntryTypes) / sizeof(spv_operand_desc_group_t),
1390 opcodeEntryTypes};
1391
1392 *pOperandTable = &table;
1393
1394 return SPV_SUCCESS;
1395}
1396
1397spv_result_t spvOperandTableNameLookup(const spv_operand_table table,
1398 const spv_operand_type_t type,
1399 const char *name,
1400 spv_operand_desc *pEntry) {
1401 spvCheck(!table, return SPV_ERROR_INVALID_TABLE);
1402 spvCheck(!name || !pEntry, return SPV_ERROR_INVALID_POINTER);
1403
1404 const uint64_t nameLength = strlen(name);
1405 for (uint64_t typeIndex = 0; typeIndex < table->count; ++typeIndex) {
1406 if (type == table->types[typeIndex].type) {
1407 for (uint64_t operandIndex = 0;
1408 operandIndex < table->types[typeIndex].count; ++operandIndex) {
1409 if (nameLength ==
1410 strlen(table->types[typeIndex].entries[operandIndex].name) &&
1411 !strncmp(table->types[typeIndex].entries[operandIndex].name, name,
1412 strlen(name))) {
1413 *pEntry = &table->types[typeIndex].entries[operandIndex];
1414 return SPV_SUCCESS;
1415 }
1416 }
1417 }
1418 }
1419
1420 return SPV_ERROR_INVALID_LOOKUP;
1421}
1422
1423spv_result_t spvOperandTableValueLookup(const spv_operand_table table,
1424 const spv_operand_type_t type,
1425 const uint32_t value,
1426 spv_operand_desc *pEntry) {
1427 spvCheck(!table, return SPV_ERROR_INVALID_TABLE);
1428 spvCheck(!pEntry, return SPV_ERROR_INVALID_POINTER);
1429
1430 for (uint64_t typeIndex = 0; typeIndex < table->count; ++typeIndex) {
1431 if (type == table->types[typeIndex].type) {
1432 for (uint64_t operandIndex = 0;
1433 operandIndex < table->types[typeIndex].count; ++operandIndex) {
1434 if (value == table->types[typeIndex].entries[operandIndex].value) {
1435 *pEntry = &table->types[typeIndex].entries[operandIndex];
1436 return SPV_SUCCESS;
1437 }
1438 }
1439 }
1440 }
1441
1442 return SPV_ERROR_INVALID_LOOKUP;
1443}
1444
1445const char *spvOperandTypeStr(spv_operand_type_t type) {
1446 switch (type) {
1447 case SPV_OPERAND_TYPE_ID:
1448 return "id";
1449 case SPV_OPERAND_TYPE_RESULT_ID:
1450 return "result ID";
1451 case SPV_OPERAND_TYPE_LITERAL:
1452 return "literal";
1453 case SPV_OPERAND_TYPE_LITERAL_NUMBER:
1454 return "literal number";
1455 case SPV_OPERAND_TYPE_LITERAL_STRING:
1456 return "literal string";
1457 case SPV_OPERAND_TYPE_SOURCE_LANGUAGE:
1458 return "source langauge";
1459 case SPV_OPERAND_TYPE_EXECUTION_MODEL:
1460 return "execution model";
1461 case SPV_OPERAND_TYPE_ADDRESSING_MODEL:
1462 return "addressing model";
1463 case SPV_OPERAND_TYPE_MEMORY_MODEL:
1464 return "memory model";
1465 case SPV_OPERAND_TYPE_EXECUTION_MODE:
1466 return "execution mode";
1467 case SPV_OPERAND_TYPE_STORAGE_CLASS:
1468 return "storage class";
1469 case SPV_OPERAND_TYPE_DIMENSIONALITY:
1470 return "dimensionality";
1471 case SPV_OPERAND_TYPE_SAMPLER_ADDRESSING_MODE:
1472 return "addressing mode";
1473 case SPV_OPERAND_TYPE_SAMPLER_FILTER_MODE:
1474 return "sampler filter mode";
1475 case SPV_OPERAND_TYPE_FP_FAST_MATH_MODE:
1476 return "floating pointer fast math mode";
1477 case SPV_OPERAND_TYPE_FP_ROUNDING_MODE:
1478 return "floating point rounding mode";
1479 case SPV_OPERAND_TYPE_LINKAGE_TYPE:
1480 return "linkage type";
1481 case SPV_OPERAND_TYPE_ACCESS_QUALIFIER:
1482 return "access qualifier";
1483 case SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE:
1484 return "function parameter attribute";
1485 case SPV_OPERAND_TYPE_DECORATION:
1486 return "decoration";
1487 case SPV_OPERAND_TYPE_BUILT_IN:
1488 return "built in";
1489 case SPV_OPERAND_TYPE_SELECTION_CONTROL:
1490 return "selection control";
1491 case SPV_OPERAND_TYPE_LOOP_CONTROL:
1492 return "loop control";
1493 case SPV_OPERAND_TYPE_FUNCTION_CONTROL:
1494 return "function control";
1495 case SPV_OPERAND_TYPE_MEMORY_SEMANTICS:
1496 return "memory semantics";
David Neto78c3b432015-08-27 13:03:52 -04001497 case SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001498 return "memory access";
1499 case SPV_OPERAND_TYPE_EXECUTION_SCOPE:
1500 return "execution scope";
1501 case SPV_OPERAND_TYPE_GROUP_OPERATION:
1502 return "group operation";
1503 case SPV_OPERAND_TYPE_KERNEL_ENQ_FLAGS:
1504 return "kernel enqeue flags";
David Neto47994822015-08-27 13:11:01 -04001505 case SPV_OPERAND_TYPE_KERNEL_PROFILING_INFO:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001506 return "kernel profiling info";
1507 case SPV_OPERAND_TYPE_CAPABILITY:
1508 return "capability";
David Neto78c3b432015-08-27 13:03:52 -04001509 case SPV_OPERAND_TYPE_NONE:
1510 return "NONE";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001511 default:
1512 assert(0 && "Unhandled operand type!");
1513 break;
1514 }
1515 return "unknown";
1516}
David Neto78c3b432015-08-27 13:03:52 -04001517
1518void spvPrependOperandTypes(const spv_operand_type_t* types,
1519 spv_operand_pattern_t* pattern) {
1520 const spv_operand_type_t* endTypes;
1521 for (endTypes = types ; *endTypes != SPV_OPERAND_TYPE_NONE ; ++endTypes)
1522 ;
1523 pattern->insert(pattern->begin(), types, endTypes);
1524}
1525
1526bool spvOperandIsOptional(spv_operand_type_t type) {
1527 // Variable means zero or more times.
1528 if (spvOperandIsVariable(type))
1529 return true;
1530
1531 switch (type) {
1532 case SPV_OPERAND_TYPE_OPTIONAL_ID:
1533 case SPV_OPERAND_TYPE_OPTIONAL_IMAGE:
1534 case SPV_OPERAND_TYPE_OPTIONAL_LITERAL:
1535 case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_STRING:
1536 case SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS:
1537 case SPV_OPERAND_TYPE_OPTIONAL_EXECUTION_MODE:
1538 return true;
1539 default:
1540 break;
1541 }
1542 return false;
1543}
1544
1545bool spvOperandIsVariable(spv_operand_type_t type) {
1546 switch (type) {
1547 case SPV_OPERAND_TYPE_VARIABLE_ID:
1548 case SPV_OPERAND_TYPE_VARIABLE_LITERAL:
1549 case SPV_OPERAND_TYPE_VARIABLE_ID_LITERAL:
1550 case SPV_OPERAND_TYPE_VARIABLE_LITERAL_ID:
1551 case SPV_OPERAND_TYPE_VARIABLE_MEMORY_ACCESS:
1552 case SPV_OPERAND_TYPE_VARIABLE_EXECUTION_MODE:
1553 return true;
1554 default:
1555 break;
1556 }
1557 return false;
1558}
1559
1560
1561bool spvExpandOperandSequenceOnce(spv_operand_type_t type,
1562 spv_operand_pattern_t* pattern) {
1563 switch (type) {
1564 case SPV_OPERAND_TYPE_VARIABLE_ID:
1565 pattern->insert(pattern->begin(), {SPV_OPERAND_TYPE_OPTIONAL_ID, type});
1566 return true;
1567 case SPV_OPERAND_TYPE_VARIABLE_LITERAL:
1568 pattern->insert(pattern->begin(),
1569 {SPV_OPERAND_TYPE_OPTIONAL_LITERAL, type});
1570 return true;
1571 case SPV_OPERAND_TYPE_VARIABLE_LITERAL_ID:
1572 // Represents Zero or more (Literal, Id) pairs.
1573 pattern->insert(pattern->begin(),
1574 {SPV_OPERAND_TYPE_OPTIONAL_LITERAL,
1575 SPV_OPERAND_TYPE_ID_IN_OPTIONAL_TUPLE, type});
1576 return true;
1577 case SPV_OPERAND_TYPE_VARIABLE_ID_LITERAL:
1578 // Represents Zero or more (Id, Literal) pairs.
1579 pattern->insert(pattern->begin(),
1580 {SPV_OPERAND_TYPE_OPTIONAL_ID,
1581 SPV_OPERAND_TYPE_LITERAL_IN_OPTIONAL_TUPLE, type});
1582 return true;
1583 case SPV_OPERAND_TYPE_VARIABLE_MEMORY_ACCESS:
1584 pattern->insert(pattern->begin(), {SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS, type});
1585 return true;
1586 case SPV_OPERAND_TYPE_VARIABLE_EXECUTION_MODE:
1587 pattern->insert(pattern->begin(), {SPV_OPERAND_TYPE_OPTIONAL_EXECUTION_MODE, type});
1588 return true;
1589 default:
1590 break;
1591 }
1592 return false;
1593}
1594
1595spv_operand_type_t spvTakeFirstMatchableOperand(spv_operand_pattern_t* pattern) {
1596 assert(!pattern->empty());
1597 spv_operand_type_t result;
1598 do {
1599 result = pattern->front();
1600 pattern->pop_front();
1601 } while(spvExpandOperandSequenceOnce(result, pattern));
1602 return result;
1603}