blob: 7c0e7adff9163e743119754c62ecddf07c0fdbb3 [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,
Andrew Woloszyne0d351b2015-09-22 15:49:27 -0400288 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100289 {"ContractionOff",
290 ExecutionModeContractionOff,
291 SPV_OPCODE_FLAGS_CAPABILITIES,
292 CapabilityKernel,
293 {SPV_OPERAND_TYPE_NONE}},
David Neto3e52dd92015-09-23 10:16:39 -0400294 {"IndependentForwardProgress",
295 ExecutionModeIndependentForwardProgress,
296 SPV_OPCODE_FLAGS_CAPABILITIES,
297 CapabilityKernel,
298 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100299};
300
301static const spv_operand_desc_t storageClassEntries[] = {
David Neto5494dd42015-09-15 16:41:38 -0400302 // TODO(dneto): There are more storage classes in Rev32 and later.
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100303 {"UniformConstant",
304 StorageClassUniformConstant,
305 SPV_OPCODE_FLAGS_NONE,
306 0,
307 {SPV_OPERAND_TYPE_NONE}},
308 {"Input",
309 StorageClassInput,
310 SPV_OPCODE_FLAGS_CAPABILITIES,
311 CapabilityShader,
312 {SPV_OPERAND_TYPE_NONE}},
313 {"Uniform",
314 StorageClassUniform,
315 SPV_OPCODE_FLAGS_CAPABILITIES,
316 CapabilityShader,
317 {SPV_OPERAND_TYPE_NONE}},
318 {"Output",
319 StorageClassOutput,
320 SPV_OPCODE_FLAGS_CAPABILITIES,
321 CapabilityShader,
322 {SPV_OPERAND_TYPE_NONE}},
323 {"WorkgroupLocal",
324 StorageClassWorkgroupLocal,
325 SPV_OPCODE_FLAGS_NONE,
326 0,
327 {SPV_OPERAND_TYPE_NONE}},
328 {"WorkgroupGlobal",
329 StorageClassWorkgroupGlobal,
330 SPV_OPCODE_FLAGS_NONE,
331 0,
332 {SPV_OPERAND_TYPE_NONE}},
333 {"PrivateGlobal",
334 StorageClassPrivateGlobal,
335 SPV_OPCODE_FLAGS_CAPABILITIES,
336 CapabilityShader,
337 {SPV_OPERAND_TYPE_NONE}},
338 {"Function",
339 StorageClassFunction,
340 SPV_OPCODE_FLAGS_NONE,
341 0,
342 {SPV_OPERAND_TYPE_NONE}},
343 {"Generic",
344 StorageClassGeneric,
345 SPV_OPCODE_FLAGS_CAPABILITIES,
346 CapabilityKernel,
347 {SPV_OPERAND_TYPE_NONE}},
David Neto9819adf2015-09-23 10:19:57 -0400348 {"PushConstant",
349 StorageClassPushConstant,
350 SPV_OPCODE_FLAGS_CAPABILITIES,
351 CapabilityShader,
352 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100353 {"AtomicCounter",
354 StorageClassAtomicCounter,
355 SPV_OPCODE_FLAGS_CAPABILITIES,
356 CapabilityShader,
357 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400358 {"Image",
359 StorageClassImage,
360 SPV_OPCODE_FLAGS_NONE,
361 0,
362 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100363};
364
365static const spv_operand_desc_t dimensionalityEntries[] = {
David Netoaa0c3a52015-09-23 10:30:06 -0400366 // TODO(dneto): Update capability dependencies for Rev32
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100367 {"1D", Dim1D, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_NONE}},
368 {"2D", Dim2D, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_NONE}},
369 {"3D", Dim3D, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_NONE}},
370 {"Cube",
371 DimCube,
372 SPV_OPCODE_FLAGS_CAPABILITIES,
373 CapabilityShader,
374 {SPV_OPERAND_TYPE_NONE}},
375 {"Rect",
376 DimRect,
377 SPV_OPCODE_FLAGS_CAPABILITIES,
378 CapabilityShader,
379 {SPV_OPERAND_TYPE_NONE}},
380 {"Buffer", DimBuffer, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_NONE}},
David Netoaa0c3a52015-09-23 10:30:06 -0400381 {"InputTarget",
382 DimInputTarget,
383 SPV_OPCODE_FLAGS_CAPABILITIES,
384 CapabilityInputTarget,
385 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100386};
387
388static const spv_operand_desc_t samplerAddressingModeEntries[] = {
389 {"None",
390 SamplerAddressingModeNone,
391 SPV_OPCODE_FLAGS_CAPABILITIES,
392 CapabilityKernel,
393 {SPV_OPERAND_TYPE_NONE}},
394 {"ClampToEdge",
395 SamplerAddressingModeClampToEdge,
396 SPV_OPCODE_FLAGS_CAPABILITIES,
397 CapabilityKernel,
398 {SPV_OPERAND_TYPE_NONE}},
399 {"Clamp",
400 SamplerAddressingModeClamp,
401 SPV_OPCODE_FLAGS_CAPABILITIES,
402 CapabilityKernel,
403 {SPV_OPERAND_TYPE_NONE}},
404 {"Repeat",
405 SamplerAddressingModeRepeat,
406 SPV_OPCODE_FLAGS_CAPABILITIES,
407 CapabilityKernel,
408 {SPV_OPERAND_TYPE_NONE}},
409 {"RepeatMirrored",
410 SamplerAddressingModeRepeatMirrored,
411 SPV_OPCODE_FLAGS_CAPABILITIES,
412 CapabilityKernel,
413 {SPV_OPERAND_TYPE_NONE}},
414};
415
416static const spv_operand_desc_t samplerFilterModeEntries[] = {
417 {"Nearest",
418 SamplerFilterModeNearest,
419 SPV_OPCODE_FLAGS_CAPABILITIES,
420 CapabilityKernel,
421 {SPV_OPERAND_TYPE_NONE}},
422 {"Linear",
423 SamplerFilterModeLinear,
424 SPV_OPCODE_FLAGS_CAPABILITIES,
425 CapabilityKernel,
426 {SPV_OPERAND_TYPE_NONE}},
427};
428
David Netob30a0c52015-09-16 15:56:43 -0400429static const spv_operand_desc_t samplerImageFormatEntries[] = {
430// In Rev31, all the cases depend on the Shader capability.
431// TODO(dneto): In Rev32, many of these depend on the AdvancedFormats
432// capability instead.
433#define CASE(NAME) \
434 { \
435 #NAME, ImageFormat##NAME, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityShader, \
436 { \
437 SPV_OPERAND_TYPE_NONE \
438 } \
439 }
440 // clang-format off
441 CASE(Unknown),
442 CASE(Rgba32f),
443 CASE(Rgba16f),
444 CASE(R32f),
445 CASE(Rgba8),
446 CASE(Rgba8Snorm),
447 CASE(Rg32f),
448 CASE(Rg16f),
449 CASE(R11fG11fB10f),
450 CASE(R16f),
451 CASE(Rgba16),
452 CASE(Rgb10A2),
453 CASE(Rg16),
454 CASE(Rg8),
455 CASE(R16),
456 CASE(R8),
457 CASE(Rgba16Snorm),
458 CASE(Rg16Snorm),
459 CASE(Rg8Snorm),
460 CASE(R16Snorm),
461 CASE(R8Snorm),
462 CASE(Rgba32i),
463 CASE(Rgba16i),
464 CASE(Rgba8i),
465 CASE(R32i),
466 CASE(Rg32i),
467 CASE(Rg16i),
468 CASE(Rg8i),
469 CASE(R16i),
470 CASE(R8i),
471 CASE(Rgba32ui),
472 CASE(Rgba16ui),
473 CASE(Rgba8ui),
474 CASE(R32ui),
475 CASE(Rgb10a2ui),
476 CASE(Rg32ui),
477 CASE(Rg16ui),
478 CASE(Rg8ui),
479 CASE(R16ui),
480 CASE(R8ui),
481 // clang-format on
482#undef CASE
483};
484
David Netoee1b3bb2015-09-18 11:19:18 -0400485// Image operand definitions. Each enum value is a mask. When that mask
486// bit is set, the instruction should have further ID operands.
487// Some mask values depend on a capability.
488static const spv_operand_desc_t imageOperandEntries[] = {
489// Rev32 and later adds many more enums.
490#define CASE(NAME) \
491 #NAME, spv::ImageOperands##NAME##Mask, SPV_OPCODE_FLAGS_NONE, 0
492#define CASE_CAP(NAME, CAP) \
493 #NAME, spv::ImageOperands##NAME##Mask, SPV_OPCODE_FLAGS_CAPABILITIES, CAP
494#define ID SPV_OPERAND_TYPE_ID
495#define NONE SPV_OPERAND_TYPE_NONE
496 {"None", spv::ImageOperandsMaskNone, SPV_OPCODE_FLAGS_NONE, 0, {NONE}},
497 {CASE_CAP(Bias, CapabilityShader), {ID, NONE}},
498 {CASE(Lod), {ID, NONE}},
499 {CASE(Grad), {ID, ID, NONE}},
500 {CASE(ConstOffset), {ID, NONE}},
501 {CASE_CAP(Offset, CapabilityImageGatherExtended), {ID, NONE}},
502 {CASE(ConstOffsets), {ID, NONE}},
503 {CASE(Sample), {ID, NONE}},
504#undef CASE
505#undef CASE_CAP
506#undef ID
507#undef NONE
508};
509
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100510static const spv_operand_desc_t fpFastMathModeEntries[] = {
511 {"None",
512 FPFastMathModeMaskNone,
513 SPV_OPCODE_FLAGS_NONE,
514 0,
515 {SPV_OPERAND_TYPE_NONE}},
516 {"NotNaN",
517 FPFastMathModeNotNaNMask,
518 SPV_OPCODE_FLAGS_CAPABILITIES,
519 CapabilityKernel,
520 {SPV_OPERAND_TYPE_NONE}},
521 {"NotInf",
522 FPFastMathModeNotInfMask,
523 SPV_OPCODE_FLAGS_CAPABILITIES,
524 CapabilityKernel,
525 {SPV_OPERAND_TYPE_NONE}},
526 {"NSZ",
527 FPFastMathModeNSZMask,
528 SPV_OPCODE_FLAGS_CAPABILITIES,
529 CapabilityKernel,
530 {SPV_OPERAND_TYPE_NONE}},
531 {"AllowRecip",
532 FPFastMathModeAllowRecipMask,
533 SPV_OPCODE_FLAGS_CAPABILITIES,
534 CapabilityKernel,
535 {SPV_OPERAND_TYPE_NONE}},
536 {"Fast",
537 FPFastMathModeFastMask,
538 SPV_OPCODE_FLAGS_CAPABILITIES,
539 CapabilityKernel,
540 {SPV_OPERAND_TYPE_NONE}},
541};
542
543static const spv_operand_desc_t fpRoundingModeEntries[] = {
544 {"RTE",
545 FPRoundingModeRTE,
546 SPV_OPCODE_FLAGS_CAPABILITIES,
547 CapabilityKernel,
548 {SPV_OPERAND_TYPE_NONE}},
549 {"RTZ",
550 FPRoundingModeRTZ,
551 SPV_OPCODE_FLAGS_CAPABILITIES,
552 CapabilityKernel,
553 {SPV_OPERAND_TYPE_NONE}},
554 {"RTP",
555 FPRoundingModeRTP,
556 SPV_OPCODE_FLAGS_CAPABILITIES,
557 CapabilityKernel,
558 {SPV_OPERAND_TYPE_NONE}},
559 {"RTN",
560 FPRoundingModeRTN,
561 SPV_OPCODE_FLAGS_CAPABILITIES,
562 CapabilityKernel,
563 {SPV_OPERAND_TYPE_NONE}},
564};
565
566static const spv_operand_desc_t linkageTypeEntries[] = {
567 {"Export",
568 LinkageTypeExport,
569 SPV_OPCODE_FLAGS_CAPABILITIES,
570 CapabilityLinkage,
571 {SPV_OPERAND_TYPE_NONE}},
572 {"Import",
573 LinkageTypeImport,
574 SPV_OPCODE_FLAGS_CAPABILITIES,
575 CapabilityLinkage,
576 {SPV_OPERAND_TYPE_NONE}},
577};
578
579static const spv_operand_desc_t accessQualifierEntries[] = {
580 {"ReadOnly",
581 AccessQualifierReadOnly,
582 SPV_OPCODE_FLAGS_CAPABILITIES,
583 CapabilityKernel,
584 {SPV_OPERAND_TYPE_NONE}},
585 {"WriteOnly",
586 AccessQualifierWriteOnly,
587 SPV_OPCODE_FLAGS_CAPABILITIES,
588 CapabilityKernel,
589 {SPV_OPERAND_TYPE_NONE}},
590 {"ReadWrite",
591 AccessQualifierReadWrite,
592 SPV_OPCODE_FLAGS_CAPABILITIES,
593 CapabilityKernel,
594 {SPV_OPERAND_TYPE_NONE}},
595};
596
597static const spv_operand_desc_t functionParameterAttributeEntries[] = {
598 {"Zext",
599 FunctionParameterAttributeZext,
600 SPV_OPCODE_FLAGS_CAPABILITIES,
601 CapabilityKernel,
602 {SPV_OPERAND_TYPE_NONE}},
603 {"Sext",
604 FunctionParameterAttributeSext,
605 SPV_OPCODE_FLAGS_CAPABILITIES,
606 CapabilityKernel,
607 {SPV_OPERAND_TYPE_NONE}},
608 {"ByVal",
609 FunctionParameterAttributeByVal,
610 SPV_OPCODE_FLAGS_CAPABILITIES,
611 CapabilityKernel,
612 {SPV_OPERAND_TYPE_NONE}},
613 {"Sret",
614 FunctionParameterAttributeSret,
615 SPV_OPCODE_FLAGS_CAPABILITIES,
616 CapabilityKernel,
617 {SPV_OPERAND_TYPE_NONE}},
618 {"NoAlias",
619 FunctionParameterAttributeNoAlias,
620 SPV_OPCODE_FLAGS_CAPABILITIES,
621 CapabilityKernel,
622 {SPV_OPERAND_TYPE_NONE}},
David Neto37547b22015-09-10 13:23:11 -0400623 {"NoCapture",
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100624 FunctionParameterAttributeNoCapture,
625 SPV_OPCODE_FLAGS_CAPABILITIES,
626 CapabilityKernel,
627 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100628 {"NoWrite",
629 FunctionParameterAttributeNoWrite,
630 SPV_OPCODE_FLAGS_CAPABILITIES,
631 CapabilityKernel,
632 {SPV_OPERAND_TYPE_NONE}},
633 {"NoReadWrite",
634 FunctionParameterAttributeNoReadWrite,
635 SPV_OPCODE_FLAGS_CAPABILITIES,
636 CapabilityKernel,
637 {SPV_OPERAND_TYPE_NONE}},
638};
639
640static const spv_operand_desc_t decorationEntries[] = {
Lei Zhang604e5ce2015-08-14 14:46:43 -0400641 {"RelaxedPrecision",
642 DecorationRelaxedPrecision,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100643 SPV_OPCODE_FLAGS_CAPABILITIES,
644 CapabilityShader,
645 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400646 {
647 "SpecId",
648 DecorationSpecId,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100649 SPV_OPCODE_FLAGS_CAPABILITIES,
650 CapabilityShader,
Lei Zhang604e5ce2015-08-14 14:46:43 -0400651 {SPV_OPERAND_TYPE_LITERAL_NUMBER},
652 },
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100653 {"Block",
654 DecorationBlock,
655 SPV_OPCODE_FLAGS_CAPABILITIES,
656 CapabilityShader,
657 {SPV_OPERAND_TYPE_NONE}},
658 {"BufferBlock",
659 DecorationBufferBlock,
660 SPV_OPCODE_FLAGS_CAPABILITIES,
661 CapabilityShader,
662 {SPV_OPERAND_TYPE_NONE}},
663 {"RowMajor",
664 DecorationRowMajor,
665 SPV_OPCODE_FLAGS_CAPABILITIES,
666 CapabilityMatrix,
667 {SPV_OPERAND_TYPE_NONE}},
668 {"ColMajor",
669 DecorationColMajor,
670 SPV_OPCODE_FLAGS_CAPABILITIES,
671 CapabilityMatrix,
672 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400673 {"ArrayStride",
674 DecorationArrayStride,
675 SPV_OPCODE_FLAGS_CAPABILITIES,
676 CapabilityShader,
677 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
678 {"MatrixStride",
679 DecorationMatrixStride,
680 SPV_OPCODE_FLAGS_CAPABILITIES,
681 CapabilityShader,
682 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100683 {"GLSLShared",
684 DecorationGLSLShared,
685 SPV_OPCODE_FLAGS_CAPABILITIES,
686 CapabilityShader,
687 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100688 {"GLSLPacked",
689 DecorationGLSLPacked,
690 SPV_OPCODE_FLAGS_CAPABILITIES,
691 CapabilityShader,
692 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400693 {"CPacked",
694 DecorationCPacked,
695 SPV_OPCODE_FLAGS_CAPABILITIES,
696 CapabilityKernel,
697 {SPV_OPERAND_TYPE_NONE}},
698 {"BuiltIn",
699 DecorationBuiltIn,
700 SPV_OPCODE_FLAGS_CAPABILITIES,
701 CapabilityShader,
702 {SPV_OPERAND_TYPE_BUILT_IN, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100703 {"Smooth",
704 DecorationSmooth,
705 SPV_OPCODE_FLAGS_CAPABILITIES,
706 CapabilityShader,
707 {SPV_OPERAND_TYPE_NONE}},
David Netodbaf4072015-09-22 16:23:06 -0400708 {"NoPerspective",
709 DecorationNoPerspective,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100710 SPV_OPCODE_FLAGS_CAPABILITIES,
711 CapabilityShader,
712 {SPV_OPERAND_TYPE_NONE}},
713 {"Flat",
714 DecorationFlat,
715 SPV_OPCODE_FLAGS_CAPABILITIES,
716 CapabilityShader,
717 {SPV_OPERAND_TYPE_NONE}},
718 {"Patch",
719 DecorationPatch,
720 SPV_OPCODE_FLAGS_CAPABILITIES,
721 CapabilityTessellation,
722 {SPV_OPERAND_TYPE_NONE}},
723 {"Centroid",
724 DecorationCentroid,
725 SPV_OPCODE_FLAGS_CAPABILITIES,
726 CapabilityShader,
727 {SPV_OPERAND_TYPE_NONE}},
728 {"Sample",
729 DecorationSample,
730 SPV_OPCODE_FLAGS_CAPABILITIES,
731 CapabilityShader,
732 {SPV_OPERAND_TYPE_NONE}},
733 {"Invariant",
734 DecorationInvariant,
735 SPV_OPCODE_FLAGS_CAPABILITIES,
736 CapabilityShader,
737 {SPV_OPERAND_TYPE_NONE}},
738 {"Restrict",
739 DecorationRestrict,
740 SPV_OPCODE_FLAGS_NONE,
741 0,
742 {SPV_OPERAND_TYPE_NONE}},
743 {"Aliased",
744 DecorationAliased,
745 SPV_OPCODE_FLAGS_NONE,
746 0,
747 {SPV_OPERAND_TYPE_NONE}},
748 {"Volatile",
749 DecorationVolatile,
750 SPV_OPCODE_FLAGS_NONE,
751 0,
752 {SPV_OPERAND_TYPE_NONE}},
753 {"Constant",
754 DecorationConstant,
755 SPV_OPCODE_FLAGS_CAPABILITIES,
756 CapabilityKernel,
757 {SPV_OPERAND_TYPE_NONE}},
758 {"Coherent",
759 DecorationCoherent,
760 SPV_OPCODE_FLAGS_NONE,
761 0,
762 {SPV_OPERAND_TYPE_NONE}},
David Netodbaf4072015-09-22 16:23:06 -0400763 {"NonWritable",
764 DecorationNonWritable,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100765 SPV_OPCODE_FLAGS_NONE,
766 0,
767 {SPV_OPERAND_TYPE_NONE}},
David Netodbaf4072015-09-22 16:23:06 -0400768 {"NonReadable",
769 DecorationNonReadable,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100770 SPV_OPCODE_FLAGS_NONE,
771 0,
772 {SPV_OPERAND_TYPE_NONE}},
773 {"Uniform",
774 DecorationUniform,
775 SPV_OPCODE_FLAGS_CAPABILITIES,
776 CapabilityShader,
777 {SPV_OPERAND_TYPE_NONE}},
David Neto37547b22015-09-10 13:23:11 -0400778 {"SaturatedConversion",
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100779 DecorationSaturatedConversion,
780 SPV_OPCODE_FLAGS_CAPABILITIES,
781 CapabilityKernel,
782 {SPV_OPERAND_TYPE_NONE}},
783 {"Stream",
784 DecorationStream,
785 SPV_OPCODE_FLAGS_CAPABILITIES,
786 CapabilityGeometry,
787 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
788 {"Location",
789 DecorationLocation,
790 SPV_OPCODE_FLAGS_CAPABILITIES,
791 CapabilityShader,
792 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
793 {"Component",
794 DecorationComponent,
795 SPV_OPCODE_FLAGS_CAPABILITIES,
796 CapabilityShader,
797 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
798 {"Index",
799 DecorationIndex,
800 SPV_OPCODE_FLAGS_CAPABILITIES,
801 CapabilityShader,
802 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
803 {"Binding",
804 DecorationBinding,
805 SPV_OPCODE_FLAGS_CAPABILITIES,
806 CapabilityShader,
807 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
808 {"DescriptorSet",
809 DecorationDescriptorSet,
810 SPV_OPCODE_FLAGS_CAPABILITIES,
811 CapabilityShader,
812 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
813 {"Offset",
814 DecorationOffset,
815 SPV_OPCODE_FLAGS_NONE,
816 0,
817 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100818 {"XfbBuffer",
819 DecorationXfbBuffer,
820 SPV_OPCODE_FLAGS_CAPABILITIES,
821 CapabilityShader,
822 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400823 {"XfbStride",
824 DecorationXfbStride,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100825 SPV_OPCODE_FLAGS_CAPABILITIES,
826 CapabilityShader,
827 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100828 {"FuncParamAttr",
829 DecorationFuncParamAttr,
830 SPV_OPCODE_FLAGS_CAPABILITIES,
831 CapabilityKernel,
832 {SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE, SPV_OPERAND_TYPE_NONE}},
833 {"FPRoundingMode",
834 DecorationFPRoundingMode,
835 SPV_OPCODE_FLAGS_CAPABILITIES,
836 CapabilityKernel,
837 {SPV_OPERAND_TYPE_FP_ROUNDING_MODE, SPV_OPERAND_TYPE_NONE}},
838 {"FPFastMathMode",
David Neto37547b22015-09-10 13:23:11 -0400839 DecorationFPFastMathMode,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100840 SPV_OPCODE_FLAGS_CAPABILITIES,
841 CapabilityKernel,
842 {SPV_OPERAND_TYPE_FP_FAST_MATH_MODE, SPV_OPERAND_TYPE_NONE}},
843 {"LinkageAttributes",
844 DecorationLinkageAttributes,
845 SPV_OPCODE_FLAGS_CAPABILITIES,
846 CapabilityLinkage,
David Neto55bdfcb2015-09-10 15:51:57 -0400847 {SPV_OPERAND_TYPE_LITERAL_STRING, SPV_OPERAND_TYPE_LINKAGE_TYPE, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100848};
849
850static const spv_operand_desc_t builtInEntries[] = {
851 {"Position",
852 BuiltInPosition,
853 SPV_OPCODE_FLAGS_CAPABILITIES,
854 CapabilityShader,
855 {SPV_OPERAND_TYPE_NONE}},
856 {"PointSize",
857 BuiltInPointSize,
858 SPV_OPCODE_FLAGS_CAPABILITIES,
859 CapabilityShader,
860 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100861 {"ClipDistance",
862 BuiltInClipDistance,
863 SPV_OPCODE_FLAGS_CAPABILITIES,
864 CapabilityShader,
865 {SPV_OPERAND_TYPE_NONE}},
866 {"CullDistance",
867 BuiltInCullDistance,
868 SPV_OPCODE_FLAGS_CAPABILITIES,
869 CapabilityShader,
870 {SPV_OPERAND_TYPE_NONE}},
871 {"VertexId",
872 BuiltInVertexId,
873 SPV_OPCODE_FLAGS_CAPABILITIES,
874 CapabilityShader,
875 {SPV_OPERAND_TYPE_NONE}},
876 {"InstanceId",
877 BuiltInInstanceId,
878 SPV_OPCODE_FLAGS_CAPABILITIES,
879 CapabilityShader,
880 {SPV_OPERAND_TYPE_NONE}},
881 {"PrimitiveId",
882 BuiltInPrimitiveId,
883 SPV_OPCODE_FLAGS_CAPABILITIES,
884 CapabilityGeometry | CapabilityTessellation,
885 {SPV_OPERAND_TYPE_NONE}},
886 {"InvocationId",
887 BuiltInInvocationId,
888 SPV_OPCODE_FLAGS_CAPABILITIES,
889 CapabilityGeometry | CapabilityTessellation,
890 {SPV_OPERAND_TYPE_NONE}},
891 {"Layer",
892 BuiltInLayer,
893 SPV_OPCODE_FLAGS_CAPABILITIES,
894 CapabilityGeometry,
895 {SPV_OPERAND_TYPE_NONE}},
896 {"ViewportIndex",
897 BuiltInViewportIndex,
898 SPV_OPCODE_FLAGS_CAPABILITIES,
899 CapabilityGeometry,
900 {SPV_OPERAND_TYPE_NONE}},
901 {"TessLevelOuter",
902 BuiltInTessLevelOuter,
903 SPV_OPCODE_FLAGS_CAPABILITIES,
904 CapabilityTessellation,
905 {SPV_OPERAND_TYPE_NONE}},
906 {"TessLevelInner",
907 BuiltInTessLevelInner,
908 SPV_OPCODE_FLAGS_CAPABILITIES,
909 CapabilityTessellation,
910 {SPV_OPERAND_TYPE_NONE}},
911 {"TessCoord",
912 BuiltInTessCoord,
913 SPV_OPCODE_FLAGS_CAPABILITIES,
914 CapabilityTessellation,
915 {SPV_OPERAND_TYPE_NONE}},
916 {"PatchVertices",
917 BuiltInPatchVertices,
918 SPV_OPCODE_FLAGS_CAPABILITIES,
919 CapabilityTessellation,
920 {SPV_OPERAND_TYPE_NONE}},
921 {"FragCoord",
922 BuiltInFragCoord,
923 SPV_OPCODE_FLAGS_CAPABILITIES,
924 CapabilityShader,
925 {SPV_OPERAND_TYPE_NONE}},
926 {"PointCoord",
927 BuiltInPointCoord,
928 SPV_OPCODE_FLAGS_CAPABILITIES,
929 CapabilityShader,
930 {SPV_OPERAND_TYPE_NONE}},
931 {"FrontFacing",
932 BuiltInFrontFacing,
933 SPV_OPCODE_FLAGS_CAPABILITIES,
934 CapabilityShader,
935 {SPV_OPERAND_TYPE_NONE}},
936 {"SampleId",
937 BuiltInSampleId,
938 SPV_OPCODE_FLAGS_CAPABILITIES,
939 CapabilityShader,
940 {SPV_OPERAND_TYPE_NONE}},
941 {"SamplePosition",
942 BuiltInSamplePosition,
943 SPV_OPCODE_FLAGS_CAPABILITIES,
944 CapabilityShader,
945 {SPV_OPERAND_TYPE_NONE}},
946 {"SampleMask",
947 BuiltInSampleMask,
948 SPV_OPCODE_FLAGS_CAPABILITIES,
949 CapabilityShader,
950 {SPV_OPERAND_TYPE_NONE}},
951 {"FragColor",
952 BuiltInFragColor,
953 SPV_OPCODE_FLAGS_CAPABILITIES,
954 CapabilityShader,
955 {SPV_OPERAND_TYPE_NONE}},
956 {"FragDepth",
957 BuiltInFragDepth,
958 SPV_OPCODE_FLAGS_CAPABILITIES,
959 CapabilityShader,
960 {SPV_OPERAND_TYPE_NONE}},
961 {"HelperInvocation",
962 BuiltInHelperInvocation,
963 SPV_OPCODE_FLAGS_CAPABILITIES,
964 CapabilityShader,
965 {SPV_OPERAND_TYPE_NONE}},
966 {"NumWorkgroups",
967 BuiltInNumWorkgroups,
968 SPV_OPCODE_FLAGS_NONE,
969 0,
970 {SPV_OPERAND_TYPE_NONE}},
971 {"WorkgroupSize",
972 BuiltInWorkgroupSize,
973 SPV_OPCODE_FLAGS_NONE,
974 0,
975 {SPV_OPERAND_TYPE_NONE}},
976 {"WorkgroupId",
977 BuiltInWorkgroupId,
978 SPV_OPCODE_FLAGS_NONE,
979 0,
980 {SPV_OPERAND_TYPE_NONE}},
981 {"LocalInvocationId",
982 BuiltInLocalInvocationId,
983 SPV_OPCODE_FLAGS_NONE,
984 0,
985 {SPV_OPERAND_TYPE_NONE}},
986 {"GlobalInvocationId",
987 BuiltInGlobalInvocationId,
988 SPV_OPCODE_FLAGS_NONE,
989 0,
990 {SPV_OPERAND_TYPE_NONE}},
991 {"LocalInvocationIndex",
David Neto37547b22015-09-10 13:23:11 -0400992 BuiltInLocalInvocationIndex,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100993 SPV_OPCODE_FLAGS_CAPABILITIES,
994 CapabilityShader,
995 {SPV_OPERAND_TYPE_NONE}},
996 {"WorkDim",
997 BuiltInWorkDim,
998 SPV_OPCODE_FLAGS_CAPABILITIES,
999 CapabilityKernel,
1000 {SPV_OPERAND_TYPE_NONE}},
1001 {"GlobalSize",
1002 BuiltInGlobalSize,
1003 SPV_OPCODE_FLAGS_CAPABILITIES,
1004 CapabilityKernel,
1005 {SPV_OPERAND_TYPE_NONE}},
1006 {"EnqueuedWorkgroupSize",
1007 BuiltInEnqueuedWorkgroupSize,
1008 SPV_OPCODE_FLAGS_CAPABILITIES,
1009 CapabilityKernel,
1010 {SPV_OPERAND_TYPE_NONE}},
1011 {"GlobalOffset",
1012 BuiltInGlobalOffset,
1013 SPV_OPCODE_FLAGS_CAPABILITIES,
1014 CapabilityKernel,
1015 {SPV_OPERAND_TYPE_NONE}},
1016 {"GlobalLinearId",
1017 BuiltInGlobalLinearId,
1018 SPV_OPCODE_FLAGS_CAPABILITIES,
1019 CapabilityKernel,
1020 {SPV_OPERAND_TYPE_NONE}},
1021 {"WorkgroupLinearId",
1022 BuiltInWorkgroupLinearId,
1023 SPV_OPCODE_FLAGS_CAPABILITIES,
1024 CapabilityKernel,
1025 {SPV_OPERAND_TYPE_NONE}},
1026 {"SubgroupSize",
1027 BuiltInSubgroupSize,
1028 SPV_OPCODE_FLAGS_CAPABILITIES,
1029 CapabilityKernel,
1030 {SPV_OPERAND_TYPE_NONE}},
1031 {"SubgroupMaxSize",
1032 BuiltInSubgroupMaxSize,
1033 SPV_OPCODE_FLAGS_CAPABILITIES,
1034 CapabilityKernel,
1035 {SPV_OPERAND_TYPE_NONE}},
1036 {"NumSubgroups",
1037 BuiltInNumSubgroups,
1038 SPV_OPCODE_FLAGS_CAPABILITIES,
1039 CapabilityKernel,
1040 {SPV_OPERAND_TYPE_NONE}},
1041 {"NumEnqueuedSubgroups",
1042 BuiltInNumEnqueuedSubgroups,
1043 SPV_OPCODE_FLAGS_CAPABILITIES,
1044 CapabilityKernel,
1045 {SPV_OPERAND_TYPE_NONE}},
1046 {"SubgroupId",
David Neto37547b22015-09-10 13:23:11 -04001047 BuiltInSubgroupId,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001048 SPV_OPCODE_FLAGS_CAPABILITIES,
1049 CapabilityKernel,
1050 {SPV_OPERAND_TYPE_NONE}},
1051 {"SubgroupLocalInvocationId",
1052 BuiltInSubgroupLocalInvocationId,
1053 SPV_OPCODE_FLAGS_CAPABILITIES,
1054 CapabilityKernel,
1055 {SPV_OPERAND_TYPE_NONE}},
1056};
1057
1058static const spv_operand_desc_t selectionControlEntries[] = {
1059 {"None",
1060 SelectionControlMaskNone,
1061 SPV_OPCODE_FLAGS_NONE,
1062 0,
1063 {SPV_OPERAND_TYPE_NONE}},
1064 {"Flatten",
1065 SelectionControlFlattenMask,
1066 SPV_OPCODE_FLAGS_NONE,
1067 0,
1068 {SPV_OPERAND_TYPE_NONE}},
1069 {"DontFlatten",
1070 SelectionControlDontFlattenMask,
1071 SPV_OPCODE_FLAGS_NONE,
1072 0,
1073 {SPV_OPERAND_TYPE_NONE}},
1074};
1075
1076static const spv_operand_desc_t loopControlEntries[] = {
1077 {"None",
1078 LoopControlMaskNone,
1079 SPV_OPCODE_FLAGS_NONE,
1080 0,
1081 {SPV_OPERAND_TYPE_NONE}},
1082 {"Unroll",
1083 LoopControlUnrollMask,
1084 SPV_OPCODE_FLAGS_NONE,
1085 0,
1086 {SPV_OPERAND_TYPE_NONE}},
1087 {"DontUnroll",
1088 LoopControlDontUnrollMask,
1089 SPV_OPCODE_FLAGS_NONE,
1090 0,
1091 {SPV_OPERAND_TYPE_NONE}},
1092};
1093
1094static const spv_operand_desc_t functionControlEntries[] = {
1095 {"None",
1096 FunctionControlMaskNone,
1097 SPV_OPCODE_FLAGS_NONE,
1098 0,
1099 {SPV_OPERAND_TYPE_NONE}},
David Netof4fde6c2015-09-14 14:50:37 -04001100 {"Inline",
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001101 FunctionControlInlineMask,
1102 SPV_OPCODE_FLAGS_NONE,
1103 0,
1104 {SPV_OPERAND_TYPE_NONE}},
1105 {"DontInline",
1106 FunctionControlDontInlineMask,
1107 SPV_OPCODE_FLAGS_NONE,
1108 0,
1109 {SPV_OPERAND_TYPE_NONE}},
1110 {"Pure",
1111 FunctionControlPureMask,
1112 SPV_OPCODE_FLAGS_NONE,
1113 0,
1114 {SPV_OPERAND_TYPE_NONE}},
1115 {"Const",
1116 FunctionControlConstMask,
1117 SPV_OPCODE_FLAGS_NONE,
1118 0,
1119 {SPV_OPERAND_TYPE_NONE}},
1120};
1121
1122static const spv_operand_desc_t memorySemanticsEntries[] = {
1123 {"None",
1124 MemorySemanticsMaskNone,
1125 SPV_OPCODE_FLAGS_NONE,
1126 0,
1127 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001128 {"SequentiallyConsistent",
1129 MemorySemanticsSequentiallyConsistentMask,
1130 SPV_OPCODE_FLAGS_NONE,
1131 0,
1132 {SPV_OPERAND_TYPE_NONE}},
1133 {"Acquire",
1134 MemorySemanticsAcquireMask,
1135 SPV_OPCODE_FLAGS_NONE,
1136 0,
1137 {SPV_OPERAND_TYPE_NONE}},
1138 {"Release",
1139 MemorySemanticsReleaseMask,
1140 SPV_OPCODE_FLAGS_NONE,
1141 0,
1142 {SPV_OPERAND_TYPE_NONE}},
1143 {"UniformMemory",
1144 MemorySemanticsUniformMemoryMask,
1145 SPV_OPCODE_FLAGS_CAPABILITIES,
1146 CapabilityShader,
1147 {SPV_OPERAND_TYPE_NONE}},
1148 {"SubgroupMemory",
1149 MemorySemanticsSubgroupMemoryMask,
1150 SPV_OPCODE_FLAGS_NONE,
1151 0,
1152 {SPV_OPERAND_TYPE_NONE}},
1153 {"WorkgroupLocalMemory",
1154 MemorySemanticsWorkgroupLocalMemoryMask,
1155 SPV_OPCODE_FLAGS_NONE,
1156 0,
1157 {SPV_OPERAND_TYPE_NONE}},
1158 {"WorkgroupGlobalMemory",
1159 MemorySemanticsWorkgroupGlobalMemoryMask,
1160 SPV_OPCODE_FLAGS_NONE,
1161 0,
1162 {SPV_OPERAND_TYPE_NONE}},
1163 {"AtomicCounterMemory",
1164 MemorySemanticsAtomicCounterMemoryMask,
1165 SPV_OPCODE_FLAGS_CAPABILITIES,
1166 CapabilityShader,
1167 {SPV_OPERAND_TYPE_NONE}},
1168 {
1169 "ImageMemory",
1170 MemorySemanticsImageMemoryMask,
1171 SPV_OPCODE_FLAGS_NONE,
1172 0,
1173 {SPV_OPERAND_TYPE_NONE},
1174 },
1175};
1176
1177static const spv_operand_desc_t memoryAccessEntries[] = {
1178 {"None",
1179 MemoryAccessMaskNone,
1180 SPV_OPCODE_FLAGS_NONE,
1181 0,
1182 {SPV_OPERAND_TYPE_NONE}},
1183 {"Volatile",
1184 MemoryAccessVolatileMask,
1185 SPV_OPCODE_FLAGS_NONE,
1186 0,
1187 {SPV_OPERAND_TYPE_NONE}},
1188 {
1189 "Aligned",
1190 MemoryAccessAlignedMask,
1191 SPV_OPCODE_FLAGS_NONE,
1192 0,
David Neto4a291312015-09-14 15:08:48 -04001193 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001194 },
1195};
1196
1197static const spv_operand_desc_t scopeEntries[] = {
1198 {"CrossDevice",
1199 ScopeCrossDevice,
1200 SPV_OPCODE_FLAGS_NONE,
1201 0,
1202 {SPV_OPERAND_TYPE_NONE}},
1203 {"Device", ScopeDevice, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_NONE}},
1204 {"Workgroup",
1205 ScopeWorkgroup,
1206 SPV_OPCODE_FLAGS_NONE,
1207 0,
1208 {SPV_OPERAND_TYPE_NONE}},
1209 {"Subgroup",
1210 ScopeSubgroup,
1211 SPV_OPCODE_FLAGS_NONE,
1212 0,
1213 {SPV_OPERAND_TYPE_NONE}},
1214 {
1215 "Invocation",
1216 ScopeInvocation,
1217 SPV_OPCODE_FLAGS_NONE,
1218 0,
1219 {SPV_OPERAND_TYPE_NONE},
1220 },
1221};
1222
1223static const spv_operand_desc_t groupOperationEntries[] = {
1224 {"Reduce",
1225 GroupOperationReduce,
1226 SPV_OPCODE_FLAGS_CAPABILITIES,
1227 CapabilityKernel,
1228 {SPV_OPERAND_TYPE_NONE}},
1229 {"InclusiveScan",
1230 GroupOperationInclusiveScan,
1231 SPV_OPCODE_FLAGS_CAPABILITIES,
1232 CapabilityKernel,
1233 {SPV_OPERAND_TYPE_NONE}},
1234 {"ExclusiveScan",
1235 GroupOperationExclusiveScan,
1236 SPV_OPCODE_FLAGS_CAPABILITIES,
1237 CapabilityKernel,
1238 {SPV_OPERAND_TYPE_NONE}},
1239};
1240
1241static const spv_operand_desc_t kernelKernelEnqueueFlagssEntries[] = {
1242 {"NoWait",
1243 KernelEnqueueFlagsNoWait,
1244 SPV_OPCODE_FLAGS_CAPABILITIES,
1245 CapabilityKernel,
1246 {SPV_OPERAND_TYPE_NONE}},
1247 {"WaitKernel",
1248 KernelEnqueueFlagsWaitKernel,
1249 SPV_OPCODE_FLAGS_CAPABILITIES,
1250 CapabilityKernel,
1251 {SPV_OPERAND_TYPE_NONE}},
1252 {"WaitWorkGroup",
1253 KernelEnqueueFlagsWaitWorkGroup,
1254 SPV_OPCODE_FLAGS_CAPABILITIES,
1255 CapabilityKernel,
1256 {SPV_OPERAND_TYPE_NONE}},
1257};
1258
1259static const spv_operand_desc_t kernelProfilingInfoEntries[] = {
1260 {"None",
1261 KernelProfilingInfoMaskNone,
1262 SPV_OPCODE_FLAGS_NONE,
1263 0,
1264 {SPV_OPERAND_TYPE_NONE}},
1265 {"CmdExecTime",
1266 KernelProfilingInfoCmdExecTimeMask,
1267 SPV_OPCODE_FLAGS_CAPABILITIES,
1268 CapabilityKernel,
1269 {SPV_OPERAND_TYPE_NONE}},
1270};
1271
1272static const spv_operand_desc_t capabilityInfoEntries[] = {
1273 {"Matrix",
1274 CapabilityMatrix,
1275 SPV_OPCODE_FLAGS_NONE,
1276 0,
1277 {SPV_OPERAND_TYPE_NONE}},
1278 {"Shader",
1279 CapabilityShader,
1280 SPV_OPCODE_FLAGS_CAPABILITIES,
1281 CapabilityMatrix,
1282 {SPV_OPERAND_TYPE_NONE}},
1283 {"Geometry",
1284 CapabilityGeometry,
1285 SPV_OPCODE_FLAGS_CAPABILITIES,
1286 CapabilityShader,
1287 {SPV_OPERAND_TYPE_NONE}},
1288 {"Tessellation",
1289 CapabilityTessellation,
1290 SPV_OPCODE_FLAGS_CAPABILITIES,
1291 CapabilityShader,
1292 {SPV_OPERAND_TYPE_NONE}},
1293 {"Addresses",
1294 CapabilityAddresses,
1295 SPV_OPCODE_FLAGS_NONE,
1296 0,
1297 {SPV_OPERAND_TYPE_NONE}},
1298 {"Linkage",
1299 CapabilityLinkage,
1300 SPV_OPCODE_FLAGS_NONE,
1301 0,
1302 {SPV_OPERAND_TYPE_NONE}},
1303 {"Kernel",
1304 CapabilityKernel,
1305 SPV_OPCODE_FLAGS_NONE,
1306 0,
1307 {SPV_OPERAND_TYPE_NONE}},
1308 {"Vector16",
1309 CapabilityVector16,
1310 SPV_OPCODE_FLAGS_NONE,
1311 0,
1312 {SPV_OPERAND_TYPE_NONE}},
1313 {"Float16Buffer",
1314 CapabilityFloat16Buffer,
1315 SPV_OPCODE_FLAGS_NONE,
1316 0,
1317 {SPV_OPERAND_TYPE_NONE}},
1318 {"Float16",
1319 CapabilityFloat16,
1320 SPV_OPCODE_FLAGS_NONE,
1321 0,
1322 {SPV_OPERAND_TYPE_NONE}},
1323 {"Float64",
1324 CapabilityFloat64,
1325 SPV_OPCODE_FLAGS_NONE,
1326 0,
1327 {SPV_OPERAND_TYPE_NONE}},
1328 {"Int64",
1329 CapabilityInt64,
1330 SPV_OPCODE_FLAGS_NONE,
1331 0,
1332 {SPV_OPERAND_TYPE_NONE}},
1333 {"Int64Atomics",
1334 CapabilityInt64Atomics,
1335 SPV_OPCODE_FLAGS_NONE,
1336 0,
1337 {SPV_OPERAND_TYPE_NONE}},
1338 {"ImageBasic",
1339 CapabilityImageBasic,
1340 SPV_OPCODE_FLAGS_NONE,
1341 0,
1342 {SPV_OPERAND_TYPE_NONE}},
1343 {"ImageReadWrite",
1344 CapabilityImageReadWrite,
1345 SPV_OPCODE_FLAGS_NONE,
1346 0,
1347 {SPV_OPERAND_TYPE_NONE}},
David Netoc6402d62015-09-10 16:39:09 -04001348 {"ImageMipmap",
1349 CapabilityImageMipmap,
1350 SPV_OPCODE_FLAGS_NONE,
1351 0,
1352 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001353 {"ImageSRGBWrite",
1354 CapabilityImageSRGBWrite,
1355 SPV_OPCODE_FLAGS_NONE,
1356 0,
1357 {SPV_OPERAND_TYPE_NONE}},
1358 {"Pipes",
1359 CapabilityPipes,
1360 SPV_OPCODE_FLAGS_NONE,
1361 0,
1362 {SPV_OPERAND_TYPE_NONE}},
1363 {"Groups",
1364 CapabilityGroups,
1365 SPV_OPCODE_FLAGS_NONE,
1366 0,
1367 {SPV_OPERAND_TYPE_NONE}},
1368 {"DeviceEnqueue",
1369 CapabilityDeviceEnqueue,
1370 SPV_OPCODE_FLAGS_NONE,
1371 0,
1372 {SPV_OPERAND_TYPE_NONE}},
David Netoc6402d62015-09-10 16:39:09 -04001373// A macro for defining a capability that doesn't depend on other capabilities.
David Netoe994e2e2015-09-11 12:15:58 -04001374// TODO(dneto): Rev32 adds many dependencies between capbilities.
David Netoc6402d62015-09-10 16:39:09 -04001375#define CASE(NAME) { #NAME, Capability##NAME, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_NONE}}
1376 CASE(LiteralSampler),
1377 CASE(AtomicStorage),
1378 CASE(Int16),
1379 CASE(TessellationPointSize),
1380 CASE(GeometryPointSize),
1381 CASE(ImageGatherExtended),
1382 CASE(StorageImageExtendedFormats),
1383 CASE(StorageImageMultisample),
1384 CASE(UniformBufferArrayDynamicIndexing),
1385 CASE(SampledImageArrayDynamicIndexing),
1386 CASE(StorageBufferArrayDynamicIndexing),
1387 CASE(StorageImageArrayDynamicIndexing),
1388 CASE(ClipDistance),
1389 CASE(CullDistance),
1390 CASE(ImageCubeArray),
1391 CASE(SampleRateShading),
1392#undef CASE
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001393};
1394
1395static const spv_operand_desc_group_t opcodeEntryTypes[] = {
1396 {SPV_OPERAND_TYPE_SOURCE_LANGUAGE,
1397 sizeof(sourceLanguageEntries) / sizeof(spv_operand_desc_t),
1398 sourceLanguageEntries},
1399 {SPV_OPERAND_TYPE_EXECUTION_MODEL,
1400 sizeof(executionModelEntries) / sizeof(spv_operand_desc_t),
1401 executionModelEntries},
1402 {SPV_OPERAND_TYPE_ADDRESSING_MODEL,
1403 sizeof(addressingModelEntries) / sizeof(spv_operand_desc_t),
1404 addressingModelEntries},
1405 {SPV_OPERAND_TYPE_MEMORY_MODEL,
1406 sizeof(memoryModelEntries) / sizeof(spv_operand_desc_t),
1407 memoryModelEntries},
1408 {SPV_OPERAND_TYPE_EXECUTION_MODE,
1409 sizeof(executionModeEntries) / sizeof(spv_operand_desc_t),
1410 executionModeEntries},
1411 {SPV_OPERAND_TYPE_STORAGE_CLASS,
1412 sizeof(storageClassEntries) / sizeof(spv_operand_desc_t),
1413 storageClassEntries},
1414 {SPV_OPERAND_TYPE_DIMENSIONALITY,
1415 sizeof(dimensionalityEntries) / sizeof(spv_operand_desc_t),
1416 dimensionalityEntries},
1417 {SPV_OPERAND_TYPE_SAMPLER_ADDRESSING_MODE,
1418 sizeof(samplerAddressingModeEntries) / sizeof(spv_operand_desc_t),
1419 samplerAddressingModeEntries},
1420 {SPV_OPERAND_TYPE_SAMPLER_FILTER_MODE,
1421 sizeof(samplerFilterModeEntries) / sizeof(spv_operand_desc_t),
1422 samplerFilterModeEntries},
David Netob30a0c52015-09-16 15:56:43 -04001423 {SPV_OPERAND_TYPE_SAMPLER_IMAGE_FORMAT,
1424 sizeof(samplerImageFormatEntries) / sizeof(spv_operand_desc_t),
1425 samplerImageFormatEntries},
David Netoee1b3bb2015-09-18 11:19:18 -04001426 {SPV_OPERAND_TYPE_OPTIONAL_IMAGE,
1427 sizeof(imageOperandEntries) / sizeof(spv_operand_desc_t),
1428 imageOperandEntries},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001429 {SPV_OPERAND_TYPE_FP_FAST_MATH_MODE,
1430 sizeof(fpFastMathModeEntries) / sizeof(spv_operand_desc_t),
1431 fpFastMathModeEntries},
1432 {SPV_OPERAND_TYPE_FP_ROUNDING_MODE,
1433 sizeof(fpRoundingModeEntries) / sizeof(spv_operand_desc_t),
1434 fpRoundingModeEntries},
1435 {SPV_OPERAND_TYPE_LINKAGE_TYPE,
1436 sizeof(linkageTypeEntries) / sizeof(spv_operand_desc_t),
1437 linkageTypeEntries},
1438 {SPV_OPERAND_TYPE_ACCESS_QUALIFIER,
1439 sizeof(accessQualifierEntries) / sizeof(spv_operand_desc_t),
1440 accessQualifierEntries},
1441 {SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE,
1442 sizeof(functionParameterAttributeEntries) / sizeof(spv_operand_desc_t),
1443 functionParameterAttributeEntries},
1444 {SPV_OPERAND_TYPE_DECORATION,
1445 sizeof(decorationEntries) / sizeof(spv_operand_desc_t), decorationEntries},
1446 {SPV_OPERAND_TYPE_BUILT_IN,
1447 sizeof(builtInEntries) / sizeof(spv_operand_desc_t), builtInEntries},
1448 {SPV_OPERAND_TYPE_SELECTION_CONTROL,
1449 sizeof(selectionControlEntries) / sizeof(spv_operand_desc_t),
1450 selectionControlEntries},
1451 {SPV_OPERAND_TYPE_LOOP_CONTROL,
1452 sizeof(loopControlEntries) / sizeof(spv_operand_desc_t),
1453 loopControlEntries},
1454 {SPV_OPERAND_TYPE_FUNCTION_CONTROL,
1455 sizeof(functionControlEntries) / sizeof(spv_operand_desc_t),
1456 functionControlEntries},
1457 {SPV_OPERAND_TYPE_MEMORY_SEMANTICS,
1458 sizeof(memorySemanticsEntries) / sizeof(spv_operand_desc_t),
1459 memorySemanticsEntries},
David Neto78c3b432015-08-27 13:03:52 -04001460 {SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001461 sizeof(memoryAccessEntries) / sizeof(spv_operand_desc_t),
1462 memoryAccessEntries},
1463 {SPV_OPERAND_TYPE_EXECUTION_SCOPE,
1464 sizeof(scopeEntries) / sizeof(spv_operand_desc_t), scopeEntries},
1465 {SPV_OPERAND_TYPE_GROUP_OPERATION,
1466 sizeof(groupOperationEntries) / sizeof(spv_operand_desc_t),
1467 groupOperationEntries},
1468 {SPV_OPERAND_TYPE_KERNEL_ENQ_FLAGS,
1469 sizeof(kernelKernelEnqueueFlagssEntries) / sizeof(spv_operand_desc_t),
1470 kernelKernelEnqueueFlagssEntries},
David Neto47994822015-08-27 13:11:01 -04001471 {SPV_OPERAND_TYPE_KERNEL_PROFILING_INFO,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001472 sizeof(kernelProfilingInfoEntries) / sizeof(spv_operand_desc_t),
1473 kernelProfilingInfoEntries},
1474 {SPV_OPERAND_TYPE_CAPABILITY,
1475 sizeof(capabilityInfoEntries) / sizeof(spv_operand_desc_t),
1476 capabilityInfoEntries},
1477};
1478
1479spv_result_t spvOperandTableGet(spv_operand_table *pOperandTable) {
Lei Zhang40056702015-09-11 14:31:27 -04001480 if (!pOperandTable) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001481
1482 static const spv_operand_table_t table = {
1483 sizeof(opcodeEntryTypes) / sizeof(spv_operand_desc_group_t),
1484 opcodeEntryTypes};
1485
1486 *pOperandTable = &table;
1487
1488 return SPV_SUCCESS;
1489}
1490
1491spv_result_t spvOperandTableNameLookup(const spv_operand_table table,
1492 const spv_operand_type_t type,
David Neto388c40d2015-09-16 16:42:56 -04001493 const char* name,
1494 const size_t nameLength,
1495 spv_operand_desc* pEntry) {
Lei Zhang40056702015-09-11 14:31:27 -04001496 if (!table) return SPV_ERROR_INVALID_TABLE;
1497 if (!name || !pEntry) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001498
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001499 for (uint64_t typeIndex = 0; typeIndex < table->count; ++typeIndex) {
1500 if (type == table->types[typeIndex].type) {
1501 for (uint64_t operandIndex = 0;
1502 operandIndex < table->types[typeIndex].count; ++operandIndex) {
1503 if (nameLength ==
1504 strlen(table->types[typeIndex].entries[operandIndex].name) &&
1505 !strncmp(table->types[typeIndex].entries[operandIndex].name, name,
David Neto388c40d2015-09-16 16:42:56 -04001506 nameLength)) {
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001507 *pEntry = &table->types[typeIndex].entries[operandIndex];
1508 return SPV_SUCCESS;
1509 }
1510 }
1511 }
1512 }
1513
1514 return SPV_ERROR_INVALID_LOOKUP;
1515}
1516
1517spv_result_t spvOperandTableValueLookup(const spv_operand_table table,
1518 const spv_operand_type_t type,
1519 const uint32_t value,
1520 spv_operand_desc *pEntry) {
Lei Zhang40056702015-09-11 14:31:27 -04001521 if (!table) return SPV_ERROR_INVALID_TABLE;
1522 if (!pEntry) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001523
1524 for (uint64_t typeIndex = 0; typeIndex < table->count; ++typeIndex) {
1525 if (type == table->types[typeIndex].type) {
1526 for (uint64_t operandIndex = 0;
1527 operandIndex < table->types[typeIndex].count; ++operandIndex) {
1528 if (value == table->types[typeIndex].entries[operandIndex].value) {
1529 *pEntry = &table->types[typeIndex].entries[operandIndex];
1530 return SPV_SUCCESS;
1531 }
1532 }
1533 }
1534 }
1535
1536 return SPV_ERROR_INVALID_LOOKUP;
1537}
1538
1539const char *spvOperandTypeStr(spv_operand_type_t type) {
1540 switch (type) {
1541 case SPV_OPERAND_TYPE_ID:
David Netofadbf622015-09-14 17:07:11 -04001542 case SPV_OPERAND_TYPE_OPTIONAL_ID:
1543 case SPV_OPERAND_TYPE_ID_IN_OPTIONAL_TUPLE:
1544 return "ID";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001545 case SPV_OPERAND_TYPE_RESULT_ID:
1546 return "result ID";
1547 case SPV_OPERAND_TYPE_LITERAL:
1548 return "literal";
1549 case SPV_OPERAND_TYPE_LITERAL_NUMBER:
1550 return "literal number";
Lei Zhangb41d1502015-09-14 15:22:23 -04001551 case SPV_OPERAND_TYPE_MULTIWORD_LITERAL_NUMBER:
1552 return "multiple word literal number";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001553 case SPV_OPERAND_TYPE_LITERAL_STRING:
1554 return "literal string";
1555 case SPV_OPERAND_TYPE_SOURCE_LANGUAGE:
1556 return "source langauge";
1557 case SPV_OPERAND_TYPE_EXECUTION_MODEL:
1558 return "execution model";
1559 case SPV_OPERAND_TYPE_ADDRESSING_MODEL:
1560 return "addressing model";
1561 case SPV_OPERAND_TYPE_MEMORY_MODEL:
1562 return "memory model";
1563 case SPV_OPERAND_TYPE_EXECUTION_MODE:
1564 return "execution mode";
1565 case SPV_OPERAND_TYPE_STORAGE_CLASS:
1566 return "storage class";
1567 case SPV_OPERAND_TYPE_DIMENSIONALITY:
1568 return "dimensionality";
1569 case SPV_OPERAND_TYPE_SAMPLER_ADDRESSING_MODE:
1570 return "addressing mode";
1571 case SPV_OPERAND_TYPE_SAMPLER_FILTER_MODE:
1572 return "sampler filter mode";
David Netob30a0c52015-09-16 15:56:43 -04001573 case SPV_OPERAND_TYPE_SAMPLER_IMAGE_FORMAT:
1574 return "sampler image format";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001575 case SPV_OPERAND_TYPE_FP_FAST_MATH_MODE:
1576 return "floating pointer fast math mode";
1577 case SPV_OPERAND_TYPE_FP_ROUNDING_MODE:
1578 return "floating point rounding mode";
1579 case SPV_OPERAND_TYPE_LINKAGE_TYPE:
1580 return "linkage type";
1581 case SPV_OPERAND_TYPE_ACCESS_QUALIFIER:
1582 return "access qualifier";
1583 case SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE:
1584 return "function parameter attribute";
1585 case SPV_OPERAND_TYPE_DECORATION:
1586 return "decoration";
1587 case SPV_OPERAND_TYPE_BUILT_IN:
1588 return "built in";
1589 case SPV_OPERAND_TYPE_SELECTION_CONTROL:
1590 return "selection control";
1591 case SPV_OPERAND_TYPE_LOOP_CONTROL:
1592 return "loop control";
1593 case SPV_OPERAND_TYPE_FUNCTION_CONTROL:
1594 return "function control";
1595 case SPV_OPERAND_TYPE_MEMORY_SEMANTICS:
1596 return "memory semantics";
David Neto78c3b432015-08-27 13:03:52 -04001597 case SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001598 return "memory access";
1599 case SPV_OPERAND_TYPE_EXECUTION_SCOPE:
David Netofadbf622015-09-14 17:07:11 -04001600 return "execution scope ID";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001601 case SPV_OPERAND_TYPE_GROUP_OPERATION:
1602 return "group operation";
1603 case SPV_OPERAND_TYPE_KERNEL_ENQ_FLAGS:
1604 return "kernel enqeue flags";
David Neto47994822015-08-27 13:11:01 -04001605 case SPV_OPERAND_TYPE_KERNEL_PROFILING_INFO:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001606 return "kernel profiling info";
1607 case SPV_OPERAND_TYPE_CAPABILITY:
1608 return "capability";
David Netoee1b3bb2015-09-18 11:19:18 -04001609 case SPV_OPERAND_TYPE_OPTIONAL_IMAGE:
1610 return "image operand";
David Neto78c3b432015-08-27 13:03:52 -04001611 case SPV_OPERAND_TYPE_NONE:
1612 return "NONE";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001613 default:
1614 assert(0 && "Unhandled operand type!");
1615 break;
1616 }
1617 return "unknown";
1618}
David Neto78c3b432015-08-27 13:03:52 -04001619
1620void spvPrependOperandTypes(const spv_operand_type_t* types,
1621 spv_operand_pattern_t* pattern) {
1622 const spv_operand_type_t* endTypes;
1623 for (endTypes = types ; *endTypes != SPV_OPERAND_TYPE_NONE ; ++endTypes)
1624 ;
1625 pattern->insert(pattern->begin(), types, endTypes);
1626}
1627
David Neto5bf88fc2015-09-17 17:06:10 -04001628void spvPrependOperandTypesForMask(const spv_operand_table operandTable,
1629 const spv_operand_type_t type,
1630 const uint32_t mask,
1631 spv_operand_pattern_t* pattern) {
1632 // Scan from highest bits to lowest bits because we will prepend in LIFO
1633 // fashion, and we need the operands for lower order bits to appear first.
1634 for (uint32_t candidate_bit = (1 << 31); candidate_bit; candidate_bit >>= 1) {
1635 if (candidate_bit & mask) {
1636 spv_operand_desc entry = nullptr;
1637 if (SPV_SUCCESS == spvOperandTableValueLookup(operandTable, type,
1638 candidate_bit, &entry)) {
1639 spvPrependOperandTypes(entry->operandTypes, pattern);
1640 }
1641 }
1642 }
1643}
1644
David Neto78c3b432015-08-27 13:03:52 -04001645bool spvOperandIsOptional(spv_operand_type_t type) {
1646 // Variable means zero or more times.
1647 if (spvOperandIsVariable(type))
1648 return true;
1649
1650 switch (type) {
1651 case SPV_OPERAND_TYPE_OPTIONAL_ID:
1652 case SPV_OPERAND_TYPE_OPTIONAL_IMAGE:
1653 case SPV_OPERAND_TYPE_OPTIONAL_LITERAL:
1654 case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_STRING:
1655 case SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS:
1656 case SPV_OPERAND_TYPE_OPTIONAL_EXECUTION_MODE:
1657 return true;
1658 default:
1659 break;
1660 }
1661 return false;
1662}
1663
1664bool spvOperandIsVariable(spv_operand_type_t type) {
1665 switch (type) {
1666 case SPV_OPERAND_TYPE_VARIABLE_ID:
1667 case SPV_OPERAND_TYPE_VARIABLE_LITERAL:
1668 case SPV_OPERAND_TYPE_VARIABLE_ID_LITERAL:
1669 case SPV_OPERAND_TYPE_VARIABLE_LITERAL_ID:
David Neto78c3b432015-08-27 13:03:52 -04001670 case SPV_OPERAND_TYPE_VARIABLE_EXECUTION_MODE:
1671 return true;
1672 default:
1673 break;
1674 }
1675 return false;
1676}
1677
1678
1679bool spvExpandOperandSequenceOnce(spv_operand_type_t type,
1680 spv_operand_pattern_t* pattern) {
1681 switch (type) {
1682 case SPV_OPERAND_TYPE_VARIABLE_ID:
1683 pattern->insert(pattern->begin(), {SPV_OPERAND_TYPE_OPTIONAL_ID, type});
1684 return true;
1685 case SPV_OPERAND_TYPE_VARIABLE_LITERAL:
1686 pattern->insert(pattern->begin(),
1687 {SPV_OPERAND_TYPE_OPTIONAL_LITERAL, type});
1688 return true;
1689 case SPV_OPERAND_TYPE_VARIABLE_LITERAL_ID:
1690 // Represents Zero or more (Literal, Id) pairs.
1691 pattern->insert(pattern->begin(),
1692 {SPV_OPERAND_TYPE_OPTIONAL_LITERAL,
1693 SPV_OPERAND_TYPE_ID_IN_OPTIONAL_TUPLE, type});
1694 return true;
1695 case SPV_OPERAND_TYPE_VARIABLE_ID_LITERAL:
1696 // Represents Zero or more (Id, Literal) pairs.
1697 pattern->insert(pattern->begin(),
1698 {SPV_OPERAND_TYPE_OPTIONAL_ID,
1699 SPV_OPERAND_TYPE_LITERAL_IN_OPTIONAL_TUPLE, type});
1700 return true;
David Neto78c3b432015-08-27 13:03:52 -04001701 case SPV_OPERAND_TYPE_VARIABLE_EXECUTION_MODE:
1702 pattern->insert(pattern->begin(), {SPV_OPERAND_TYPE_OPTIONAL_EXECUTION_MODE, type});
1703 return true;
1704 default:
1705 break;
1706 }
1707 return false;
1708}
1709
1710spv_operand_type_t spvTakeFirstMatchableOperand(spv_operand_pattern_t* pattern) {
1711 assert(!pattern->empty());
1712 spv_operand_type_t result;
1713 do {
1714 result = pattern->front();
1715 pattern->pop_front();
1716 } while(spvExpandOperandSequenceOnce(result, pattern));
1717 return result;
1718}