blob: f58b8c3b1b19762f021032215c8a0398f4bd5fac [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
David Netob30a0c52015-09-16 15:56:43 -0400413static const spv_operand_desc_t samplerImageFormatEntries[] = {
414// In Rev31, all the cases depend on the Shader capability.
415// TODO(dneto): In Rev32, many of these depend on the AdvancedFormats
416// capability instead.
417#define CASE(NAME) \
418 { \
419 #NAME, ImageFormat##NAME, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityShader, \
420 { \
421 SPV_OPERAND_TYPE_NONE \
422 } \
423 }
424 // clang-format off
425 CASE(Unknown),
426 CASE(Rgba32f),
427 CASE(Rgba16f),
428 CASE(R32f),
429 CASE(Rgba8),
430 CASE(Rgba8Snorm),
431 CASE(Rg32f),
432 CASE(Rg16f),
433 CASE(R11fG11fB10f),
434 CASE(R16f),
435 CASE(Rgba16),
436 CASE(Rgb10A2),
437 CASE(Rg16),
438 CASE(Rg8),
439 CASE(R16),
440 CASE(R8),
441 CASE(Rgba16Snorm),
442 CASE(Rg16Snorm),
443 CASE(Rg8Snorm),
444 CASE(R16Snorm),
445 CASE(R8Snorm),
446 CASE(Rgba32i),
447 CASE(Rgba16i),
448 CASE(Rgba8i),
449 CASE(R32i),
450 CASE(Rg32i),
451 CASE(Rg16i),
452 CASE(Rg8i),
453 CASE(R16i),
454 CASE(R8i),
455 CASE(Rgba32ui),
456 CASE(Rgba16ui),
457 CASE(Rgba8ui),
458 CASE(R32ui),
459 CASE(Rgb10a2ui),
460 CASE(Rg32ui),
461 CASE(Rg16ui),
462 CASE(Rg8ui),
463 CASE(R16ui),
464 CASE(R8ui),
465 // clang-format on
466#undef CASE
467};
468
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100469static const spv_operand_desc_t fpFastMathModeEntries[] = {
470 {"None",
471 FPFastMathModeMaskNone,
472 SPV_OPCODE_FLAGS_NONE,
473 0,
474 {SPV_OPERAND_TYPE_NONE}},
475 {"NotNaN",
476 FPFastMathModeNotNaNMask,
477 SPV_OPCODE_FLAGS_CAPABILITIES,
478 CapabilityKernel,
479 {SPV_OPERAND_TYPE_NONE}},
480 {"NotInf",
481 FPFastMathModeNotInfMask,
482 SPV_OPCODE_FLAGS_CAPABILITIES,
483 CapabilityKernel,
484 {SPV_OPERAND_TYPE_NONE}},
485 {"NSZ",
486 FPFastMathModeNSZMask,
487 SPV_OPCODE_FLAGS_CAPABILITIES,
488 CapabilityKernel,
489 {SPV_OPERAND_TYPE_NONE}},
490 {"AllowRecip",
491 FPFastMathModeAllowRecipMask,
492 SPV_OPCODE_FLAGS_CAPABILITIES,
493 CapabilityKernel,
494 {SPV_OPERAND_TYPE_NONE}},
495 {"Fast",
496 FPFastMathModeFastMask,
497 SPV_OPCODE_FLAGS_CAPABILITIES,
498 CapabilityKernel,
499 {SPV_OPERAND_TYPE_NONE}},
500};
501
502static const spv_operand_desc_t fpRoundingModeEntries[] = {
503 {"RTE",
504 FPRoundingModeRTE,
505 SPV_OPCODE_FLAGS_CAPABILITIES,
506 CapabilityKernel,
507 {SPV_OPERAND_TYPE_NONE}},
508 {"RTZ",
509 FPRoundingModeRTZ,
510 SPV_OPCODE_FLAGS_CAPABILITIES,
511 CapabilityKernel,
512 {SPV_OPERAND_TYPE_NONE}},
513 {"RTP",
514 FPRoundingModeRTP,
515 SPV_OPCODE_FLAGS_CAPABILITIES,
516 CapabilityKernel,
517 {SPV_OPERAND_TYPE_NONE}},
518 {"RTN",
519 FPRoundingModeRTN,
520 SPV_OPCODE_FLAGS_CAPABILITIES,
521 CapabilityKernel,
522 {SPV_OPERAND_TYPE_NONE}},
523};
524
525static const spv_operand_desc_t linkageTypeEntries[] = {
526 {"Export",
527 LinkageTypeExport,
528 SPV_OPCODE_FLAGS_CAPABILITIES,
529 CapabilityLinkage,
530 {SPV_OPERAND_TYPE_NONE}},
531 {"Import",
532 LinkageTypeImport,
533 SPV_OPCODE_FLAGS_CAPABILITIES,
534 CapabilityLinkage,
535 {SPV_OPERAND_TYPE_NONE}},
536};
537
538static const spv_operand_desc_t accessQualifierEntries[] = {
539 {"ReadOnly",
540 AccessQualifierReadOnly,
541 SPV_OPCODE_FLAGS_CAPABILITIES,
542 CapabilityKernel,
543 {SPV_OPERAND_TYPE_NONE}},
544 {"WriteOnly",
545 AccessQualifierWriteOnly,
546 SPV_OPCODE_FLAGS_CAPABILITIES,
547 CapabilityKernel,
548 {SPV_OPERAND_TYPE_NONE}},
549 {"ReadWrite",
550 AccessQualifierReadWrite,
551 SPV_OPCODE_FLAGS_CAPABILITIES,
552 CapabilityKernel,
553 {SPV_OPERAND_TYPE_NONE}},
554};
555
556static const spv_operand_desc_t functionParameterAttributeEntries[] = {
557 {"Zext",
558 FunctionParameterAttributeZext,
559 SPV_OPCODE_FLAGS_CAPABILITIES,
560 CapabilityKernel,
561 {SPV_OPERAND_TYPE_NONE}},
562 {"Sext",
563 FunctionParameterAttributeSext,
564 SPV_OPCODE_FLAGS_CAPABILITIES,
565 CapabilityKernel,
566 {SPV_OPERAND_TYPE_NONE}},
567 {"ByVal",
568 FunctionParameterAttributeByVal,
569 SPV_OPCODE_FLAGS_CAPABILITIES,
570 CapabilityKernel,
571 {SPV_OPERAND_TYPE_NONE}},
572 {"Sret",
573 FunctionParameterAttributeSret,
574 SPV_OPCODE_FLAGS_CAPABILITIES,
575 CapabilityKernel,
576 {SPV_OPERAND_TYPE_NONE}},
577 {"NoAlias",
578 FunctionParameterAttributeNoAlias,
579 SPV_OPCODE_FLAGS_CAPABILITIES,
580 CapabilityKernel,
581 {SPV_OPERAND_TYPE_NONE}},
David Neto37547b22015-09-10 13:23:11 -0400582 {"NoCapture",
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100583 FunctionParameterAttributeNoCapture,
584 SPV_OPCODE_FLAGS_CAPABILITIES,
585 CapabilityKernel,
586 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100587 {"NoWrite",
588 FunctionParameterAttributeNoWrite,
589 SPV_OPCODE_FLAGS_CAPABILITIES,
590 CapabilityKernel,
591 {SPV_OPERAND_TYPE_NONE}},
592 {"NoReadWrite",
593 FunctionParameterAttributeNoReadWrite,
594 SPV_OPCODE_FLAGS_CAPABILITIES,
595 CapabilityKernel,
596 {SPV_OPERAND_TYPE_NONE}},
597};
598
599static const spv_operand_desc_t decorationEntries[] = {
Lei Zhang604e5ce2015-08-14 14:46:43 -0400600 {"RelaxedPrecision",
601 DecorationRelaxedPrecision,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100602 SPV_OPCODE_FLAGS_CAPABILITIES,
603 CapabilityShader,
604 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400605 {
606 "SpecId",
607 DecorationSpecId,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100608 SPV_OPCODE_FLAGS_CAPABILITIES,
609 CapabilityShader,
Lei Zhang604e5ce2015-08-14 14:46:43 -0400610 {SPV_OPERAND_TYPE_LITERAL_NUMBER},
611 },
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100612 {"Block",
613 DecorationBlock,
614 SPV_OPCODE_FLAGS_CAPABILITIES,
615 CapabilityShader,
616 {SPV_OPERAND_TYPE_NONE}},
617 {"BufferBlock",
618 DecorationBufferBlock,
619 SPV_OPCODE_FLAGS_CAPABILITIES,
620 CapabilityShader,
621 {SPV_OPERAND_TYPE_NONE}},
622 {"RowMajor",
623 DecorationRowMajor,
624 SPV_OPCODE_FLAGS_CAPABILITIES,
625 CapabilityMatrix,
626 {SPV_OPERAND_TYPE_NONE}},
627 {"ColMajor",
628 DecorationColMajor,
629 SPV_OPCODE_FLAGS_CAPABILITIES,
630 CapabilityMatrix,
631 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400632 {"ArrayStride",
633 DecorationArrayStride,
634 SPV_OPCODE_FLAGS_CAPABILITIES,
635 CapabilityShader,
636 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
637 {"MatrixStride",
638 DecorationMatrixStride,
639 SPV_OPCODE_FLAGS_CAPABILITIES,
640 CapabilityShader,
641 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100642 {"GLSLShared",
643 DecorationGLSLShared,
644 SPV_OPCODE_FLAGS_CAPABILITIES,
645 CapabilityShader,
646 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100647 {"GLSLPacked",
648 DecorationGLSLPacked,
649 SPV_OPCODE_FLAGS_CAPABILITIES,
650 CapabilityShader,
651 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400652 {"CPacked",
653 DecorationCPacked,
654 SPV_OPCODE_FLAGS_CAPABILITIES,
655 CapabilityKernel,
656 {SPV_OPERAND_TYPE_NONE}},
657 {"BuiltIn",
658 DecorationBuiltIn,
659 SPV_OPCODE_FLAGS_CAPABILITIES,
660 CapabilityShader,
661 {SPV_OPERAND_TYPE_BUILT_IN, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100662 {"Smooth",
663 DecorationSmooth,
664 SPV_OPCODE_FLAGS_CAPABILITIES,
665 CapabilityShader,
666 {SPV_OPERAND_TYPE_NONE}},
667 {"Noperspective",
668 DecorationNoperspective,
669 SPV_OPCODE_FLAGS_CAPABILITIES,
670 CapabilityShader,
671 {SPV_OPERAND_TYPE_NONE}},
672 {"Flat",
673 DecorationFlat,
674 SPV_OPCODE_FLAGS_CAPABILITIES,
675 CapabilityShader,
676 {SPV_OPERAND_TYPE_NONE}},
677 {"Patch",
678 DecorationPatch,
679 SPV_OPCODE_FLAGS_CAPABILITIES,
680 CapabilityTessellation,
681 {SPV_OPERAND_TYPE_NONE}},
682 {"Centroid",
683 DecorationCentroid,
684 SPV_OPCODE_FLAGS_CAPABILITIES,
685 CapabilityShader,
686 {SPV_OPERAND_TYPE_NONE}},
687 {"Sample",
688 DecorationSample,
689 SPV_OPCODE_FLAGS_CAPABILITIES,
690 CapabilityShader,
691 {SPV_OPERAND_TYPE_NONE}},
692 {"Invariant",
693 DecorationInvariant,
694 SPV_OPCODE_FLAGS_CAPABILITIES,
695 CapabilityShader,
696 {SPV_OPERAND_TYPE_NONE}},
697 {"Restrict",
698 DecorationRestrict,
699 SPV_OPCODE_FLAGS_NONE,
700 0,
701 {SPV_OPERAND_TYPE_NONE}},
702 {"Aliased",
703 DecorationAliased,
704 SPV_OPCODE_FLAGS_NONE,
705 0,
706 {SPV_OPERAND_TYPE_NONE}},
707 {"Volatile",
708 DecorationVolatile,
709 SPV_OPCODE_FLAGS_NONE,
710 0,
711 {SPV_OPERAND_TYPE_NONE}},
712 {"Constant",
713 DecorationConstant,
714 SPV_OPCODE_FLAGS_CAPABILITIES,
715 CapabilityKernel,
716 {SPV_OPERAND_TYPE_NONE}},
717 {"Coherent",
718 DecorationCoherent,
719 SPV_OPCODE_FLAGS_NONE,
720 0,
721 {SPV_OPERAND_TYPE_NONE}},
722 {"Nonwritable",
723 DecorationNonwritable,
724 SPV_OPCODE_FLAGS_NONE,
725 0,
726 {SPV_OPERAND_TYPE_NONE}},
727 {"Nonreadable",
728 DecorationNonreadable,
729 SPV_OPCODE_FLAGS_NONE,
730 0,
731 {SPV_OPERAND_TYPE_NONE}},
732 {"Uniform",
733 DecorationUniform,
734 SPV_OPCODE_FLAGS_CAPABILITIES,
735 CapabilityShader,
736 {SPV_OPERAND_TYPE_NONE}},
737 {"NoStaticUse",
738 DecorationNoStaticUse,
739 SPV_OPCODE_FLAGS_NONE,
740 0,
741 {SPV_OPERAND_TYPE_NONE}},
David Neto37547b22015-09-10 13:23:11 -0400742 {"SaturatedConversion",
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100743 DecorationSaturatedConversion,
744 SPV_OPCODE_FLAGS_CAPABILITIES,
745 CapabilityKernel,
746 {SPV_OPERAND_TYPE_NONE}},
747 {"Stream",
748 DecorationStream,
749 SPV_OPCODE_FLAGS_CAPABILITIES,
750 CapabilityGeometry,
751 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
752 {"Location",
753 DecorationLocation,
754 SPV_OPCODE_FLAGS_CAPABILITIES,
755 CapabilityShader,
756 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
757 {"Component",
758 DecorationComponent,
759 SPV_OPCODE_FLAGS_CAPABILITIES,
760 CapabilityShader,
761 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
762 {"Index",
763 DecorationIndex,
764 SPV_OPCODE_FLAGS_CAPABILITIES,
765 CapabilityShader,
766 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
767 {"Binding",
768 DecorationBinding,
769 SPV_OPCODE_FLAGS_CAPABILITIES,
770 CapabilityShader,
771 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
772 {"DescriptorSet",
773 DecorationDescriptorSet,
774 SPV_OPCODE_FLAGS_CAPABILITIES,
775 CapabilityShader,
776 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
777 {"Offset",
778 DecorationOffset,
779 SPV_OPCODE_FLAGS_NONE,
780 0,
781 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100782 {"XfbBuffer",
783 DecorationXfbBuffer,
784 SPV_OPCODE_FLAGS_CAPABILITIES,
785 CapabilityShader,
786 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400787 {"XfbStride",
788 DecorationXfbStride,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100789 SPV_OPCODE_FLAGS_CAPABILITIES,
790 CapabilityShader,
791 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100792 {"FuncParamAttr",
793 DecorationFuncParamAttr,
794 SPV_OPCODE_FLAGS_CAPABILITIES,
795 CapabilityKernel,
796 {SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE, SPV_OPERAND_TYPE_NONE}},
797 {"FPRoundingMode",
798 DecorationFPRoundingMode,
799 SPV_OPCODE_FLAGS_CAPABILITIES,
800 CapabilityKernel,
801 {SPV_OPERAND_TYPE_FP_ROUNDING_MODE, SPV_OPERAND_TYPE_NONE}},
802 {"FPFastMathMode",
David Neto37547b22015-09-10 13:23:11 -0400803 DecorationFPFastMathMode,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100804 SPV_OPCODE_FLAGS_CAPABILITIES,
805 CapabilityKernel,
806 {SPV_OPERAND_TYPE_FP_FAST_MATH_MODE, SPV_OPERAND_TYPE_NONE}},
807 {"LinkageAttributes",
808 DecorationLinkageAttributes,
809 SPV_OPCODE_FLAGS_CAPABILITIES,
810 CapabilityLinkage,
David Neto55bdfcb2015-09-10 15:51:57 -0400811 {SPV_OPERAND_TYPE_LITERAL_STRING, SPV_OPERAND_TYPE_LINKAGE_TYPE, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100812};
813
814static const spv_operand_desc_t builtInEntries[] = {
815 {"Position",
816 BuiltInPosition,
817 SPV_OPCODE_FLAGS_CAPABILITIES,
818 CapabilityShader,
819 {SPV_OPERAND_TYPE_NONE}},
820 {"PointSize",
821 BuiltInPointSize,
822 SPV_OPCODE_FLAGS_CAPABILITIES,
823 CapabilityShader,
824 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100825 {"ClipDistance",
826 BuiltInClipDistance,
827 SPV_OPCODE_FLAGS_CAPABILITIES,
828 CapabilityShader,
829 {SPV_OPERAND_TYPE_NONE}},
830 {"CullDistance",
831 BuiltInCullDistance,
832 SPV_OPCODE_FLAGS_CAPABILITIES,
833 CapabilityShader,
834 {SPV_OPERAND_TYPE_NONE}},
835 {"VertexId",
836 BuiltInVertexId,
837 SPV_OPCODE_FLAGS_CAPABILITIES,
838 CapabilityShader,
839 {SPV_OPERAND_TYPE_NONE}},
840 {"InstanceId",
841 BuiltInInstanceId,
842 SPV_OPCODE_FLAGS_CAPABILITIES,
843 CapabilityShader,
844 {SPV_OPERAND_TYPE_NONE}},
845 {"PrimitiveId",
846 BuiltInPrimitiveId,
847 SPV_OPCODE_FLAGS_CAPABILITIES,
848 CapabilityGeometry | CapabilityTessellation,
849 {SPV_OPERAND_TYPE_NONE}},
850 {"InvocationId",
851 BuiltInInvocationId,
852 SPV_OPCODE_FLAGS_CAPABILITIES,
853 CapabilityGeometry | CapabilityTessellation,
854 {SPV_OPERAND_TYPE_NONE}},
855 {"Layer",
856 BuiltInLayer,
857 SPV_OPCODE_FLAGS_CAPABILITIES,
858 CapabilityGeometry,
859 {SPV_OPERAND_TYPE_NONE}},
860 {"ViewportIndex",
861 BuiltInViewportIndex,
862 SPV_OPCODE_FLAGS_CAPABILITIES,
863 CapabilityGeometry,
864 {SPV_OPERAND_TYPE_NONE}},
865 {"TessLevelOuter",
866 BuiltInTessLevelOuter,
867 SPV_OPCODE_FLAGS_CAPABILITIES,
868 CapabilityTessellation,
869 {SPV_OPERAND_TYPE_NONE}},
870 {"TessLevelInner",
871 BuiltInTessLevelInner,
872 SPV_OPCODE_FLAGS_CAPABILITIES,
873 CapabilityTessellation,
874 {SPV_OPERAND_TYPE_NONE}},
875 {"TessCoord",
876 BuiltInTessCoord,
877 SPV_OPCODE_FLAGS_CAPABILITIES,
878 CapabilityTessellation,
879 {SPV_OPERAND_TYPE_NONE}},
880 {"PatchVertices",
881 BuiltInPatchVertices,
882 SPV_OPCODE_FLAGS_CAPABILITIES,
883 CapabilityTessellation,
884 {SPV_OPERAND_TYPE_NONE}},
885 {"FragCoord",
886 BuiltInFragCoord,
887 SPV_OPCODE_FLAGS_CAPABILITIES,
888 CapabilityShader,
889 {SPV_OPERAND_TYPE_NONE}},
890 {"PointCoord",
891 BuiltInPointCoord,
892 SPV_OPCODE_FLAGS_CAPABILITIES,
893 CapabilityShader,
894 {SPV_OPERAND_TYPE_NONE}},
895 {"FrontFacing",
896 BuiltInFrontFacing,
897 SPV_OPCODE_FLAGS_CAPABILITIES,
898 CapabilityShader,
899 {SPV_OPERAND_TYPE_NONE}},
900 {"SampleId",
901 BuiltInSampleId,
902 SPV_OPCODE_FLAGS_CAPABILITIES,
903 CapabilityShader,
904 {SPV_OPERAND_TYPE_NONE}},
905 {"SamplePosition",
906 BuiltInSamplePosition,
907 SPV_OPCODE_FLAGS_CAPABILITIES,
908 CapabilityShader,
909 {SPV_OPERAND_TYPE_NONE}},
910 {"SampleMask",
911 BuiltInSampleMask,
912 SPV_OPCODE_FLAGS_CAPABILITIES,
913 CapabilityShader,
914 {SPV_OPERAND_TYPE_NONE}},
915 {"FragColor",
916 BuiltInFragColor,
917 SPV_OPCODE_FLAGS_CAPABILITIES,
918 CapabilityShader,
919 {SPV_OPERAND_TYPE_NONE}},
920 {"FragDepth",
921 BuiltInFragDepth,
922 SPV_OPCODE_FLAGS_CAPABILITIES,
923 CapabilityShader,
924 {SPV_OPERAND_TYPE_NONE}},
925 {"HelperInvocation",
926 BuiltInHelperInvocation,
927 SPV_OPCODE_FLAGS_CAPABILITIES,
928 CapabilityShader,
929 {SPV_OPERAND_TYPE_NONE}},
930 {"NumWorkgroups",
931 BuiltInNumWorkgroups,
932 SPV_OPCODE_FLAGS_NONE,
933 0,
934 {SPV_OPERAND_TYPE_NONE}},
935 {"WorkgroupSize",
936 BuiltInWorkgroupSize,
937 SPV_OPCODE_FLAGS_NONE,
938 0,
939 {SPV_OPERAND_TYPE_NONE}},
940 {"WorkgroupId",
941 BuiltInWorkgroupId,
942 SPV_OPCODE_FLAGS_NONE,
943 0,
944 {SPV_OPERAND_TYPE_NONE}},
945 {"LocalInvocationId",
946 BuiltInLocalInvocationId,
947 SPV_OPCODE_FLAGS_NONE,
948 0,
949 {SPV_OPERAND_TYPE_NONE}},
950 {"GlobalInvocationId",
951 BuiltInGlobalInvocationId,
952 SPV_OPCODE_FLAGS_NONE,
953 0,
954 {SPV_OPERAND_TYPE_NONE}},
955 {"LocalInvocationIndex",
David Neto37547b22015-09-10 13:23:11 -0400956 BuiltInLocalInvocationIndex,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100957 SPV_OPCODE_FLAGS_CAPABILITIES,
958 CapabilityShader,
959 {SPV_OPERAND_TYPE_NONE}},
960 {"WorkDim",
961 BuiltInWorkDim,
962 SPV_OPCODE_FLAGS_CAPABILITIES,
963 CapabilityKernel,
964 {SPV_OPERAND_TYPE_NONE}},
965 {"GlobalSize",
966 BuiltInGlobalSize,
967 SPV_OPCODE_FLAGS_CAPABILITIES,
968 CapabilityKernel,
969 {SPV_OPERAND_TYPE_NONE}},
970 {"EnqueuedWorkgroupSize",
971 BuiltInEnqueuedWorkgroupSize,
972 SPV_OPCODE_FLAGS_CAPABILITIES,
973 CapabilityKernel,
974 {SPV_OPERAND_TYPE_NONE}},
975 {"GlobalOffset",
976 BuiltInGlobalOffset,
977 SPV_OPCODE_FLAGS_CAPABILITIES,
978 CapabilityKernel,
979 {SPV_OPERAND_TYPE_NONE}},
980 {"GlobalLinearId",
981 BuiltInGlobalLinearId,
982 SPV_OPCODE_FLAGS_CAPABILITIES,
983 CapabilityKernel,
984 {SPV_OPERAND_TYPE_NONE}},
985 {"WorkgroupLinearId",
986 BuiltInWorkgroupLinearId,
987 SPV_OPCODE_FLAGS_CAPABILITIES,
988 CapabilityKernel,
989 {SPV_OPERAND_TYPE_NONE}},
990 {"SubgroupSize",
991 BuiltInSubgroupSize,
992 SPV_OPCODE_FLAGS_CAPABILITIES,
993 CapabilityKernel,
994 {SPV_OPERAND_TYPE_NONE}},
995 {"SubgroupMaxSize",
996 BuiltInSubgroupMaxSize,
997 SPV_OPCODE_FLAGS_CAPABILITIES,
998 CapabilityKernel,
999 {SPV_OPERAND_TYPE_NONE}},
1000 {"NumSubgroups",
1001 BuiltInNumSubgroups,
1002 SPV_OPCODE_FLAGS_CAPABILITIES,
1003 CapabilityKernel,
1004 {SPV_OPERAND_TYPE_NONE}},
1005 {"NumEnqueuedSubgroups",
1006 BuiltInNumEnqueuedSubgroups,
1007 SPV_OPCODE_FLAGS_CAPABILITIES,
1008 CapabilityKernel,
1009 {SPV_OPERAND_TYPE_NONE}},
1010 {"SubgroupId",
David Neto37547b22015-09-10 13:23:11 -04001011 BuiltInSubgroupId,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001012 SPV_OPCODE_FLAGS_CAPABILITIES,
1013 CapabilityKernel,
1014 {SPV_OPERAND_TYPE_NONE}},
1015 {"SubgroupLocalInvocationId",
1016 BuiltInSubgroupLocalInvocationId,
1017 SPV_OPCODE_FLAGS_CAPABILITIES,
1018 CapabilityKernel,
1019 {SPV_OPERAND_TYPE_NONE}},
1020};
1021
1022static const spv_operand_desc_t selectionControlEntries[] = {
1023 {"None",
1024 SelectionControlMaskNone,
1025 SPV_OPCODE_FLAGS_NONE,
1026 0,
1027 {SPV_OPERAND_TYPE_NONE}},
1028 {"Flatten",
1029 SelectionControlFlattenMask,
1030 SPV_OPCODE_FLAGS_NONE,
1031 0,
1032 {SPV_OPERAND_TYPE_NONE}},
1033 {"DontFlatten",
1034 SelectionControlDontFlattenMask,
1035 SPV_OPCODE_FLAGS_NONE,
1036 0,
1037 {SPV_OPERAND_TYPE_NONE}},
1038};
1039
1040static const spv_operand_desc_t loopControlEntries[] = {
1041 {"None",
1042 LoopControlMaskNone,
1043 SPV_OPCODE_FLAGS_NONE,
1044 0,
1045 {SPV_OPERAND_TYPE_NONE}},
1046 {"Unroll",
1047 LoopControlUnrollMask,
1048 SPV_OPCODE_FLAGS_NONE,
1049 0,
1050 {SPV_OPERAND_TYPE_NONE}},
1051 {"DontUnroll",
1052 LoopControlDontUnrollMask,
1053 SPV_OPCODE_FLAGS_NONE,
1054 0,
1055 {SPV_OPERAND_TYPE_NONE}},
1056};
1057
1058static const spv_operand_desc_t functionControlEntries[] = {
1059 {"None",
1060 FunctionControlMaskNone,
1061 SPV_OPCODE_FLAGS_NONE,
1062 0,
1063 {SPV_OPERAND_TYPE_NONE}},
David Netof4fde6c2015-09-14 14:50:37 -04001064 {"Inline",
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001065 FunctionControlInlineMask,
1066 SPV_OPCODE_FLAGS_NONE,
1067 0,
1068 {SPV_OPERAND_TYPE_NONE}},
1069 {"DontInline",
1070 FunctionControlDontInlineMask,
1071 SPV_OPCODE_FLAGS_NONE,
1072 0,
1073 {SPV_OPERAND_TYPE_NONE}},
1074 {"Pure",
1075 FunctionControlPureMask,
1076 SPV_OPCODE_FLAGS_NONE,
1077 0,
1078 {SPV_OPERAND_TYPE_NONE}},
1079 {"Const",
1080 FunctionControlConstMask,
1081 SPV_OPCODE_FLAGS_NONE,
1082 0,
1083 {SPV_OPERAND_TYPE_NONE}},
1084};
1085
1086static const spv_operand_desc_t memorySemanticsEntries[] = {
1087 {"None",
1088 MemorySemanticsMaskNone,
1089 SPV_OPCODE_FLAGS_NONE,
1090 0,
1091 {SPV_OPERAND_TYPE_NONE}},
1092 {"Relaxed",
1093 MemorySemanticsRelaxedMask,
1094 SPV_OPCODE_FLAGS_NONE,
1095 0,
1096 {SPV_OPERAND_TYPE_NONE}},
1097 {"SequentiallyConsistent",
1098 MemorySemanticsSequentiallyConsistentMask,
1099 SPV_OPCODE_FLAGS_NONE,
1100 0,
1101 {SPV_OPERAND_TYPE_NONE}},
1102 {"Acquire",
1103 MemorySemanticsAcquireMask,
1104 SPV_OPCODE_FLAGS_NONE,
1105 0,
1106 {SPV_OPERAND_TYPE_NONE}},
1107 {"Release",
1108 MemorySemanticsReleaseMask,
1109 SPV_OPCODE_FLAGS_NONE,
1110 0,
1111 {SPV_OPERAND_TYPE_NONE}},
1112 {"UniformMemory",
1113 MemorySemanticsUniformMemoryMask,
1114 SPV_OPCODE_FLAGS_CAPABILITIES,
1115 CapabilityShader,
1116 {SPV_OPERAND_TYPE_NONE}},
1117 {"SubgroupMemory",
1118 MemorySemanticsSubgroupMemoryMask,
1119 SPV_OPCODE_FLAGS_NONE,
1120 0,
1121 {SPV_OPERAND_TYPE_NONE}},
1122 {"WorkgroupLocalMemory",
1123 MemorySemanticsWorkgroupLocalMemoryMask,
1124 SPV_OPCODE_FLAGS_NONE,
1125 0,
1126 {SPV_OPERAND_TYPE_NONE}},
1127 {"WorkgroupGlobalMemory",
1128 MemorySemanticsWorkgroupGlobalMemoryMask,
1129 SPV_OPCODE_FLAGS_NONE,
1130 0,
1131 {SPV_OPERAND_TYPE_NONE}},
1132 {"AtomicCounterMemory",
1133 MemorySemanticsAtomicCounterMemoryMask,
1134 SPV_OPCODE_FLAGS_CAPABILITIES,
1135 CapabilityShader,
1136 {SPV_OPERAND_TYPE_NONE}},
1137 {
1138 "ImageMemory",
1139 MemorySemanticsImageMemoryMask,
1140 SPV_OPCODE_FLAGS_NONE,
1141 0,
1142 {SPV_OPERAND_TYPE_NONE},
1143 },
1144};
1145
1146static const spv_operand_desc_t memoryAccessEntries[] = {
1147 {"None",
1148 MemoryAccessMaskNone,
1149 SPV_OPCODE_FLAGS_NONE,
1150 0,
1151 {SPV_OPERAND_TYPE_NONE}},
1152 {"Volatile",
1153 MemoryAccessVolatileMask,
1154 SPV_OPCODE_FLAGS_NONE,
1155 0,
1156 {SPV_OPERAND_TYPE_NONE}},
1157 {
1158 "Aligned",
1159 MemoryAccessAlignedMask,
1160 SPV_OPCODE_FLAGS_NONE,
1161 0,
David Neto4a291312015-09-14 15:08:48 -04001162 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001163 },
1164};
1165
1166static const spv_operand_desc_t scopeEntries[] = {
1167 {"CrossDevice",
1168 ScopeCrossDevice,
1169 SPV_OPCODE_FLAGS_NONE,
1170 0,
1171 {SPV_OPERAND_TYPE_NONE}},
1172 {"Device", ScopeDevice, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_NONE}},
1173 {"Workgroup",
1174 ScopeWorkgroup,
1175 SPV_OPCODE_FLAGS_NONE,
1176 0,
1177 {SPV_OPERAND_TYPE_NONE}},
1178 {"Subgroup",
1179 ScopeSubgroup,
1180 SPV_OPCODE_FLAGS_NONE,
1181 0,
1182 {SPV_OPERAND_TYPE_NONE}},
1183 {
1184 "Invocation",
1185 ScopeInvocation,
1186 SPV_OPCODE_FLAGS_NONE,
1187 0,
1188 {SPV_OPERAND_TYPE_NONE},
1189 },
1190};
1191
1192static const spv_operand_desc_t groupOperationEntries[] = {
1193 {"Reduce",
1194 GroupOperationReduce,
1195 SPV_OPCODE_FLAGS_CAPABILITIES,
1196 CapabilityKernel,
1197 {SPV_OPERAND_TYPE_NONE}},
1198 {"InclusiveScan",
1199 GroupOperationInclusiveScan,
1200 SPV_OPCODE_FLAGS_CAPABILITIES,
1201 CapabilityKernel,
1202 {SPV_OPERAND_TYPE_NONE}},
1203 {"ExclusiveScan",
1204 GroupOperationExclusiveScan,
1205 SPV_OPCODE_FLAGS_CAPABILITIES,
1206 CapabilityKernel,
1207 {SPV_OPERAND_TYPE_NONE}},
1208};
1209
1210static const spv_operand_desc_t kernelKernelEnqueueFlagssEntries[] = {
1211 {"NoWait",
1212 KernelEnqueueFlagsNoWait,
1213 SPV_OPCODE_FLAGS_CAPABILITIES,
1214 CapabilityKernel,
1215 {SPV_OPERAND_TYPE_NONE}},
1216 {"WaitKernel",
1217 KernelEnqueueFlagsWaitKernel,
1218 SPV_OPCODE_FLAGS_CAPABILITIES,
1219 CapabilityKernel,
1220 {SPV_OPERAND_TYPE_NONE}},
1221 {"WaitWorkGroup",
1222 KernelEnqueueFlagsWaitWorkGroup,
1223 SPV_OPCODE_FLAGS_CAPABILITIES,
1224 CapabilityKernel,
1225 {SPV_OPERAND_TYPE_NONE}},
1226};
1227
1228static const spv_operand_desc_t kernelProfilingInfoEntries[] = {
1229 {"None",
1230 KernelProfilingInfoMaskNone,
1231 SPV_OPCODE_FLAGS_NONE,
1232 0,
1233 {SPV_OPERAND_TYPE_NONE}},
1234 {"CmdExecTime",
1235 KernelProfilingInfoCmdExecTimeMask,
1236 SPV_OPCODE_FLAGS_CAPABILITIES,
1237 CapabilityKernel,
1238 {SPV_OPERAND_TYPE_NONE}},
1239};
1240
1241static const spv_operand_desc_t capabilityInfoEntries[] = {
1242 {"Matrix",
1243 CapabilityMatrix,
1244 SPV_OPCODE_FLAGS_NONE,
1245 0,
1246 {SPV_OPERAND_TYPE_NONE}},
1247 {"Shader",
1248 CapabilityShader,
1249 SPV_OPCODE_FLAGS_CAPABILITIES,
1250 CapabilityMatrix,
1251 {SPV_OPERAND_TYPE_NONE}},
1252 {"Geometry",
1253 CapabilityGeometry,
1254 SPV_OPCODE_FLAGS_CAPABILITIES,
1255 CapabilityShader,
1256 {SPV_OPERAND_TYPE_NONE}},
1257 {"Tessellation",
1258 CapabilityTessellation,
1259 SPV_OPCODE_FLAGS_CAPABILITIES,
1260 CapabilityShader,
1261 {SPV_OPERAND_TYPE_NONE}},
1262 {"Addresses",
1263 CapabilityAddresses,
1264 SPV_OPCODE_FLAGS_NONE,
1265 0,
1266 {SPV_OPERAND_TYPE_NONE}},
1267 {"Linkage",
1268 CapabilityLinkage,
1269 SPV_OPCODE_FLAGS_NONE,
1270 0,
1271 {SPV_OPERAND_TYPE_NONE}},
1272 {"Kernel",
1273 CapabilityKernel,
1274 SPV_OPCODE_FLAGS_NONE,
1275 0,
1276 {SPV_OPERAND_TYPE_NONE}},
1277 {"Vector16",
1278 CapabilityVector16,
1279 SPV_OPCODE_FLAGS_NONE,
1280 0,
1281 {SPV_OPERAND_TYPE_NONE}},
1282 {"Float16Buffer",
1283 CapabilityFloat16Buffer,
1284 SPV_OPCODE_FLAGS_NONE,
1285 0,
1286 {SPV_OPERAND_TYPE_NONE}},
1287 {"Float16",
1288 CapabilityFloat16,
1289 SPV_OPCODE_FLAGS_NONE,
1290 0,
1291 {SPV_OPERAND_TYPE_NONE}},
1292 {"Float64",
1293 CapabilityFloat64,
1294 SPV_OPCODE_FLAGS_NONE,
1295 0,
1296 {SPV_OPERAND_TYPE_NONE}},
1297 {"Int64",
1298 CapabilityInt64,
1299 SPV_OPCODE_FLAGS_NONE,
1300 0,
1301 {SPV_OPERAND_TYPE_NONE}},
1302 {"Int64Atomics",
1303 CapabilityInt64Atomics,
1304 SPV_OPCODE_FLAGS_NONE,
1305 0,
1306 {SPV_OPERAND_TYPE_NONE}},
1307 {"ImageBasic",
1308 CapabilityImageBasic,
1309 SPV_OPCODE_FLAGS_NONE,
1310 0,
1311 {SPV_OPERAND_TYPE_NONE}},
1312 {"ImageReadWrite",
1313 CapabilityImageReadWrite,
1314 SPV_OPCODE_FLAGS_NONE,
1315 0,
1316 {SPV_OPERAND_TYPE_NONE}},
David Netoc6402d62015-09-10 16:39:09 -04001317 {"ImageMipmap",
1318 CapabilityImageMipmap,
1319 SPV_OPCODE_FLAGS_NONE,
1320 0,
1321 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001322 {"ImageSRGBWrite",
1323 CapabilityImageSRGBWrite,
1324 SPV_OPCODE_FLAGS_NONE,
1325 0,
1326 {SPV_OPERAND_TYPE_NONE}},
1327 {"Pipes",
1328 CapabilityPipes,
1329 SPV_OPCODE_FLAGS_NONE,
1330 0,
1331 {SPV_OPERAND_TYPE_NONE}},
1332 {"Groups",
1333 CapabilityGroups,
1334 SPV_OPCODE_FLAGS_NONE,
1335 0,
1336 {SPV_OPERAND_TYPE_NONE}},
1337 {"DeviceEnqueue",
1338 CapabilityDeviceEnqueue,
1339 SPV_OPCODE_FLAGS_NONE,
1340 0,
1341 {SPV_OPERAND_TYPE_NONE}},
David Netoc6402d62015-09-10 16:39:09 -04001342// A macro for defining a capability that doesn't depend on other capabilities.
David Netoe994e2e2015-09-11 12:15:58 -04001343// TODO(dneto): Rev32 adds many dependencies between capbilities.
David Netoc6402d62015-09-10 16:39:09 -04001344#define CASE(NAME) { #NAME, Capability##NAME, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_NONE}}
1345 CASE(LiteralSampler),
1346 CASE(AtomicStorage),
1347 CASE(Int16),
1348 CASE(TessellationPointSize),
1349 CASE(GeometryPointSize),
1350 CASE(ImageGatherExtended),
1351 CASE(StorageImageExtendedFormats),
1352 CASE(StorageImageMultisample),
1353 CASE(UniformBufferArrayDynamicIndexing),
1354 CASE(SampledImageArrayDynamicIndexing),
1355 CASE(StorageBufferArrayDynamicIndexing),
1356 CASE(StorageImageArrayDynamicIndexing),
1357 CASE(ClipDistance),
1358 CASE(CullDistance),
1359 CASE(ImageCubeArray),
1360 CASE(SampleRateShading),
1361#undef CASE
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001362};
1363
1364static const spv_operand_desc_group_t opcodeEntryTypes[] = {
1365 {SPV_OPERAND_TYPE_SOURCE_LANGUAGE,
1366 sizeof(sourceLanguageEntries) / sizeof(spv_operand_desc_t),
1367 sourceLanguageEntries},
1368 {SPV_OPERAND_TYPE_EXECUTION_MODEL,
1369 sizeof(executionModelEntries) / sizeof(spv_operand_desc_t),
1370 executionModelEntries},
1371 {SPV_OPERAND_TYPE_ADDRESSING_MODEL,
1372 sizeof(addressingModelEntries) / sizeof(spv_operand_desc_t),
1373 addressingModelEntries},
1374 {SPV_OPERAND_TYPE_MEMORY_MODEL,
1375 sizeof(memoryModelEntries) / sizeof(spv_operand_desc_t),
1376 memoryModelEntries},
1377 {SPV_OPERAND_TYPE_EXECUTION_MODE,
1378 sizeof(executionModeEntries) / sizeof(spv_operand_desc_t),
1379 executionModeEntries},
1380 {SPV_OPERAND_TYPE_STORAGE_CLASS,
1381 sizeof(storageClassEntries) / sizeof(spv_operand_desc_t),
1382 storageClassEntries},
1383 {SPV_OPERAND_TYPE_DIMENSIONALITY,
1384 sizeof(dimensionalityEntries) / sizeof(spv_operand_desc_t),
1385 dimensionalityEntries},
1386 {SPV_OPERAND_TYPE_SAMPLER_ADDRESSING_MODE,
1387 sizeof(samplerAddressingModeEntries) / sizeof(spv_operand_desc_t),
1388 samplerAddressingModeEntries},
1389 {SPV_OPERAND_TYPE_SAMPLER_FILTER_MODE,
1390 sizeof(samplerFilterModeEntries) / sizeof(spv_operand_desc_t),
1391 samplerFilterModeEntries},
David Netob30a0c52015-09-16 15:56:43 -04001392 {SPV_OPERAND_TYPE_SAMPLER_IMAGE_FORMAT,
1393 sizeof(samplerImageFormatEntries) / sizeof(spv_operand_desc_t),
1394 samplerImageFormatEntries},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001395 {SPV_OPERAND_TYPE_FP_FAST_MATH_MODE,
1396 sizeof(fpFastMathModeEntries) / sizeof(spv_operand_desc_t),
1397 fpFastMathModeEntries},
1398 {SPV_OPERAND_TYPE_FP_ROUNDING_MODE,
1399 sizeof(fpRoundingModeEntries) / sizeof(spv_operand_desc_t),
1400 fpRoundingModeEntries},
1401 {SPV_OPERAND_TYPE_LINKAGE_TYPE,
1402 sizeof(linkageTypeEntries) / sizeof(spv_operand_desc_t),
1403 linkageTypeEntries},
1404 {SPV_OPERAND_TYPE_ACCESS_QUALIFIER,
1405 sizeof(accessQualifierEntries) / sizeof(spv_operand_desc_t),
1406 accessQualifierEntries},
1407 {SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE,
1408 sizeof(functionParameterAttributeEntries) / sizeof(spv_operand_desc_t),
1409 functionParameterAttributeEntries},
1410 {SPV_OPERAND_TYPE_DECORATION,
1411 sizeof(decorationEntries) / sizeof(spv_operand_desc_t), decorationEntries},
1412 {SPV_OPERAND_TYPE_BUILT_IN,
1413 sizeof(builtInEntries) / sizeof(spv_operand_desc_t), builtInEntries},
1414 {SPV_OPERAND_TYPE_SELECTION_CONTROL,
1415 sizeof(selectionControlEntries) / sizeof(spv_operand_desc_t),
1416 selectionControlEntries},
1417 {SPV_OPERAND_TYPE_LOOP_CONTROL,
1418 sizeof(loopControlEntries) / sizeof(spv_operand_desc_t),
1419 loopControlEntries},
1420 {SPV_OPERAND_TYPE_FUNCTION_CONTROL,
1421 sizeof(functionControlEntries) / sizeof(spv_operand_desc_t),
1422 functionControlEntries},
1423 {SPV_OPERAND_TYPE_MEMORY_SEMANTICS,
1424 sizeof(memorySemanticsEntries) / sizeof(spv_operand_desc_t),
1425 memorySemanticsEntries},
David Neto78c3b432015-08-27 13:03:52 -04001426 {SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001427 sizeof(memoryAccessEntries) / sizeof(spv_operand_desc_t),
1428 memoryAccessEntries},
1429 {SPV_OPERAND_TYPE_EXECUTION_SCOPE,
1430 sizeof(scopeEntries) / sizeof(spv_operand_desc_t), scopeEntries},
1431 {SPV_OPERAND_TYPE_GROUP_OPERATION,
1432 sizeof(groupOperationEntries) / sizeof(spv_operand_desc_t),
1433 groupOperationEntries},
1434 {SPV_OPERAND_TYPE_KERNEL_ENQ_FLAGS,
1435 sizeof(kernelKernelEnqueueFlagssEntries) / sizeof(spv_operand_desc_t),
1436 kernelKernelEnqueueFlagssEntries},
David Neto47994822015-08-27 13:11:01 -04001437 {SPV_OPERAND_TYPE_KERNEL_PROFILING_INFO,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001438 sizeof(kernelProfilingInfoEntries) / sizeof(spv_operand_desc_t),
1439 kernelProfilingInfoEntries},
1440 {SPV_OPERAND_TYPE_CAPABILITY,
1441 sizeof(capabilityInfoEntries) / sizeof(spv_operand_desc_t),
1442 capabilityInfoEntries},
1443};
1444
1445spv_result_t spvOperandTableGet(spv_operand_table *pOperandTable) {
Lei Zhang40056702015-09-11 14:31:27 -04001446 if (!pOperandTable) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001447
1448 static const spv_operand_table_t table = {
1449 sizeof(opcodeEntryTypes) / sizeof(spv_operand_desc_group_t),
1450 opcodeEntryTypes};
1451
1452 *pOperandTable = &table;
1453
1454 return SPV_SUCCESS;
1455}
1456
1457spv_result_t spvOperandTableNameLookup(const spv_operand_table table,
1458 const spv_operand_type_t type,
David Neto388c40d2015-09-16 16:42:56 -04001459 const char* name,
1460 const size_t nameLength,
1461 spv_operand_desc* pEntry) {
Lei Zhang40056702015-09-11 14:31:27 -04001462 if (!table) return SPV_ERROR_INVALID_TABLE;
1463 if (!name || !pEntry) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001464
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001465 for (uint64_t typeIndex = 0; typeIndex < table->count; ++typeIndex) {
1466 if (type == table->types[typeIndex].type) {
1467 for (uint64_t operandIndex = 0;
1468 operandIndex < table->types[typeIndex].count; ++operandIndex) {
1469 if (nameLength ==
1470 strlen(table->types[typeIndex].entries[operandIndex].name) &&
1471 !strncmp(table->types[typeIndex].entries[operandIndex].name, name,
David Neto388c40d2015-09-16 16:42:56 -04001472 nameLength)) {
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001473 *pEntry = &table->types[typeIndex].entries[operandIndex];
1474 return SPV_SUCCESS;
1475 }
1476 }
1477 }
1478 }
1479
1480 return SPV_ERROR_INVALID_LOOKUP;
1481}
1482
1483spv_result_t spvOperandTableValueLookup(const spv_operand_table table,
1484 const spv_operand_type_t type,
1485 const uint32_t value,
1486 spv_operand_desc *pEntry) {
Lei Zhang40056702015-09-11 14:31:27 -04001487 if (!table) return SPV_ERROR_INVALID_TABLE;
1488 if (!pEntry) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001489
1490 for (uint64_t typeIndex = 0; typeIndex < table->count; ++typeIndex) {
1491 if (type == table->types[typeIndex].type) {
1492 for (uint64_t operandIndex = 0;
1493 operandIndex < table->types[typeIndex].count; ++operandIndex) {
1494 if (value == table->types[typeIndex].entries[operandIndex].value) {
1495 *pEntry = &table->types[typeIndex].entries[operandIndex];
1496 return SPV_SUCCESS;
1497 }
1498 }
1499 }
1500 }
1501
1502 return SPV_ERROR_INVALID_LOOKUP;
1503}
1504
1505const char *spvOperandTypeStr(spv_operand_type_t type) {
1506 switch (type) {
1507 case SPV_OPERAND_TYPE_ID:
David Netofadbf622015-09-14 17:07:11 -04001508 case SPV_OPERAND_TYPE_OPTIONAL_ID:
1509 case SPV_OPERAND_TYPE_ID_IN_OPTIONAL_TUPLE:
1510 return "ID";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001511 case SPV_OPERAND_TYPE_RESULT_ID:
1512 return "result ID";
1513 case SPV_OPERAND_TYPE_LITERAL:
1514 return "literal";
1515 case SPV_OPERAND_TYPE_LITERAL_NUMBER:
1516 return "literal number";
Lei Zhangb41d1502015-09-14 15:22:23 -04001517 case SPV_OPERAND_TYPE_MULTIWORD_LITERAL_NUMBER:
1518 return "multiple word literal number";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001519 case SPV_OPERAND_TYPE_LITERAL_STRING:
1520 return "literal string";
1521 case SPV_OPERAND_TYPE_SOURCE_LANGUAGE:
1522 return "source langauge";
1523 case SPV_OPERAND_TYPE_EXECUTION_MODEL:
1524 return "execution model";
1525 case SPV_OPERAND_TYPE_ADDRESSING_MODEL:
1526 return "addressing model";
1527 case SPV_OPERAND_TYPE_MEMORY_MODEL:
1528 return "memory model";
1529 case SPV_OPERAND_TYPE_EXECUTION_MODE:
1530 return "execution mode";
1531 case SPV_OPERAND_TYPE_STORAGE_CLASS:
1532 return "storage class";
1533 case SPV_OPERAND_TYPE_DIMENSIONALITY:
1534 return "dimensionality";
1535 case SPV_OPERAND_TYPE_SAMPLER_ADDRESSING_MODE:
1536 return "addressing mode";
1537 case SPV_OPERAND_TYPE_SAMPLER_FILTER_MODE:
1538 return "sampler filter mode";
David Netob30a0c52015-09-16 15:56:43 -04001539 case SPV_OPERAND_TYPE_SAMPLER_IMAGE_FORMAT:
1540 return "sampler image format";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001541 case SPV_OPERAND_TYPE_FP_FAST_MATH_MODE:
1542 return "floating pointer fast math mode";
1543 case SPV_OPERAND_TYPE_FP_ROUNDING_MODE:
1544 return "floating point rounding mode";
1545 case SPV_OPERAND_TYPE_LINKAGE_TYPE:
1546 return "linkage type";
1547 case SPV_OPERAND_TYPE_ACCESS_QUALIFIER:
1548 return "access qualifier";
1549 case SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE:
1550 return "function parameter attribute";
1551 case SPV_OPERAND_TYPE_DECORATION:
1552 return "decoration";
1553 case SPV_OPERAND_TYPE_BUILT_IN:
1554 return "built in";
1555 case SPV_OPERAND_TYPE_SELECTION_CONTROL:
1556 return "selection control";
1557 case SPV_OPERAND_TYPE_LOOP_CONTROL:
1558 return "loop control";
1559 case SPV_OPERAND_TYPE_FUNCTION_CONTROL:
1560 return "function control";
1561 case SPV_OPERAND_TYPE_MEMORY_SEMANTICS:
1562 return "memory semantics";
David Neto78c3b432015-08-27 13:03:52 -04001563 case SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001564 return "memory access";
1565 case SPV_OPERAND_TYPE_EXECUTION_SCOPE:
David Netofadbf622015-09-14 17:07:11 -04001566 return "execution scope ID";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001567 case SPV_OPERAND_TYPE_GROUP_OPERATION:
1568 return "group operation";
1569 case SPV_OPERAND_TYPE_KERNEL_ENQ_FLAGS:
1570 return "kernel enqeue flags";
David Neto47994822015-08-27 13:11:01 -04001571 case SPV_OPERAND_TYPE_KERNEL_PROFILING_INFO:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001572 return "kernel profiling info";
1573 case SPV_OPERAND_TYPE_CAPABILITY:
1574 return "capability";
David Neto78c3b432015-08-27 13:03:52 -04001575 case SPV_OPERAND_TYPE_NONE:
1576 return "NONE";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001577 default:
1578 assert(0 && "Unhandled operand type!");
1579 break;
1580 }
1581 return "unknown";
1582}
David Neto78c3b432015-08-27 13:03:52 -04001583
1584void spvPrependOperandTypes(const spv_operand_type_t* types,
1585 spv_operand_pattern_t* pattern) {
1586 const spv_operand_type_t* endTypes;
1587 for (endTypes = types ; *endTypes != SPV_OPERAND_TYPE_NONE ; ++endTypes)
1588 ;
1589 pattern->insert(pattern->begin(), types, endTypes);
1590}
1591
1592bool spvOperandIsOptional(spv_operand_type_t type) {
1593 // Variable means zero or more times.
1594 if (spvOperandIsVariable(type))
1595 return true;
1596
1597 switch (type) {
1598 case SPV_OPERAND_TYPE_OPTIONAL_ID:
1599 case SPV_OPERAND_TYPE_OPTIONAL_IMAGE:
1600 case SPV_OPERAND_TYPE_OPTIONAL_LITERAL:
1601 case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_STRING:
1602 case SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS:
1603 case SPV_OPERAND_TYPE_OPTIONAL_EXECUTION_MODE:
1604 return true;
1605 default:
1606 break;
1607 }
1608 return false;
1609}
1610
1611bool spvOperandIsVariable(spv_operand_type_t type) {
1612 switch (type) {
1613 case SPV_OPERAND_TYPE_VARIABLE_ID:
1614 case SPV_OPERAND_TYPE_VARIABLE_LITERAL:
1615 case SPV_OPERAND_TYPE_VARIABLE_ID_LITERAL:
1616 case SPV_OPERAND_TYPE_VARIABLE_LITERAL_ID:
1617 case SPV_OPERAND_TYPE_VARIABLE_MEMORY_ACCESS:
1618 case SPV_OPERAND_TYPE_VARIABLE_EXECUTION_MODE:
1619 return true;
1620 default:
1621 break;
1622 }
1623 return false;
1624}
1625
1626
1627bool spvExpandOperandSequenceOnce(spv_operand_type_t type,
1628 spv_operand_pattern_t* pattern) {
1629 switch (type) {
1630 case SPV_OPERAND_TYPE_VARIABLE_ID:
1631 pattern->insert(pattern->begin(), {SPV_OPERAND_TYPE_OPTIONAL_ID, type});
1632 return true;
1633 case SPV_OPERAND_TYPE_VARIABLE_LITERAL:
1634 pattern->insert(pattern->begin(),
1635 {SPV_OPERAND_TYPE_OPTIONAL_LITERAL, type});
1636 return true;
1637 case SPV_OPERAND_TYPE_VARIABLE_LITERAL_ID:
1638 // Represents Zero or more (Literal, Id) pairs.
1639 pattern->insert(pattern->begin(),
1640 {SPV_OPERAND_TYPE_OPTIONAL_LITERAL,
1641 SPV_OPERAND_TYPE_ID_IN_OPTIONAL_TUPLE, type});
1642 return true;
1643 case SPV_OPERAND_TYPE_VARIABLE_ID_LITERAL:
1644 // Represents Zero or more (Id, Literal) pairs.
1645 pattern->insert(pattern->begin(),
1646 {SPV_OPERAND_TYPE_OPTIONAL_ID,
1647 SPV_OPERAND_TYPE_LITERAL_IN_OPTIONAL_TUPLE, type});
1648 return true;
1649 case SPV_OPERAND_TYPE_VARIABLE_MEMORY_ACCESS:
1650 pattern->insert(pattern->begin(), {SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS, type});
1651 return true;
1652 case SPV_OPERAND_TYPE_VARIABLE_EXECUTION_MODE:
1653 pattern->insert(pattern->begin(), {SPV_OPERAND_TYPE_OPTIONAL_EXECUTION_MODE, type});
1654 return true;
1655 default:
1656 break;
1657 }
1658 return false;
1659}
1660
1661spv_operand_type_t spvTakeFirstMatchableOperand(spv_operand_pattern_t* pattern) {
1662 assert(!pattern->empty());
1663 spv_operand_type_t result;
1664 do {
1665 result = pattern->front();
1666 pattern->pop_front();
1667 } while(spvExpandOperandSequenceOnce(result, pattern));
1668 return result;
1669}