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