blob: c71413777bfad1101d6f7f879a25289edbd1d214 [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}},
525 {"NoCapabilityture",
526 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}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100685 {"FPSaturatedConversion",
686 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",
746 DecorationFPRoundingMode,
747 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,
754 {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",
899 BuiltInLocalInvocationId,
900 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",
954 BuiltInSampleId,
955 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}},
1260 {"ImageSRGBWrite",
1261 CapabilityImageSRGBWrite,
1262 SPV_OPCODE_FLAGS_NONE,
1263 0,
1264 {SPV_OPERAND_TYPE_NONE}},
1265 {"Pipes",
1266 CapabilityPipes,
1267 SPV_OPCODE_FLAGS_NONE,
1268 0,
1269 {SPV_OPERAND_TYPE_NONE}},
1270 {"Groups",
1271 CapabilityGroups,
1272 SPV_OPCODE_FLAGS_NONE,
1273 0,
1274 {SPV_OPERAND_TYPE_NONE}},
1275 {"DeviceEnqueue",
1276 CapabilityDeviceEnqueue,
1277 SPV_OPCODE_FLAGS_NONE,
1278 0,
1279 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang7e751582015-08-18 09:49:04 -04001280 {"LiteralSampler",
1281 CapabilityLiteralSampler,
1282 SPV_OPCODE_FLAGS_NONE,
1283 0,
1284 {SPV_OPERAND_TYPE_NONE}},
1285 {"AtomicStorage",
1286 CapabilityAtomicStorage,
1287 SPV_OPCODE_FLAGS_NONE,
1288 0,
1289 {SPV_OPERAND_TYPE_NONE}},
1290 {"Int16",
1291 CapabilityInt16,
1292 SPV_OPCODE_FLAGS_NONE,
1293 0,
1294 {SPV_OPERAND_TYPE_NONE}},
1295 {"TessellationPointSize",
1296 CapabilityTessellationPointSize,
1297 SPV_OPCODE_FLAGS_CAPABILITIES,
1298 CapabilityTessellation,
1299 {SPV_OPERAND_TYPE_NONE}},
1300 {"GeometryPointSize",
1301 CapabilityGeometryPointSize,
1302 SPV_OPCODE_FLAGS_CAPABILITIES,
1303 CapabilityGeometry,
1304 {SPV_OPERAND_TYPE_NONE}},
1305 {"ImageGatherExtended",
1306 CapabilityImageGatherExtended,
1307 SPV_OPCODE_FLAGS_NONE,
1308 0,
1309 {SPV_OPERAND_TYPE_NONE}},
1310 {"StorageImageExtendedFormats",
1311 CapabilityStorageImageExtendedFormats,
1312 SPV_OPCODE_FLAGS_NONE,
1313 0,
1314 {SPV_OPERAND_TYPE_NONE}},
1315 {"StorageImageMultisample",
1316 CapabilityStorageImageMultisample,
1317 SPV_OPCODE_FLAGS_NONE,
1318 0,
1319 {SPV_OPERAND_TYPE_NONE}},
1320 {"UniformBufferArrayDynamicIndexing",
1321 CapabilityUniformBufferArrayDynamicIndexing,
1322 SPV_OPCODE_FLAGS_NONE,
1323 0,
1324 {SPV_OPERAND_TYPE_NONE}},
1325 {"SampledImageArrayDynamicIndexing",
1326 CapabilitySampledImageArrayDynamicIndexing,
1327 SPV_OPCODE_FLAGS_NONE,
1328 0,
1329 {SPV_OPERAND_TYPE_NONE}},
1330 {"StorageBufferArrayDynamicIndexing",
1331 CapabilityStorageBufferArrayDynamicIndexing,
1332 SPV_OPCODE_FLAGS_NONE,
1333 0,
1334 {SPV_OPERAND_TYPE_NONE}},
1335 {"StorageImageArrayDynamicIndexing",
1336 CapabilityStorageImageArrayDynamicIndexing,
1337 SPV_OPCODE_FLAGS_NONE,
1338 0,
1339 {SPV_OPERAND_TYPE_NONE}},
1340 {"ClipDistance",
1341 CapabilityClipDistance,
1342 SPV_OPCODE_FLAGS_CAPABILITIES,
1343 CapabilityShader,
1344 {SPV_OPERAND_TYPE_NONE}},
1345 {"CullDistance",
1346 CapabilityCullDistance,
1347 SPV_OPCODE_FLAGS_CAPABILITIES,
1348 CapabilityShader,
1349 {SPV_OPERAND_TYPE_NONE}},
1350 {"ImageCubeArray",
1351 CapabilityImageCubeArray,
1352 SPV_OPCODE_FLAGS_NONE,
1353 0,
1354 {SPV_OPERAND_TYPE_NONE}},
1355 {"SampleRateShading",
1356 CapabilitySampleRateShading,
1357 SPV_OPCODE_FLAGS_CAPABILITIES,
1358 CapabilityShader,
1359 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001360};
1361
1362static const spv_operand_desc_group_t opcodeEntryTypes[] = {
1363 {SPV_OPERAND_TYPE_SOURCE_LANGUAGE,
1364 sizeof(sourceLanguageEntries) / sizeof(spv_operand_desc_t),
1365 sourceLanguageEntries},
1366 {SPV_OPERAND_TYPE_EXECUTION_MODEL,
1367 sizeof(executionModelEntries) / sizeof(spv_operand_desc_t),
1368 executionModelEntries},
1369 {SPV_OPERAND_TYPE_ADDRESSING_MODEL,
1370 sizeof(addressingModelEntries) / sizeof(spv_operand_desc_t),
1371 addressingModelEntries},
1372 {SPV_OPERAND_TYPE_MEMORY_MODEL,
1373 sizeof(memoryModelEntries) / sizeof(spv_operand_desc_t),
1374 memoryModelEntries},
1375 {SPV_OPERAND_TYPE_EXECUTION_MODE,
1376 sizeof(executionModeEntries) / sizeof(spv_operand_desc_t),
1377 executionModeEntries},
1378 {SPV_OPERAND_TYPE_STORAGE_CLASS,
1379 sizeof(storageClassEntries) / sizeof(spv_operand_desc_t),
1380 storageClassEntries},
1381 {SPV_OPERAND_TYPE_DIMENSIONALITY,
1382 sizeof(dimensionalityEntries) / sizeof(spv_operand_desc_t),
1383 dimensionalityEntries},
1384 {SPV_OPERAND_TYPE_SAMPLER_ADDRESSING_MODE,
1385 sizeof(samplerAddressingModeEntries) / sizeof(spv_operand_desc_t),
1386 samplerAddressingModeEntries},
1387 {SPV_OPERAND_TYPE_SAMPLER_FILTER_MODE,
1388 sizeof(samplerFilterModeEntries) / sizeof(spv_operand_desc_t),
1389 samplerFilterModeEntries},
1390 {SPV_OPERAND_TYPE_FP_FAST_MATH_MODE,
1391 sizeof(fpFastMathModeEntries) / sizeof(spv_operand_desc_t),
1392 fpFastMathModeEntries},
1393 {SPV_OPERAND_TYPE_FP_ROUNDING_MODE,
1394 sizeof(fpRoundingModeEntries) / sizeof(spv_operand_desc_t),
1395 fpRoundingModeEntries},
1396 {SPV_OPERAND_TYPE_LINKAGE_TYPE,
1397 sizeof(linkageTypeEntries) / sizeof(spv_operand_desc_t),
1398 linkageTypeEntries},
1399 {SPV_OPERAND_TYPE_ACCESS_QUALIFIER,
1400 sizeof(accessQualifierEntries) / sizeof(spv_operand_desc_t),
1401 accessQualifierEntries},
1402 {SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE,
1403 sizeof(functionParameterAttributeEntries) / sizeof(spv_operand_desc_t),
1404 functionParameterAttributeEntries},
1405 {SPV_OPERAND_TYPE_DECORATION,
1406 sizeof(decorationEntries) / sizeof(spv_operand_desc_t), decorationEntries},
1407 {SPV_OPERAND_TYPE_BUILT_IN,
1408 sizeof(builtInEntries) / sizeof(spv_operand_desc_t), builtInEntries},
1409 {SPV_OPERAND_TYPE_SELECTION_CONTROL,
1410 sizeof(selectionControlEntries) / sizeof(spv_operand_desc_t),
1411 selectionControlEntries},
1412 {SPV_OPERAND_TYPE_LOOP_CONTROL,
1413 sizeof(loopControlEntries) / sizeof(spv_operand_desc_t),
1414 loopControlEntries},
1415 {SPV_OPERAND_TYPE_FUNCTION_CONTROL,
1416 sizeof(functionControlEntries) / sizeof(spv_operand_desc_t),
1417 functionControlEntries},
1418 {SPV_OPERAND_TYPE_MEMORY_SEMANTICS,
1419 sizeof(memorySemanticsEntries) / sizeof(spv_operand_desc_t),
1420 memorySemanticsEntries},
1421 {SPV_OPERAND_TYPE_MEMORY_ACCESS,
1422 sizeof(memoryAccessEntries) / sizeof(spv_operand_desc_t),
1423 memoryAccessEntries},
1424 {SPV_OPERAND_TYPE_EXECUTION_SCOPE,
1425 sizeof(scopeEntries) / sizeof(spv_operand_desc_t), scopeEntries},
1426 {SPV_OPERAND_TYPE_GROUP_OPERATION,
1427 sizeof(groupOperationEntries) / sizeof(spv_operand_desc_t),
1428 groupOperationEntries},
1429 {SPV_OPERAND_TYPE_KERNEL_ENQ_FLAGS,
1430 sizeof(kernelKernelEnqueueFlagssEntries) / sizeof(spv_operand_desc_t),
1431 kernelKernelEnqueueFlagssEntries},
David Neto47994822015-08-27 13:11:01 -04001432 {SPV_OPERAND_TYPE_KERNEL_PROFILING_INFO,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001433 sizeof(kernelProfilingInfoEntries) / sizeof(spv_operand_desc_t),
1434 kernelProfilingInfoEntries},
1435 {SPV_OPERAND_TYPE_CAPABILITY,
1436 sizeof(capabilityInfoEntries) / sizeof(spv_operand_desc_t),
1437 capabilityInfoEntries},
1438};
1439
1440spv_result_t spvOperandTableGet(spv_operand_table *pOperandTable) {
1441 spvCheck(!pOperandTable, return SPV_ERROR_INVALID_POINTER);
1442
1443 static const spv_operand_table_t table = {
1444 sizeof(opcodeEntryTypes) / sizeof(spv_operand_desc_group_t),
1445 opcodeEntryTypes};
1446
1447 *pOperandTable = &table;
1448
1449 return SPV_SUCCESS;
1450}
1451
1452spv_result_t spvOperandTableNameLookup(const spv_operand_table table,
1453 const spv_operand_type_t type,
1454 const char *name,
1455 spv_operand_desc *pEntry) {
1456 spvCheck(!table, return SPV_ERROR_INVALID_TABLE);
1457 spvCheck(!name || !pEntry, return SPV_ERROR_INVALID_POINTER);
1458
1459 const uint64_t nameLength = strlen(name);
1460 for (uint64_t typeIndex = 0; typeIndex < table->count; ++typeIndex) {
1461 if (type == table->types[typeIndex].type) {
1462 for (uint64_t operandIndex = 0;
1463 operandIndex < table->types[typeIndex].count; ++operandIndex) {
1464 if (nameLength ==
1465 strlen(table->types[typeIndex].entries[operandIndex].name) &&
1466 !strncmp(table->types[typeIndex].entries[operandIndex].name, name,
1467 strlen(name))) {
1468 *pEntry = &table->types[typeIndex].entries[operandIndex];
1469 return SPV_SUCCESS;
1470 }
1471 }
1472 }
1473 }
1474
1475 return SPV_ERROR_INVALID_LOOKUP;
1476}
1477
1478spv_result_t spvOperandTableValueLookup(const spv_operand_table table,
1479 const spv_operand_type_t type,
1480 const uint32_t value,
1481 spv_operand_desc *pEntry) {
1482 spvCheck(!table, return SPV_ERROR_INVALID_TABLE);
1483 spvCheck(!pEntry, return SPV_ERROR_INVALID_POINTER);
1484
1485 for (uint64_t typeIndex = 0; typeIndex < table->count; ++typeIndex) {
1486 if (type == table->types[typeIndex].type) {
1487 for (uint64_t operandIndex = 0;
1488 operandIndex < table->types[typeIndex].count; ++operandIndex) {
1489 if (value == table->types[typeIndex].entries[operandIndex].value) {
1490 *pEntry = &table->types[typeIndex].entries[operandIndex];
1491 return SPV_SUCCESS;
1492 }
1493 }
1494 }
1495 }
1496
1497 return SPV_ERROR_INVALID_LOOKUP;
1498}
1499
1500const char *spvOperandTypeStr(spv_operand_type_t type) {
1501 switch (type) {
1502 case SPV_OPERAND_TYPE_ID:
1503 return "id";
1504 case SPV_OPERAND_TYPE_RESULT_ID:
1505 return "result ID";
1506 case SPV_OPERAND_TYPE_LITERAL:
1507 return "literal";
1508 case SPV_OPERAND_TYPE_LITERAL_NUMBER:
1509 return "literal number";
1510 case SPV_OPERAND_TYPE_LITERAL_STRING:
1511 return "literal string";
1512 case SPV_OPERAND_TYPE_SOURCE_LANGUAGE:
1513 return "source langauge";
1514 case SPV_OPERAND_TYPE_EXECUTION_MODEL:
1515 return "execution model";
1516 case SPV_OPERAND_TYPE_ADDRESSING_MODEL:
1517 return "addressing model";
1518 case SPV_OPERAND_TYPE_MEMORY_MODEL:
1519 return "memory model";
1520 case SPV_OPERAND_TYPE_EXECUTION_MODE:
1521 return "execution mode";
1522 case SPV_OPERAND_TYPE_STORAGE_CLASS:
1523 return "storage class";
1524 case SPV_OPERAND_TYPE_DIMENSIONALITY:
1525 return "dimensionality";
1526 case SPV_OPERAND_TYPE_SAMPLER_ADDRESSING_MODE:
1527 return "addressing mode";
1528 case SPV_OPERAND_TYPE_SAMPLER_FILTER_MODE:
1529 return "sampler filter mode";
1530 case SPV_OPERAND_TYPE_FP_FAST_MATH_MODE:
1531 return "floating pointer fast math mode";
1532 case SPV_OPERAND_TYPE_FP_ROUNDING_MODE:
1533 return "floating point rounding mode";
1534 case SPV_OPERAND_TYPE_LINKAGE_TYPE:
1535 return "linkage type";
1536 case SPV_OPERAND_TYPE_ACCESS_QUALIFIER:
1537 return "access qualifier";
1538 case SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE:
1539 return "function parameter attribute";
1540 case SPV_OPERAND_TYPE_DECORATION:
1541 return "decoration";
1542 case SPV_OPERAND_TYPE_BUILT_IN:
1543 return "built in";
1544 case SPV_OPERAND_TYPE_SELECTION_CONTROL:
1545 return "selection control";
1546 case SPV_OPERAND_TYPE_LOOP_CONTROL:
1547 return "loop control";
1548 case SPV_OPERAND_TYPE_FUNCTION_CONTROL:
1549 return "function control";
1550 case SPV_OPERAND_TYPE_MEMORY_SEMANTICS:
1551 return "memory semantics";
1552 case SPV_OPERAND_TYPE_MEMORY_ACCESS:
1553 return "memory access";
1554 case SPV_OPERAND_TYPE_EXECUTION_SCOPE:
1555 return "execution scope";
1556 case SPV_OPERAND_TYPE_GROUP_OPERATION:
1557 return "group operation";
1558 case SPV_OPERAND_TYPE_KERNEL_ENQ_FLAGS:
1559 return "kernel enqeue flags";
David Neto47994822015-08-27 13:11:01 -04001560 case SPV_OPERAND_TYPE_KERNEL_PROFILING_INFO:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001561 return "kernel profiling info";
1562 case SPV_OPERAND_TYPE_CAPABILITY:
1563 return "capability";
1564 default:
1565 assert(0 && "Unhandled operand type!");
1566 break;
1567 }
1568 return "unknown";
1569}