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