blob: 962f396f265eb038c674828728e48e2c22b069f7 [file] [log] [blame]
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001// Copyright (c) 2015 The Khronos Group Inc.
2//
3// Permission is hereby granted, free of charge, to any person obtaining a
4// copy of this software and/or associated documentation files (the
5// "Materials"), to deal in the Materials without restriction, including
6// without limitation the rights to use, copy, modify, merge, publish,
7// distribute, sublicense, and/or sell copies of the Materials, and to
8// permit persons to whom the Materials are furnished to do so, subject to
9// the following conditions:
10//
11// The above copyright notice and this permission notice shall be included
12// in all copies or substantial portions of the Materials.
13//
14// MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS
15// KHRONOS STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS
16// SPECIFICATIONS AND HEADER INFORMATION ARE LOCATED AT
17// https://www.khronos.org/registry/
18//
19// THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
20// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
22// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
23// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
24// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
25// MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
26
27#include "operand.h"
28
29#include <assert.h>
30#include <string.h>
31
32static const spv_operand_desc_t sourceLanguageEntries[] = {
33 {"Unknown",
34 SourceLanguageUnknown,
35 SPV_OPCODE_FLAGS_NONE,
36 0,
37 {SPV_OPERAND_TYPE_NONE}},
38 {"ESSL",
39 SourceLanguageESSL,
40 SPV_OPCODE_FLAGS_NONE,
41 0,
42 {SPV_OPERAND_TYPE_NONE}},
43 {"GLSL",
44 SourceLanguageGLSL,
45 SPV_OPCODE_FLAGS_NONE,
46 0,
47 {SPV_OPERAND_TYPE_NONE}},
48 {"OpenCL",
49 SourceLanguageOpenCL,
50 SPV_OPCODE_FLAGS_NONE,
51 0,
52 {SPV_OPERAND_TYPE_NONE}},
53};
54
55static const spv_operand_desc_t executionModelEntries[] = {
56 {"Vertex",
57 ExecutionModelVertex,
58 SPV_OPCODE_FLAGS_CAPABILITIES,
59 CapabilityShader,
60 {SPV_OPERAND_TYPE_NONE}},
61 {"TessellationControl",
62 ExecutionModelTessellationControl,
63 SPV_OPCODE_FLAGS_CAPABILITIES,
64 CapabilityTessellation,
65 {SPV_OPERAND_TYPE_NONE}},
66 {"TessellationEvaluation",
67 ExecutionModelTessellationEvaluation,
68 SPV_OPCODE_FLAGS_CAPABILITIES,
69 CapabilityTessellation,
70 {SPV_OPERAND_TYPE_NONE}},
71 {"Geometry",
72 ExecutionModelGeometry,
73 SPV_OPCODE_FLAGS_CAPABILITIES,
74 CapabilityGeometry,
75 {SPV_OPERAND_TYPE_NONE}},
76 {"Fragment",
77 ExecutionModelFragment,
78 SPV_OPCODE_FLAGS_CAPABILITIES,
79 CapabilityShader,
80 {SPV_OPERAND_TYPE_NONE}},
81 {"GLCompute",
82 ExecutionModelGLCompute,
83 SPV_OPCODE_FLAGS_CAPABILITIES,
84 CapabilityShader,
85 {SPV_OPERAND_TYPE_NONE}},
86 {"Kernel",
87 ExecutionModelKernel,
88 SPV_OPCODE_FLAGS_CAPABILITIES,
89 CapabilityKernel,
90 {SPV_OPERAND_TYPE_NONE}},
91};
92
93static const spv_operand_desc_t addressingModelEntries[] = {
94 {"Logical",
95 AddressingModelLogical,
96 SPV_OPCODE_FLAGS_NONE,
97 0,
98 {SPV_OPERAND_TYPE_NONE}},
99 {"Physical32",
100 AddressingModelPhysical32,
101 SPV_OPCODE_FLAGS_CAPABILITIES,
102 CapabilityAddresses,
103 {SPV_OPERAND_TYPE_NONE}},
104 {"Physical64",
105 AddressingModelPhysical64,
106 SPV_OPCODE_FLAGS_CAPABILITIES,
107 CapabilityAddresses,
108 {SPV_OPERAND_TYPE_NONE}},
109};
110
111static const spv_operand_desc_t memoryModelEntries[] = {
112 {"Simple",
113 MemoryModelSimple,
114 SPV_OPCODE_FLAGS_CAPABILITIES,
115 CapabilityShader,
116 {SPV_OPERAND_TYPE_NONE}},
117 {"GLSL450",
118 MemoryModelGLSL450,
119 SPV_OPCODE_FLAGS_CAPABILITIES,
120 CapabilityShader,
121 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400122 {"OpenCL",
123 MemoryModelOpenCL,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100124 SPV_OPCODE_FLAGS_CAPABILITIES,
125 CapabilityKernel,
126 {SPV_OPERAND_TYPE_NONE}},
127};
128
129static const spv_operand_desc_t executionModeEntries[] = {
130 {"Invocations",
131 ExecutionModeInvocations,
132 SPV_OPCODE_FLAGS_CAPABILITIES,
133 CapabilityGeometry,
134 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
135 {"SpacingEqual",
136 ExecutionModeSpacingEqual,
137 SPV_OPCODE_FLAGS_CAPABILITIES,
138 CapabilityTessellation,
139 {SPV_OPERAND_TYPE_NONE}},
140 {"SpacingFractionalEven",
141 ExecutionModeSpacingFractionalEven,
142 SPV_OPCODE_FLAGS_CAPABILITIES,
143 CapabilityTessellation,
144 {SPV_OPERAND_TYPE_NONE}},
145 {"SpacingFractionalOdd",
146 ExecutionModeSpacingFractionalOdd,
147 SPV_OPCODE_FLAGS_CAPABILITIES,
148 CapabilityTessellation,
149 {SPV_OPERAND_TYPE_NONE}},
150 {"VertexOrderCw",
151 ExecutionModeVertexOrderCw,
152 SPV_OPCODE_FLAGS_CAPABILITIES,
153 CapabilityTessellation,
154 {SPV_OPERAND_TYPE_NONE}},
155 {"VertexOrderCcw",
156 ExecutionModeVertexOrderCcw,
157 SPV_OPCODE_FLAGS_CAPABILITIES,
158 CapabilityTessellation,
159 {SPV_OPERAND_TYPE_NONE}},
160 {"PixelCenterInteger",
161 ExecutionModePixelCenterInteger,
162 SPV_OPCODE_FLAGS_CAPABILITIES,
163 CapabilityShader,
164 {SPV_OPERAND_TYPE_NONE}},
165 {"OriginUpperLeft",
166 ExecutionModeOriginUpperLeft,
167 SPV_OPCODE_FLAGS_CAPABILITIES,
168 CapabilityShader,
169 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400170 {
171 "OriginLowerLeft",
172 ExecutionModeOriginLowerLeft,
173 SPV_OPCODE_FLAGS_CAPABILITIES,
174 CapabilityShader,
175 {SPV_OPERAND_TYPE_NONE},
176 },
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100177 {"EarlyFragmentTests",
178 ExecutionModeEarlyFragmentTests,
179 SPV_OPCODE_FLAGS_CAPABILITIES,
180 CapabilityShader,
181 {SPV_OPERAND_TYPE_NONE}},
182 {"PointMode",
183 ExecutionModePointMode,
184 SPV_OPCODE_FLAGS_CAPABILITIES,
185 CapabilityTessellation,
186 {SPV_OPERAND_TYPE_NONE}},
187 {"Xfb",
188 ExecutionModeXfb,
189 SPV_OPCODE_FLAGS_CAPABILITIES,
190 CapabilityShader,
191 {SPV_OPERAND_TYPE_NONE}},
192 {"DepthReplacing",
193 ExecutionModeDepthReplacing,
194 SPV_OPCODE_FLAGS_CAPABILITIES,
195 CapabilityShader,
196 {SPV_OPERAND_TYPE_NONE}},
197 {"DepthAny",
198 ExecutionModeDepthAny,
199 SPV_OPCODE_FLAGS_CAPABILITIES,
200 CapabilityShader,
201 {SPV_OPERAND_TYPE_NONE}},
202 {"DepthGreater",
203 ExecutionModeDepthGreater,
204 SPV_OPCODE_FLAGS_CAPABILITIES,
205 CapabilityShader,
206 {SPV_OPERAND_TYPE_NONE}},
207 {"DepthLess",
208 ExecutionModeDepthLess,
209 SPV_OPCODE_FLAGS_CAPABILITIES,
210 CapabilityShader,
211 {SPV_OPERAND_TYPE_NONE}},
212 {"DepthUnchanged",
213 ExecutionModeDepthUnchanged,
214 SPV_OPCODE_FLAGS_CAPABILITIES,
215 CapabilityShader,
216 {SPV_OPERAND_TYPE_NONE}},
217 {"LocalSize",
218 ExecutionModeLocalSize,
219 SPV_OPCODE_FLAGS_NONE,
220 0,
221 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_LITERAL_NUMBER,
222 SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
223 {"LocalSizeHint",
224 ExecutionModeLocalSizeHint,
225 SPV_OPCODE_FLAGS_CAPABILITIES,
226 CapabilityKernel,
227 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_LITERAL_NUMBER,
228 SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
229 {"InputPoints",
230 ExecutionModeInputPoints,
231 SPV_OPCODE_FLAGS_CAPABILITIES,
232 CapabilityGeometry,
233 {SPV_OPERAND_TYPE_NONE}},
234 {"InputLines",
235 ExecutionModeInputLines,
236 SPV_OPCODE_FLAGS_CAPABILITIES,
237 CapabilityGeometry,
238 {SPV_OPERAND_TYPE_NONE}},
239 {"InputLinesAdjacency",
240 ExecutionModeInputLinesAdjacency,
241 SPV_OPCODE_FLAGS_CAPABILITIES,
242 CapabilityGeometry,
243 {SPV_OPERAND_TYPE_NONE}},
244 {"InputTriangles",
245 ExecutionModeInputTriangles,
246 SPV_OPCODE_FLAGS_CAPABILITIES,
247 CapabilityGeometry | CapabilityTessellation,
248 {SPV_OPERAND_TYPE_NONE}},
249 {"InputTrianglesAdjacency",
250 ExecutionModeInputTrianglesAdjacency,
251 SPV_OPCODE_FLAGS_CAPABILITIES,
252 CapabilityGeometry,
253 {SPV_OPERAND_TYPE_NONE}},
254 {"InputQuads",
255 ExecutionModeInputQuads,
256 SPV_OPCODE_FLAGS_CAPABILITIES,
257 CapabilityTessellation,
258 {SPV_OPERAND_TYPE_NONE}},
259 {"InputIsolines",
260 ExecutionModeInputIsolines,
261 SPV_OPCODE_FLAGS_CAPABILITIES,
262 CapabilityTessellation,
263 {SPV_OPERAND_TYPE_NONE}},
264 {"OutputVertices",
265 ExecutionModeOutputVertices,
266 SPV_OPCODE_FLAGS_CAPABILITIES,
267 CapabilityGeometry | CapabilityTessellation,
268 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
269 {"OutputPoints",
270 ExecutionModeOutputPoints,
271 SPV_OPCODE_FLAGS_CAPABILITIES,
272 CapabilityGeometry,
273 {SPV_OPERAND_TYPE_NONE}},
274 {"OutputLineStrip",
275 ExecutionModeOutputLineStrip,
276 SPV_OPCODE_FLAGS_CAPABILITIES,
277 CapabilityGeometry,
278 {SPV_OPERAND_TYPE_NONE}},
279 {"OutputTriangleStrip",
280 ExecutionModeOutputTriangleStrip,
281 SPV_OPCODE_FLAGS_CAPABILITIES,
282 CapabilityGeometry,
283 {SPV_OPERAND_TYPE_NONE}},
284 {"VecTypeHint",
285 ExecutionModeVecTypeHint,
286 SPV_OPCODE_FLAGS_CAPABILITIES,
287 CapabilityKernel,
Andrew Woloszyne0d351b2015-09-22 15:49:27 -0400288 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100289 {"ContractionOff",
290 ExecutionModeContractionOff,
291 SPV_OPCODE_FLAGS_CAPABILITIES,
292 CapabilityKernel,
293 {SPV_OPERAND_TYPE_NONE}},
David Neto3e52dd92015-09-23 10:16:39 -0400294 {"IndependentForwardProgress",
295 ExecutionModeIndependentForwardProgress,
296 SPV_OPCODE_FLAGS_CAPABILITIES,
297 CapabilityKernel,
298 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100299};
300
301static const spv_operand_desc_t storageClassEntries[] = {
David Neto5494dd42015-09-15 16:41:38 -0400302 // TODO(dneto): There are more storage classes in Rev32 and later.
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100303 {"UniformConstant",
304 StorageClassUniformConstant,
305 SPV_OPCODE_FLAGS_NONE,
306 0,
307 {SPV_OPERAND_TYPE_NONE}},
308 {"Input",
309 StorageClassInput,
310 SPV_OPCODE_FLAGS_CAPABILITIES,
311 CapabilityShader,
312 {SPV_OPERAND_TYPE_NONE}},
313 {"Uniform",
314 StorageClassUniform,
315 SPV_OPCODE_FLAGS_CAPABILITIES,
316 CapabilityShader,
317 {SPV_OPERAND_TYPE_NONE}},
318 {"Output",
319 StorageClassOutput,
320 SPV_OPCODE_FLAGS_CAPABILITIES,
321 CapabilityShader,
322 {SPV_OPERAND_TYPE_NONE}},
323 {"WorkgroupLocal",
324 StorageClassWorkgroupLocal,
325 SPV_OPCODE_FLAGS_NONE,
326 0,
327 {SPV_OPERAND_TYPE_NONE}},
328 {"WorkgroupGlobal",
329 StorageClassWorkgroupGlobal,
330 SPV_OPCODE_FLAGS_NONE,
331 0,
332 {SPV_OPERAND_TYPE_NONE}},
333 {"PrivateGlobal",
334 StorageClassPrivateGlobal,
335 SPV_OPCODE_FLAGS_CAPABILITIES,
336 CapabilityShader,
337 {SPV_OPERAND_TYPE_NONE}},
338 {"Function",
339 StorageClassFunction,
340 SPV_OPCODE_FLAGS_NONE,
341 0,
342 {SPV_OPERAND_TYPE_NONE}},
343 {"Generic",
344 StorageClassGeneric,
345 SPV_OPCODE_FLAGS_CAPABILITIES,
346 CapabilityKernel,
347 {SPV_OPERAND_TYPE_NONE}},
David Neto9819adf2015-09-23 10:19:57 -0400348 {"PushConstant",
349 StorageClassPushConstant,
350 SPV_OPCODE_FLAGS_CAPABILITIES,
351 CapabilityShader,
352 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100353 {"AtomicCounter",
354 StorageClassAtomicCounter,
355 SPV_OPCODE_FLAGS_CAPABILITIES,
356 CapabilityShader,
357 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400358 {"Image",
359 StorageClassImage,
360 SPV_OPCODE_FLAGS_NONE,
361 0,
362 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100363};
364
365static const spv_operand_desc_t dimensionalityEntries[] = {
366 {"1D", Dim1D, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_NONE}},
367 {"2D", Dim2D, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_NONE}},
368 {"3D", Dim3D, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_NONE}},
369 {"Cube",
370 DimCube,
371 SPV_OPCODE_FLAGS_CAPABILITIES,
372 CapabilityShader,
373 {SPV_OPERAND_TYPE_NONE}},
374 {"Rect",
375 DimRect,
376 SPV_OPCODE_FLAGS_CAPABILITIES,
377 CapabilityShader,
378 {SPV_OPERAND_TYPE_NONE}},
379 {"Buffer", DimBuffer, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_NONE}},
380};
381
382static const spv_operand_desc_t samplerAddressingModeEntries[] = {
383 {"None",
384 SamplerAddressingModeNone,
385 SPV_OPCODE_FLAGS_CAPABILITIES,
386 CapabilityKernel,
387 {SPV_OPERAND_TYPE_NONE}},
388 {"ClampToEdge",
389 SamplerAddressingModeClampToEdge,
390 SPV_OPCODE_FLAGS_CAPABILITIES,
391 CapabilityKernel,
392 {SPV_OPERAND_TYPE_NONE}},
393 {"Clamp",
394 SamplerAddressingModeClamp,
395 SPV_OPCODE_FLAGS_CAPABILITIES,
396 CapabilityKernel,
397 {SPV_OPERAND_TYPE_NONE}},
398 {"Repeat",
399 SamplerAddressingModeRepeat,
400 SPV_OPCODE_FLAGS_CAPABILITIES,
401 CapabilityKernel,
402 {SPV_OPERAND_TYPE_NONE}},
403 {"RepeatMirrored",
404 SamplerAddressingModeRepeatMirrored,
405 SPV_OPCODE_FLAGS_CAPABILITIES,
406 CapabilityKernel,
407 {SPV_OPERAND_TYPE_NONE}},
408};
409
410static const spv_operand_desc_t samplerFilterModeEntries[] = {
411 {"Nearest",
412 SamplerFilterModeNearest,
413 SPV_OPCODE_FLAGS_CAPABILITIES,
414 CapabilityKernel,
415 {SPV_OPERAND_TYPE_NONE}},
416 {"Linear",
417 SamplerFilterModeLinear,
418 SPV_OPCODE_FLAGS_CAPABILITIES,
419 CapabilityKernel,
420 {SPV_OPERAND_TYPE_NONE}},
421};
422
David Netob30a0c52015-09-16 15:56:43 -0400423static const spv_operand_desc_t samplerImageFormatEntries[] = {
424// In Rev31, all the cases depend on the Shader capability.
425// TODO(dneto): In Rev32, many of these depend on the AdvancedFormats
426// capability instead.
427#define CASE(NAME) \
428 { \
429 #NAME, ImageFormat##NAME, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityShader, \
430 { \
431 SPV_OPERAND_TYPE_NONE \
432 } \
433 }
434 // clang-format off
435 CASE(Unknown),
436 CASE(Rgba32f),
437 CASE(Rgba16f),
438 CASE(R32f),
439 CASE(Rgba8),
440 CASE(Rgba8Snorm),
441 CASE(Rg32f),
442 CASE(Rg16f),
443 CASE(R11fG11fB10f),
444 CASE(R16f),
445 CASE(Rgba16),
446 CASE(Rgb10A2),
447 CASE(Rg16),
448 CASE(Rg8),
449 CASE(R16),
450 CASE(R8),
451 CASE(Rgba16Snorm),
452 CASE(Rg16Snorm),
453 CASE(Rg8Snorm),
454 CASE(R16Snorm),
455 CASE(R8Snorm),
456 CASE(Rgba32i),
457 CASE(Rgba16i),
458 CASE(Rgba8i),
459 CASE(R32i),
460 CASE(Rg32i),
461 CASE(Rg16i),
462 CASE(Rg8i),
463 CASE(R16i),
464 CASE(R8i),
465 CASE(Rgba32ui),
466 CASE(Rgba16ui),
467 CASE(Rgba8ui),
468 CASE(R32ui),
469 CASE(Rgb10a2ui),
470 CASE(Rg32ui),
471 CASE(Rg16ui),
472 CASE(Rg8ui),
473 CASE(R16ui),
474 CASE(R8ui),
475 // clang-format on
476#undef CASE
477};
478
David Netoee1b3bb2015-09-18 11:19:18 -0400479// Image operand definitions. Each enum value is a mask. When that mask
480// bit is set, the instruction should have further ID operands.
481// Some mask values depend on a capability.
482static const spv_operand_desc_t imageOperandEntries[] = {
483// Rev32 and later adds many more enums.
484#define CASE(NAME) \
485 #NAME, spv::ImageOperands##NAME##Mask, SPV_OPCODE_FLAGS_NONE, 0
486#define CASE_CAP(NAME, CAP) \
487 #NAME, spv::ImageOperands##NAME##Mask, SPV_OPCODE_FLAGS_CAPABILITIES, CAP
488#define ID SPV_OPERAND_TYPE_ID
489#define NONE SPV_OPERAND_TYPE_NONE
490 {"None", spv::ImageOperandsMaskNone, SPV_OPCODE_FLAGS_NONE, 0, {NONE}},
491 {CASE_CAP(Bias, CapabilityShader), {ID, NONE}},
492 {CASE(Lod), {ID, NONE}},
493 {CASE(Grad), {ID, ID, NONE}},
494 {CASE(ConstOffset), {ID, NONE}},
495 {CASE_CAP(Offset, CapabilityImageGatherExtended), {ID, NONE}},
496 {CASE(ConstOffsets), {ID, NONE}},
497 {CASE(Sample), {ID, NONE}},
498#undef CASE
499#undef CASE_CAP
500#undef ID
501#undef NONE
502};
503
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100504static const spv_operand_desc_t fpFastMathModeEntries[] = {
505 {"None",
506 FPFastMathModeMaskNone,
507 SPV_OPCODE_FLAGS_NONE,
508 0,
509 {SPV_OPERAND_TYPE_NONE}},
510 {"NotNaN",
511 FPFastMathModeNotNaNMask,
512 SPV_OPCODE_FLAGS_CAPABILITIES,
513 CapabilityKernel,
514 {SPV_OPERAND_TYPE_NONE}},
515 {"NotInf",
516 FPFastMathModeNotInfMask,
517 SPV_OPCODE_FLAGS_CAPABILITIES,
518 CapabilityKernel,
519 {SPV_OPERAND_TYPE_NONE}},
520 {"NSZ",
521 FPFastMathModeNSZMask,
522 SPV_OPCODE_FLAGS_CAPABILITIES,
523 CapabilityKernel,
524 {SPV_OPERAND_TYPE_NONE}},
525 {"AllowRecip",
526 FPFastMathModeAllowRecipMask,
527 SPV_OPCODE_FLAGS_CAPABILITIES,
528 CapabilityKernel,
529 {SPV_OPERAND_TYPE_NONE}},
530 {"Fast",
531 FPFastMathModeFastMask,
532 SPV_OPCODE_FLAGS_CAPABILITIES,
533 CapabilityKernel,
534 {SPV_OPERAND_TYPE_NONE}},
535};
536
537static const spv_operand_desc_t fpRoundingModeEntries[] = {
538 {"RTE",
539 FPRoundingModeRTE,
540 SPV_OPCODE_FLAGS_CAPABILITIES,
541 CapabilityKernel,
542 {SPV_OPERAND_TYPE_NONE}},
543 {"RTZ",
544 FPRoundingModeRTZ,
545 SPV_OPCODE_FLAGS_CAPABILITIES,
546 CapabilityKernel,
547 {SPV_OPERAND_TYPE_NONE}},
548 {"RTP",
549 FPRoundingModeRTP,
550 SPV_OPCODE_FLAGS_CAPABILITIES,
551 CapabilityKernel,
552 {SPV_OPERAND_TYPE_NONE}},
553 {"RTN",
554 FPRoundingModeRTN,
555 SPV_OPCODE_FLAGS_CAPABILITIES,
556 CapabilityKernel,
557 {SPV_OPERAND_TYPE_NONE}},
558};
559
560static const spv_operand_desc_t linkageTypeEntries[] = {
561 {"Export",
562 LinkageTypeExport,
563 SPV_OPCODE_FLAGS_CAPABILITIES,
564 CapabilityLinkage,
565 {SPV_OPERAND_TYPE_NONE}},
566 {"Import",
567 LinkageTypeImport,
568 SPV_OPCODE_FLAGS_CAPABILITIES,
569 CapabilityLinkage,
570 {SPV_OPERAND_TYPE_NONE}},
571};
572
573static const spv_operand_desc_t accessQualifierEntries[] = {
574 {"ReadOnly",
575 AccessQualifierReadOnly,
576 SPV_OPCODE_FLAGS_CAPABILITIES,
577 CapabilityKernel,
578 {SPV_OPERAND_TYPE_NONE}},
579 {"WriteOnly",
580 AccessQualifierWriteOnly,
581 SPV_OPCODE_FLAGS_CAPABILITIES,
582 CapabilityKernel,
583 {SPV_OPERAND_TYPE_NONE}},
584 {"ReadWrite",
585 AccessQualifierReadWrite,
586 SPV_OPCODE_FLAGS_CAPABILITIES,
587 CapabilityKernel,
588 {SPV_OPERAND_TYPE_NONE}},
589};
590
591static const spv_operand_desc_t functionParameterAttributeEntries[] = {
592 {"Zext",
593 FunctionParameterAttributeZext,
594 SPV_OPCODE_FLAGS_CAPABILITIES,
595 CapabilityKernel,
596 {SPV_OPERAND_TYPE_NONE}},
597 {"Sext",
598 FunctionParameterAttributeSext,
599 SPV_OPCODE_FLAGS_CAPABILITIES,
600 CapabilityKernel,
601 {SPV_OPERAND_TYPE_NONE}},
602 {"ByVal",
603 FunctionParameterAttributeByVal,
604 SPV_OPCODE_FLAGS_CAPABILITIES,
605 CapabilityKernel,
606 {SPV_OPERAND_TYPE_NONE}},
607 {"Sret",
608 FunctionParameterAttributeSret,
609 SPV_OPCODE_FLAGS_CAPABILITIES,
610 CapabilityKernel,
611 {SPV_OPERAND_TYPE_NONE}},
612 {"NoAlias",
613 FunctionParameterAttributeNoAlias,
614 SPV_OPCODE_FLAGS_CAPABILITIES,
615 CapabilityKernel,
616 {SPV_OPERAND_TYPE_NONE}},
David Neto37547b22015-09-10 13:23:11 -0400617 {"NoCapture",
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100618 FunctionParameterAttributeNoCapture,
619 SPV_OPCODE_FLAGS_CAPABILITIES,
620 CapabilityKernel,
621 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100622 {"NoWrite",
623 FunctionParameterAttributeNoWrite,
624 SPV_OPCODE_FLAGS_CAPABILITIES,
625 CapabilityKernel,
626 {SPV_OPERAND_TYPE_NONE}},
627 {"NoReadWrite",
628 FunctionParameterAttributeNoReadWrite,
629 SPV_OPCODE_FLAGS_CAPABILITIES,
630 CapabilityKernel,
631 {SPV_OPERAND_TYPE_NONE}},
632};
633
634static const spv_operand_desc_t decorationEntries[] = {
Lei Zhang604e5ce2015-08-14 14:46:43 -0400635 {"RelaxedPrecision",
636 DecorationRelaxedPrecision,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100637 SPV_OPCODE_FLAGS_CAPABILITIES,
638 CapabilityShader,
639 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400640 {
641 "SpecId",
642 DecorationSpecId,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100643 SPV_OPCODE_FLAGS_CAPABILITIES,
644 CapabilityShader,
Lei Zhang604e5ce2015-08-14 14:46:43 -0400645 {SPV_OPERAND_TYPE_LITERAL_NUMBER},
646 },
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100647 {"Block",
648 DecorationBlock,
649 SPV_OPCODE_FLAGS_CAPABILITIES,
650 CapabilityShader,
651 {SPV_OPERAND_TYPE_NONE}},
652 {"BufferBlock",
653 DecorationBufferBlock,
654 SPV_OPCODE_FLAGS_CAPABILITIES,
655 CapabilityShader,
656 {SPV_OPERAND_TYPE_NONE}},
657 {"RowMajor",
658 DecorationRowMajor,
659 SPV_OPCODE_FLAGS_CAPABILITIES,
660 CapabilityMatrix,
661 {SPV_OPERAND_TYPE_NONE}},
662 {"ColMajor",
663 DecorationColMajor,
664 SPV_OPCODE_FLAGS_CAPABILITIES,
665 CapabilityMatrix,
666 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400667 {"ArrayStride",
668 DecorationArrayStride,
669 SPV_OPCODE_FLAGS_CAPABILITIES,
670 CapabilityShader,
671 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
672 {"MatrixStride",
673 DecorationMatrixStride,
674 SPV_OPCODE_FLAGS_CAPABILITIES,
675 CapabilityShader,
676 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100677 {"GLSLShared",
678 DecorationGLSLShared,
679 SPV_OPCODE_FLAGS_CAPABILITIES,
680 CapabilityShader,
681 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100682 {"GLSLPacked",
683 DecorationGLSLPacked,
684 SPV_OPCODE_FLAGS_CAPABILITIES,
685 CapabilityShader,
686 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400687 {"CPacked",
688 DecorationCPacked,
689 SPV_OPCODE_FLAGS_CAPABILITIES,
690 CapabilityKernel,
691 {SPV_OPERAND_TYPE_NONE}},
692 {"BuiltIn",
693 DecorationBuiltIn,
694 SPV_OPCODE_FLAGS_CAPABILITIES,
695 CapabilityShader,
696 {SPV_OPERAND_TYPE_BUILT_IN, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100697 {"Smooth",
698 DecorationSmooth,
699 SPV_OPCODE_FLAGS_CAPABILITIES,
700 CapabilityShader,
701 {SPV_OPERAND_TYPE_NONE}},
David Netodbaf4072015-09-22 16:23:06 -0400702 {"NoPerspective",
703 DecorationNoPerspective,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100704 SPV_OPCODE_FLAGS_CAPABILITIES,
705 CapabilityShader,
706 {SPV_OPERAND_TYPE_NONE}},
707 {"Flat",
708 DecorationFlat,
709 SPV_OPCODE_FLAGS_CAPABILITIES,
710 CapabilityShader,
711 {SPV_OPERAND_TYPE_NONE}},
712 {"Patch",
713 DecorationPatch,
714 SPV_OPCODE_FLAGS_CAPABILITIES,
715 CapabilityTessellation,
716 {SPV_OPERAND_TYPE_NONE}},
717 {"Centroid",
718 DecorationCentroid,
719 SPV_OPCODE_FLAGS_CAPABILITIES,
720 CapabilityShader,
721 {SPV_OPERAND_TYPE_NONE}},
722 {"Sample",
723 DecorationSample,
724 SPV_OPCODE_FLAGS_CAPABILITIES,
725 CapabilityShader,
726 {SPV_OPERAND_TYPE_NONE}},
727 {"Invariant",
728 DecorationInvariant,
729 SPV_OPCODE_FLAGS_CAPABILITIES,
730 CapabilityShader,
731 {SPV_OPERAND_TYPE_NONE}},
732 {"Restrict",
733 DecorationRestrict,
734 SPV_OPCODE_FLAGS_NONE,
735 0,
736 {SPV_OPERAND_TYPE_NONE}},
737 {"Aliased",
738 DecorationAliased,
739 SPV_OPCODE_FLAGS_NONE,
740 0,
741 {SPV_OPERAND_TYPE_NONE}},
742 {"Volatile",
743 DecorationVolatile,
744 SPV_OPCODE_FLAGS_NONE,
745 0,
746 {SPV_OPERAND_TYPE_NONE}},
747 {"Constant",
748 DecorationConstant,
749 SPV_OPCODE_FLAGS_CAPABILITIES,
750 CapabilityKernel,
751 {SPV_OPERAND_TYPE_NONE}},
752 {"Coherent",
753 DecorationCoherent,
754 SPV_OPCODE_FLAGS_NONE,
755 0,
756 {SPV_OPERAND_TYPE_NONE}},
David Netodbaf4072015-09-22 16:23:06 -0400757 {"NonWritable",
758 DecorationNonWritable,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100759 SPV_OPCODE_FLAGS_NONE,
760 0,
761 {SPV_OPERAND_TYPE_NONE}},
David Netodbaf4072015-09-22 16:23:06 -0400762 {"NonReadable",
763 DecorationNonReadable,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100764 SPV_OPCODE_FLAGS_NONE,
765 0,
766 {SPV_OPERAND_TYPE_NONE}},
767 {"Uniform",
768 DecorationUniform,
769 SPV_OPCODE_FLAGS_CAPABILITIES,
770 CapabilityShader,
771 {SPV_OPERAND_TYPE_NONE}},
David Neto37547b22015-09-10 13:23:11 -0400772 {"SaturatedConversion",
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100773 DecorationSaturatedConversion,
774 SPV_OPCODE_FLAGS_CAPABILITIES,
775 CapabilityKernel,
776 {SPV_OPERAND_TYPE_NONE}},
777 {"Stream",
778 DecorationStream,
779 SPV_OPCODE_FLAGS_CAPABILITIES,
780 CapabilityGeometry,
781 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
782 {"Location",
783 DecorationLocation,
784 SPV_OPCODE_FLAGS_CAPABILITIES,
785 CapabilityShader,
786 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
787 {"Component",
788 DecorationComponent,
789 SPV_OPCODE_FLAGS_CAPABILITIES,
790 CapabilityShader,
791 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
792 {"Index",
793 DecorationIndex,
794 SPV_OPCODE_FLAGS_CAPABILITIES,
795 CapabilityShader,
796 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
797 {"Binding",
798 DecorationBinding,
799 SPV_OPCODE_FLAGS_CAPABILITIES,
800 CapabilityShader,
801 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
802 {"DescriptorSet",
803 DecorationDescriptorSet,
804 SPV_OPCODE_FLAGS_CAPABILITIES,
805 CapabilityShader,
806 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
807 {"Offset",
808 DecorationOffset,
809 SPV_OPCODE_FLAGS_NONE,
810 0,
811 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100812 {"XfbBuffer",
813 DecorationXfbBuffer,
814 SPV_OPCODE_FLAGS_CAPABILITIES,
815 CapabilityShader,
816 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400817 {"XfbStride",
818 DecorationXfbStride,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100819 SPV_OPCODE_FLAGS_CAPABILITIES,
820 CapabilityShader,
821 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100822 {"FuncParamAttr",
823 DecorationFuncParamAttr,
824 SPV_OPCODE_FLAGS_CAPABILITIES,
825 CapabilityKernel,
826 {SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE, SPV_OPERAND_TYPE_NONE}},
827 {"FPRoundingMode",
828 DecorationFPRoundingMode,
829 SPV_OPCODE_FLAGS_CAPABILITIES,
830 CapabilityKernel,
831 {SPV_OPERAND_TYPE_FP_ROUNDING_MODE, SPV_OPERAND_TYPE_NONE}},
832 {"FPFastMathMode",
David Neto37547b22015-09-10 13:23:11 -0400833 DecorationFPFastMathMode,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100834 SPV_OPCODE_FLAGS_CAPABILITIES,
835 CapabilityKernel,
836 {SPV_OPERAND_TYPE_FP_FAST_MATH_MODE, SPV_OPERAND_TYPE_NONE}},
837 {"LinkageAttributes",
838 DecorationLinkageAttributes,
839 SPV_OPCODE_FLAGS_CAPABILITIES,
840 CapabilityLinkage,
David Neto55bdfcb2015-09-10 15:51:57 -0400841 {SPV_OPERAND_TYPE_LITERAL_STRING, SPV_OPERAND_TYPE_LINKAGE_TYPE, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100842};
843
844static const spv_operand_desc_t builtInEntries[] = {
845 {"Position",
846 BuiltInPosition,
847 SPV_OPCODE_FLAGS_CAPABILITIES,
848 CapabilityShader,
849 {SPV_OPERAND_TYPE_NONE}},
850 {"PointSize",
851 BuiltInPointSize,
852 SPV_OPCODE_FLAGS_CAPABILITIES,
853 CapabilityShader,
854 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100855 {"ClipDistance",
856 BuiltInClipDistance,
857 SPV_OPCODE_FLAGS_CAPABILITIES,
858 CapabilityShader,
859 {SPV_OPERAND_TYPE_NONE}},
860 {"CullDistance",
861 BuiltInCullDistance,
862 SPV_OPCODE_FLAGS_CAPABILITIES,
863 CapabilityShader,
864 {SPV_OPERAND_TYPE_NONE}},
865 {"VertexId",
866 BuiltInVertexId,
867 SPV_OPCODE_FLAGS_CAPABILITIES,
868 CapabilityShader,
869 {SPV_OPERAND_TYPE_NONE}},
870 {"InstanceId",
871 BuiltInInstanceId,
872 SPV_OPCODE_FLAGS_CAPABILITIES,
873 CapabilityShader,
874 {SPV_OPERAND_TYPE_NONE}},
875 {"PrimitiveId",
876 BuiltInPrimitiveId,
877 SPV_OPCODE_FLAGS_CAPABILITIES,
878 CapabilityGeometry | CapabilityTessellation,
879 {SPV_OPERAND_TYPE_NONE}},
880 {"InvocationId",
881 BuiltInInvocationId,
882 SPV_OPCODE_FLAGS_CAPABILITIES,
883 CapabilityGeometry | CapabilityTessellation,
884 {SPV_OPERAND_TYPE_NONE}},
885 {"Layer",
886 BuiltInLayer,
887 SPV_OPCODE_FLAGS_CAPABILITIES,
888 CapabilityGeometry,
889 {SPV_OPERAND_TYPE_NONE}},
890 {"ViewportIndex",
891 BuiltInViewportIndex,
892 SPV_OPCODE_FLAGS_CAPABILITIES,
893 CapabilityGeometry,
894 {SPV_OPERAND_TYPE_NONE}},
895 {"TessLevelOuter",
896 BuiltInTessLevelOuter,
897 SPV_OPCODE_FLAGS_CAPABILITIES,
898 CapabilityTessellation,
899 {SPV_OPERAND_TYPE_NONE}},
900 {"TessLevelInner",
901 BuiltInTessLevelInner,
902 SPV_OPCODE_FLAGS_CAPABILITIES,
903 CapabilityTessellation,
904 {SPV_OPERAND_TYPE_NONE}},
905 {"TessCoord",
906 BuiltInTessCoord,
907 SPV_OPCODE_FLAGS_CAPABILITIES,
908 CapabilityTessellation,
909 {SPV_OPERAND_TYPE_NONE}},
910 {"PatchVertices",
911 BuiltInPatchVertices,
912 SPV_OPCODE_FLAGS_CAPABILITIES,
913 CapabilityTessellation,
914 {SPV_OPERAND_TYPE_NONE}},
915 {"FragCoord",
916 BuiltInFragCoord,
917 SPV_OPCODE_FLAGS_CAPABILITIES,
918 CapabilityShader,
919 {SPV_OPERAND_TYPE_NONE}},
920 {"PointCoord",
921 BuiltInPointCoord,
922 SPV_OPCODE_FLAGS_CAPABILITIES,
923 CapabilityShader,
924 {SPV_OPERAND_TYPE_NONE}},
925 {"FrontFacing",
926 BuiltInFrontFacing,
927 SPV_OPCODE_FLAGS_CAPABILITIES,
928 CapabilityShader,
929 {SPV_OPERAND_TYPE_NONE}},
930 {"SampleId",
931 BuiltInSampleId,
932 SPV_OPCODE_FLAGS_CAPABILITIES,
933 CapabilityShader,
934 {SPV_OPERAND_TYPE_NONE}},
935 {"SamplePosition",
936 BuiltInSamplePosition,
937 SPV_OPCODE_FLAGS_CAPABILITIES,
938 CapabilityShader,
939 {SPV_OPERAND_TYPE_NONE}},
940 {"SampleMask",
941 BuiltInSampleMask,
942 SPV_OPCODE_FLAGS_CAPABILITIES,
943 CapabilityShader,
944 {SPV_OPERAND_TYPE_NONE}},
945 {"FragColor",
946 BuiltInFragColor,
947 SPV_OPCODE_FLAGS_CAPABILITIES,
948 CapabilityShader,
949 {SPV_OPERAND_TYPE_NONE}},
950 {"FragDepth",
951 BuiltInFragDepth,
952 SPV_OPCODE_FLAGS_CAPABILITIES,
953 CapabilityShader,
954 {SPV_OPERAND_TYPE_NONE}},
955 {"HelperInvocation",
956 BuiltInHelperInvocation,
957 SPV_OPCODE_FLAGS_CAPABILITIES,
958 CapabilityShader,
959 {SPV_OPERAND_TYPE_NONE}},
960 {"NumWorkgroups",
961 BuiltInNumWorkgroups,
962 SPV_OPCODE_FLAGS_NONE,
963 0,
964 {SPV_OPERAND_TYPE_NONE}},
965 {"WorkgroupSize",
966 BuiltInWorkgroupSize,
967 SPV_OPCODE_FLAGS_NONE,
968 0,
969 {SPV_OPERAND_TYPE_NONE}},
970 {"WorkgroupId",
971 BuiltInWorkgroupId,
972 SPV_OPCODE_FLAGS_NONE,
973 0,
974 {SPV_OPERAND_TYPE_NONE}},
975 {"LocalInvocationId",
976 BuiltInLocalInvocationId,
977 SPV_OPCODE_FLAGS_NONE,
978 0,
979 {SPV_OPERAND_TYPE_NONE}},
980 {"GlobalInvocationId",
981 BuiltInGlobalInvocationId,
982 SPV_OPCODE_FLAGS_NONE,
983 0,
984 {SPV_OPERAND_TYPE_NONE}},
985 {"LocalInvocationIndex",
David Neto37547b22015-09-10 13:23:11 -0400986 BuiltInLocalInvocationIndex,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100987 SPV_OPCODE_FLAGS_CAPABILITIES,
988 CapabilityShader,
989 {SPV_OPERAND_TYPE_NONE}},
990 {"WorkDim",
991 BuiltInWorkDim,
992 SPV_OPCODE_FLAGS_CAPABILITIES,
993 CapabilityKernel,
994 {SPV_OPERAND_TYPE_NONE}},
995 {"GlobalSize",
996 BuiltInGlobalSize,
997 SPV_OPCODE_FLAGS_CAPABILITIES,
998 CapabilityKernel,
999 {SPV_OPERAND_TYPE_NONE}},
1000 {"EnqueuedWorkgroupSize",
1001 BuiltInEnqueuedWorkgroupSize,
1002 SPV_OPCODE_FLAGS_CAPABILITIES,
1003 CapabilityKernel,
1004 {SPV_OPERAND_TYPE_NONE}},
1005 {"GlobalOffset",
1006 BuiltInGlobalOffset,
1007 SPV_OPCODE_FLAGS_CAPABILITIES,
1008 CapabilityKernel,
1009 {SPV_OPERAND_TYPE_NONE}},
1010 {"GlobalLinearId",
1011 BuiltInGlobalLinearId,
1012 SPV_OPCODE_FLAGS_CAPABILITIES,
1013 CapabilityKernel,
1014 {SPV_OPERAND_TYPE_NONE}},
1015 {"WorkgroupLinearId",
1016 BuiltInWorkgroupLinearId,
1017 SPV_OPCODE_FLAGS_CAPABILITIES,
1018 CapabilityKernel,
1019 {SPV_OPERAND_TYPE_NONE}},
1020 {"SubgroupSize",
1021 BuiltInSubgroupSize,
1022 SPV_OPCODE_FLAGS_CAPABILITIES,
1023 CapabilityKernel,
1024 {SPV_OPERAND_TYPE_NONE}},
1025 {"SubgroupMaxSize",
1026 BuiltInSubgroupMaxSize,
1027 SPV_OPCODE_FLAGS_CAPABILITIES,
1028 CapabilityKernel,
1029 {SPV_OPERAND_TYPE_NONE}},
1030 {"NumSubgroups",
1031 BuiltInNumSubgroups,
1032 SPV_OPCODE_FLAGS_CAPABILITIES,
1033 CapabilityKernel,
1034 {SPV_OPERAND_TYPE_NONE}},
1035 {"NumEnqueuedSubgroups",
1036 BuiltInNumEnqueuedSubgroups,
1037 SPV_OPCODE_FLAGS_CAPABILITIES,
1038 CapabilityKernel,
1039 {SPV_OPERAND_TYPE_NONE}},
1040 {"SubgroupId",
David Neto37547b22015-09-10 13:23:11 -04001041 BuiltInSubgroupId,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001042 SPV_OPCODE_FLAGS_CAPABILITIES,
1043 CapabilityKernel,
1044 {SPV_OPERAND_TYPE_NONE}},
1045 {"SubgroupLocalInvocationId",
1046 BuiltInSubgroupLocalInvocationId,
1047 SPV_OPCODE_FLAGS_CAPABILITIES,
1048 CapabilityKernel,
1049 {SPV_OPERAND_TYPE_NONE}},
1050};
1051
1052static const spv_operand_desc_t selectionControlEntries[] = {
1053 {"None",
1054 SelectionControlMaskNone,
1055 SPV_OPCODE_FLAGS_NONE,
1056 0,
1057 {SPV_OPERAND_TYPE_NONE}},
1058 {"Flatten",
1059 SelectionControlFlattenMask,
1060 SPV_OPCODE_FLAGS_NONE,
1061 0,
1062 {SPV_OPERAND_TYPE_NONE}},
1063 {"DontFlatten",
1064 SelectionControlDontFlattenMask,
1065 SPV_OPCODE_FLAGS_NONE,
1066 0,
1067 {SPV_OPERAND_TYPE_NONE}},
1068};
1069
1070static const spv_operand_desc_t loopControlEntries[] = {
1071 {"None",
1072 LoopControlMaskNone,
1073 SPV_OPCODE_FLAGS_NONE,
1074 0,
1075 {SPV_OPERAND_TYPE_NONE}},
1076 {"Unroll",
1077 LoopControlUnrollMask,
1078 SPV_OPCODE_FLAGS_NONE,
1079 0,
1080 {SPV_OPERAND_TYPE_NONE}},
1081 {"DontUnroll",
1082 LoopControlDontUnrollMask,
1083 SPV_OPCODE_FLAGS_NONE,
1084 0,
1085 {SPV_OPERAND_TYPE_NONE}},
1086};
1087
1088static const spv_operand_desc_t functionControlEntries[] = {
1089 {"None",
1090 FunctionControlMaskNone,
1091 SPV_OPCODE_FLAGS_NONE,
1092 0,
1093 {SPV_OPERAND_TYPE_NONE}},
David Netof4fde6c2015-09-14 14:50:37 -04001094 {"Inline",
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001095 FunctionControlInlineMask,
1096 SPV_OPCODE_FLAGS_NONE,
1097 0,
1098 {SPV_OPERAND_TYPE_NONE}},
1099 {"DontInline",
1100 FunctionControlDontInlineMask,
1101 SPV_OPCODE_FLAGS_NONE,
1102 0,
1103 {SPV_OPERAND_TYPE_NONE}},
1104 {"Pure",
1105 FunctionControlPureMask,
1106 SPV_OPCODE_FLAGS_NONE,
1107 0,
1108 {SPV_OPERAND_TYPE_NONE}},
1109 {"Const",
1110 FunctionControlConstMask,
1111 SPV_OPCODE_FLAGS_NONE,
1112 0,
1113 {SPV_OPERAND_TYPE_NONE}},
1114};
1115
1116static const spv_operand_desc_t memorySemanticsEntries[] = {
1117 {"None",
1118 MemorySemanticsMaskNone,
1119 SPV_OPCODE_FLAGS_NONE,
1120 0,
1121 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001122 {"SequentiallyConsistent",
1123 MemorySemanticsSequentiallyConsistentMask,
1124 SPV_OPCODE_FLAGS_NONE,
1125 0,
1126 {SPV_OPERAND_TYPE_NONE}},
1127 {"Acquire",
1128 MemorySemanticsAcquireMask,
1129 SPV_OPCODE_FLAGS_NONE,
1130 0,
1131 {SPV_OPERAND_TYPE_NONE}},
1132 {"Release",
1133 MemorySemanticsReleaseMask,
1134 SPV_OPCODE_FLAGS_NONE,
1135 0,
1136 {SPV_OPERAND_TYPE_NONE}},
1137 {"UniformMemory",
1138 MemorySemanticsUniformMemoryMask,
1139 SPV_OPCODE_FLAGS_CAPABILITIES,
1140 CapabilityShader,
1141 {SPV_OPERAND_TYPE_NONE}},
1142 {"SubgroupMemory",
1143 MemorySemanticsSubgroupMemoryMask,
1144 SPV_OPCODE_FLAGS_NONE,
1145 0,
1146 {SPV_OPERAND_TYPE_NONE}},
1147 {"WorkgroupLocalMemory",
1148 MemorySemanticsWorkgroupLocalMemoryMask,
1149 SPV_OPCODE_FLAGS_NONE,
1150 0,
1151 {SPV_OPERAND_TYPE_NONE}},
1152 {"WorkgroupGlobalMemory",
1153 MemorySemanticsWorkgroupGlobalMemoryMask,
1154 SPV_OPCODE_FLAGS_NONE,
1155 0,
1156 {SPV_OPERAND_TYPE_NONE}},
1157 {"AtomicCounterMemory",
1158 MemorySemanticsAtomicCounterMemoryMask,
1159 SPV_OPCODE_FLAGS_CAPABILITIES,
1160 CapabilityShader,
1161 {SPV_OPERAND_TYPE_NONE}},
1162 {
1163 "ImageMemory",
1164 MemorySemanticsImageMemoryMask,
1165 SPV_OPCODE_FLAGS_NONE,
1166 0,
1167 {SPV_OPERAND_TYPE_NONE},
1168 },
1169};
1170
1171static const spv_operand_desc_t memoryAccessEntries[] = {
1172 {"None",
1173 MemoryAccessMaskNone,
1174 SPV_OPCODE_FLAGS_NONE,
1175 0,
1176 {SPV_OPERAND_TYPE_NONE}},
1177 {"Volatile",
1178 MemoryAccessVolatileMask,
1179 SPV_OPCODE_FLAGS_NONE,
1180 0,
1181 {SPV_OPERAND_TYPE_NONE}},
1182 {
1183 "Aligned",
1184 MemoryAccessAlignedMask,
1185 SPV_OPCODE_FLAGS_NONE,
1186 0,
David Neto4a291312015-09-14 15:08:48 -04001187 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001188 },
1189};
1190
1191static const spv_operand_desc_t scopeEntries[] = {
1192 {"CrossDevice",
1193 ScopeCrossDevice,
1194 SPV_OPCODE_FLAGS_NONE,
1195 0,
1196 {SPV_OPERAND_TYPE_NONE}},
1197 {"Device", ScopeDevice, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_NONE}},
1198 {"Workgroup",
1199 ScopeWorkgroup,
1200 SPV_OPCODE_FLAGS_NONE,
1201 0,
1202 {SPV_OPERAND_TYPE_NONE}},
1203 {"Subgroup",
1204 ScopeSubgroup,
1205 SPV_OPCODE_FLAGS_NONE,
1206 0,
1207 {SPV_OPERAND_TYPE_NONE}},
1208 {
1209 "Invocation",
1210 ScopeInvocation,
1211 SPV_OPCODE_FLAGS_NONE,
1212 0,
1213 {SPV_OPERAND_TYPE_NONE},
1214 },
1215};
1216
1217static const spv_operand_desc_t groupOperationEntries[] = {
1218 {"Reduce",
1219 GroupOperationReduce,
1220 SPV_OPCODE_FLAGS_CAPABILITIES,
1221 CapabilityKernel,
1222 {SPV_OPERAND_TYPE_NONE}},
1223 {"InclusiveScan",
1224 GroupOperationInclusiveScan,
1225 SPV_OPCODE_FLAGS_CAPABILITIES,
1226 CapabilityKernel,
1227 {SPV_OPERAND_TYPE_NONE}},
1228 {"ExclusiveScan",
1229 GroupOperationExclusiveScan,
1230 SPV_OPCODE_FLAGS_CAPABILITIES,
1231 CapabilityKernel,
1232 {SPV_OPERAND_TYPE_NONE}},
1233};
1234
1235static const spv_operand_desc_t kernelKernelEnqueueFlagssEntries[] = {
1236 {"NoWait",
1237 KernelEnqueueFlagsNoWait,
1238 SPV_OPCODE_FLAGS_CAPABILITIES,
1239 CapabilityKernel,
1240 {SPV_OPERAND_TYPE_NONE}},
1241 {"WaitKernel",
1242 KernelEnqueueFlagsWaitKernel,
1243 SPV_OPCODE_FLAGS_CAPABILITIES,
1244 CapabilityKernel,
1245 {SPV_OPERAND_TYPE_NONE}},
1246 {"WaitWorkGroup",
1247 KernelEnqueueFlagsWaitWorkGroup,
1248 SPV_OPCODE_FLAGS_CAPABILITIES,
1249 CapabilityKernel,
1250 {SPV_OPERAND_TYPE_NONE}},
1251};
1252
1253static const spv_operand_desc_t kernelProfilingInfoEntries[] = {
1254 {"None",
1255 KernelProfilingInfoMaskNone,
1256 SPV_OPCODE_FLAGS_NONE,
1257 0,
1258 {SPV_OPERAND_TYPE_NONE}},
1259 {"CmdExecTime",
1260 KernelProfilingInfoCmdExecTimeMask,
1261 SPV_OPCODE_FLAGS_CAPABILITIES,
1262 CapabilityKernel,
1263 {SPV_OPERAND_TYPE_NONE}},
1264};
1265
1266static const spv_operand_desc_t capabilityInfoEntries[] = {
1267 {"Matrix",
1268 CapabilityMatrix,
1269 SPV_OPCODE_FLAGS_NONE,
1270 0,
1271 {SPV_OPERAND_TYPE_NONE}},
1272 {"Shader",
1273 CapabilityShader,
1274 SPV_OPCODE_FLAGS_CAPABILITIES,
1275 CapabilityMatrix,
1276 {SPV_OPERAND_TYPE_NONE}},
1277 {"Geometry",
1278 CapabilityGeometry,
1279 SPV_OPCODE_FLAGS_CAPABILITIES,
1280 CapabilityShader,
1281 {SPV_OPERAND_TYPE_NONE}},
1282 {"Tessellation",
1283 CapabilityTessellation,
1284 SPV_OPCODE_FLAGS_CAPABILITIES,
1285 CapabilityShader,
1286 {SPV_OPERAND_TYPE_NONE}},
1287 {"Addresses",
1288 CapabilityAddresses,
1289 SPV_OPCODE_FLAGS_NONE,
1290 0,
1291 {SPV_OPERAND_TYPE_NONE}},
1292 {"Linkage",
1293 CapabilityLinkage,
1294 SPV_OPCODE_FLAGS_NONE,
1295 0,
1296 {SPV_OPERAND_TYPE_NONE}},
1297 {"Kernel",
1298 CapabilityKernel,
1299 SPV_OPCODE_FLAGS_NONE,
1300 0,
1301 {SPV_OPERAND_TYPE_NONE}},
1302 {"Vector16",
1303 CapabilityVector16,
1304 SPV_OPCODE_FLAGS_NONE,
1305 0,
1306 {SPV_OPERAND_TYPE_NONE}},
1307 {"Float16Buffer",
1308 CapabilityFloat16Buffer,
1309 SPV_OPCODE_FLAGS_NONE,
1310 0,
1311 {SPV_OPERAND_TYPE_NONE}},
1312 {"Float16",
1313 CapabilityFloat16,
1314 SPV_OPCODE_FLAGS_NONE,
1315 0,
1316 {SPV_OPERAND_TYPE_NONE}},
1317 {"Float64",
1318 CapabilityFloat64,
1319 SPV_OPCODE_FLAGS_NONE,
1320 0,
1321 {SPV_OPERAND_TYPE_NONE}},
1322 {"Int64",
1323 CapabilityInt64,
1324 SPV_OPCODE_FLAGS_NONE,
1325 0,
1326 {SPV_OPERAND_TYPE_NONE}},
1327 {"Int64Atomics",
1328 CapabilityInt64Atomics,
1329 SPV_OPCODE_FLAGS_NONE,
1330 0,
1331 {SPV_OPERAND_TYPE_NONE}},
1332 {"ImageBasic",
1333 CapabilityImageBasic,
1334 SPV_OPCODE_FLAGS_NONE,
1335 0,
1336 {SPV_OPERAND_TYPE_NONE}},
1337 {"ImageReadWrite",
1338 CapabilityImageReadWrite,
1339 SPV_OPCODE_FLAGS_NONE,
1340 0,
1341 {SPV_OPERAND_TYPE_NONE}},
David Netoc6402d62015-09-10 16:39:09 -04001342 {"ImageMipmap",
1343 CapabilityImageMipmap,
1344 SPV_OPCODE_FLAGS_NONE,
1345 0,
1346 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001347 {"ImageSRGBWrite",
1348 CapabilityImageSRGBWrite,
1349 SPV_OPCODE_FLAGS_NONE,
1350 0,
1351 {SPV_OPERAND_TYPE_NONE}},
1352 {"Pipes",
1353 CapabilityPipes,
1354 SPV_OPCODE_FLAGS_NONE,
1355 0,
1356 {SPV_OPERAND_TYPE_NONE}},
1357 {"Groups",
1358 CapabilityGroups,
1359 SPV_OPCODE_FLAGS_NONE,
1360 0,
1361 {SPV_OPERAND_TYPE_NONE}},
1362 {"DeviceEnqueue",
1363 CapabilityDeviceEnqueue,
1364 SPV_OPCODE_FLAGS_NONE,
1365 0,
1366 {SPV_OPERAND_TYPE_NONE}},
David Netoc6402d62015-09-10 16:39:09 -04001367// A macro for defining a capability that doesn't depend on other capabilities.
David Netoe994e2e2015-09-11 12:15:58 -04001368// TODO(dneto): Rev32 adds many dependencies between capbilities.
David Netoc6402d62015-09-10 16:39:09 -04001369#define CASE(NAME) { #NAME, Capability##NAME, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_NONE}}
1370 CASE(LiteralSampler),
1371 CASE(AtomicStorage),
1372 CASE(Int16),
1373 CASE(TessellationPointSize),
1374 CASE(GeometryPointSize),
1375 CASE(ImageGatherExtended),
1376 CASE(StorageImageExtendedFormats),
1377 CASE(StorageImageMultisample),
1378 CASE(UniformBufferArrayDynamicIndexing),
1379 CASE(SampledImageArrayDynamicIndexing),
1380 CASE(StorageBufferArrayDynamicIndexing),
1381 CASE(StorageImageArrayDynamicIndexing),
1382 CASE(ClipDistance),
1383 CASE(CullDistance),
1384 CASE(ImageCubeArray),
1385 CASE(SampleRateShading),
1386#undef CASE
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001387};
1388
1389static const spv_operand_desc_group_t opcodeEntryTypes[] = {
1390 {SPV_OPERAND_TYPE_SOURCE_LANGUAGE,
1391 sizeof(sourceLanguageEntries) / sizeof(spv_operand_desc_t),
1392 sourceLanguageEntries},
1393 {SPV_OPERAND_TYPE_EXECUTION_MODEL,
1394 sizeof(executionModelEntries) / sizeof(spv_operand_desc_t),
1395 executionModelEntries},
1396 {SPV_OPERAND_TYPE_ADDRESSING_MODEL,
1397 sizeof(addressingModelEntries) / sizeof(spv_operand_desc_t),
1398 addressingModelEntries},
1399 {SPV_OPERAND_TYPE_MEMORY_MODEL,
1400 sizeof(memoryModelEntries) / sizeof(spv_operand_desc_t),
1401 memoryModelEntries},
1402 {SPV_OPERAND_TYPE_EXECUTION_MODE,
1403 sizeof(executionModeEntries) / sizeof(spv_operand_desc_t),
1404 executionModeEntries},
1405 {SPV_OPERAND_TYPE_STORAGE_CLASS,
1406 sizeof(storageClassEntries) / sizeof(spv_operand_desc_t),
1407 storageClassEntries},
1408 {SPV_OPERAND_TYPE_DIMENSIONALITY,
1409 sizeof(dimensionalityEntries) / sizeof(spv_operand_desc_t),
1410 dimensionalityEntries},
1411 {SPV_OPERAND_TYPE_SAMPLER_ADDRESSING_MODE,
1412 sizeof(samplerAddressingModeEntries) / sizeof(spv_operand_desc_t),
1413 samplerAddressingModeEntries},
1414 {SPV_OPERAND_TYPE_SAMPLER_FILTER_MODE,
1415 sizeof(samplerFilterModeEntries) / sizeof(spv_operand_desc_t),
1416 samplerFilterModeEntries},
David Netob30a0c52015-09-16 15:56:43 -04001417 {SPV_OPERAND_TYPE_SAMPLER_IMAGE_FORMAT,
1418 sizeof(samplerImageFormatEntries) / sizeof(spv_operand_desc_t),
1419 samplerImageFormatEntries},
David Netoee1b3bb2015-09-18 11:19:18 -04001420 {SPV_OPERAND_TYPE_OPTIONAL_IMAGE,
1421 sizeof(imageOperandEntries) / sizeof(spv_operand_desc_t),
1422 imageOperandEntries},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001423 {SPV_OPERAND_TYPE_FP_FAST_MATH_MODE,
1424 sizeof(fpFastMathModeEntries) / sizeof(spv_operand_desc_t),
1425 fpFastMathModeEntries},
1426 {SPV_OPERAND_TYPE_FP_ROUNDING_MODE,
1427 sizeof(fpRoundingModeEntries) / sizeof(spv_operand_desc_t),
1428 fpRoundingModeEntries},
1429 {SPV_OPERAND_TYPE_LINKAGE_TYPE,
1430 sizeof(linkageTypeEntries) / sizeof(spv_operand_desc_t),
1431 linkageTypeEntries},
1432 {SPV_OPERAND_TYPE_ACCESS_QUALIFIER,
1433 sizeof(accessQualifierEntries) / sizeof(spv_operand_desc_t),
1434 accessQualifierEntries},
1435 {SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE,
1436 sizeof(functionParameterAttributeEntries) / sizeof(spv_operand_desc_t),
1437 functionParameterAttributeEntries},
1438 {SPV_OPERAND_TYPE_DECORATION,
1439 sizeof(decorationEntries) / sizeof(spv_operand_desc_t), decorationEntries},
1440 {SPV_OPERAND_TYPE_BUILT_IN,
1441 sizeof(builtInEntries) / sizeof(spv_operand_desc_t), builtInEntries},
1442 {SPV_OPERAND_TYPE_SELECTION_CONTROL,
1443 sizeof(selectionControlEntries) / sizeof(spv_operand_desc_t),
1444 selectionControlEntries},
1445 {SPV_OPERAND_TYPE_LOOP_CONTROL,
1446 sizeof(loopControlEntries) / sizeof(spv_operand_desc_t),
1447 loopControlEntries},
1448 {SPV_OPERAND_TYPE_FUNCTION_CONTROL,
1449 sizeof(functionControlEntries) / sizeof(spv_operand_desc_t),
1450 functionControlEntries},
1451 {SPV_OPERAND_TYPE_MEMORY_SEMANTICS,
1452 sizeof(memorySemanticsEntries) / sizeof(spv_operand_desc_t),
1453 memorySemanticsEntries},
David Neto78c3b432015-08-27 13:03:52 -04001454 {SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001455 sizeof(memoryAccessEntries) / sizeof(spv_operand_desc_t),
1456 memoryAccessEntries},
1457 {SPV_OPERAND_TYPE_EXECUTION_SCOPE,
1458 sizeof(scopeEntries) / sizeof(spv_operand_desc_t), scopeEntries},
1459 {SPV_OPERAND_TYPE_GROUP_OPERATION,
1460 sizeof(groupOperationEntries) / sizeof(spv_operand_desc_t),
1461 groupOperationEntries},
1462 {SPV_OPERAND_TYPE_KERNEL_ENQ_FLAGS,
1463 sizeof(kernelKernelEnqueueFlagssEntries) / sizeof(spv_operand_desc_t),
1464 kernelKernelEnqueueFlagssEntries},
David Neto47994822015-08-27 13:11:01 -04001465 {SPV_OPERAND_TYPE_KERNEL_PROFILING_INFO,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001466 sizeof(kernelProfilingInfoEntries) / sizeof(spv_operand_desc_t),
1467 kernelProfilingInfoEntries},
1468 {SPV_OPERAND_TYPE_CAPABILITY,
1469 sizeof(capabilityInfoEntries) / sizeof(spv_operand_desc_t),
1470 capabilityInfoEntries},
1471};
1472
1473spv_result_t spvOperandTableGet(spv_operand_table *pOperandTable) {
Lei Zhang40056702015-09-11 14:31:27 -04001474 if (!pOperandTable) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001475
1476 static const spv_operand_table_t table = {
1477 sizeof(opcodeEntryTypes) / sizeof(spv_operand_desc_group_t),
1478 opcodeEntryTypes};
1479
1480 *pOperandTable = &table;
1481
1482 return SPV_SUCCESS;
1483}
1484
1485spv_result_t spvOperandTableNameLookup(const spv_operand_table table,
1486 const spv_operand_type_t type,
David Neto388c40d2015-09-16 16:42:56 -04001487 const char* name,
1488 const size_t nameLength,
1489 spv_operand_desc* pEntry) {
Lei Zhang40056702015-09-11 14:31:27 -04001490 if (!table) return SPV_ERROR_INVALID_TABLE;
1491 if (!name || !pEntry) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001492
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001493 for (uint64_t typeIndex = 0; typeIndex < table->count; ++typeIndex) {
1494 if (type == table->types[typeIndex].type) {
1495 for (uint64_t operandIndex = 0;
1496 operandIndex < table->types[typeIndex].count; ++operandIndex) {
1497 if (nameLength ==
1498 strlen(table->types[typeIndex].entries[operandIndex].name) &&
1499 !strncmp(table->types[typeIndex].entries[operandIndex].name, name,
David Neto388c40d2015-09-16 16:42:56 -04001500 nameLength)) {
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001501 *pEntry = &table->types[typeIndex].entries[operandIndex];
1502 return SPV_SUCCESS;
1503 }
1504 }
1505 }
1506 }
1507
1508 return SPV_ERROR_INVALID_LOOKUP;
1509}
1510
1511spv_result_t spvOperandTableValueLookup(const spv_operand_table table,
1512 const spv_operand_type_t type,
1513 const uint32_t value,
1514 spv_operand_desc *pEntry) {
Lei Zhang40056702015-09-11 14:31:27 -04001515 if (!table) return SPV_ERROR_INVALID_TABLE;
1516 if (!pEntry) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001517
1518 for (uint64_t typeIndex = 0; typeIndex < table->count; ++typeIndex) {
1519 if (type == table->types[typeIndex].type) {
1520 for (uint64_t operandIndex = 0;
1521 operandIndex < table->types[typeIndex].count; ++operandIndex) {
1522 if (value == table->types[typeIndex].entries[operandIndex].value) {
1523 *pEntry = &table->types[typeIndex].entries[operandIndex];
1524 return SPV_SUCCESS;
1525 }
1526 }
1527 }
1528 }
1529
1530 return SPV_ERROR_INVALID_LOOKUP;
1531}
1532
1533const char *spvOperandTypeStr(spv_operand_type_t type) {
1534 switch (type) {
1535 case SPV_OPERAND_TYPE_ID:
David Netofadbf622015-09-14 17:07:11 -04001536 case SPV_OPERAND_TYPE_OPTIONAL_ID:
1537 case SPV_OPERAND_TYPE_ID_IN_OPTIONAL_TUPLE:
1538 return "ID";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001539 case SPV_OPERAND_TYPE_RESULT_ID:
1540 return "result ID";
1541 case SPV_OPERAND_TYPE_LITERAL:
1542 return "literal";
1543 case SPV_OPERAND_TYPE_LITERAL_NUMBER:
1544 return "literal number";
Lei Zhangb41d1502015-09-14 15:22:23 -04001545 case SPV_OPERAND_TYPE_MULTIWORD_LITERAL_NUMBER:
1546 return "multiple word literal number";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001547 case SPV_OPERAND_TYPE_LITERAL_STRING:
1548 return "literal string";
1549 case SPV_OPERAND_TYPE_SOURCE_LANGUAGE:
1550 return "source langauge";
1551 case SPV_OPERAND_TYPE_EXECUTION_MODEL:
1552 return "execution model";
1553 case SPV_OPERAND_TYPE_ADDRESSING_MODEL:
1554 return "addressing model";
1555 case SPV_OPERAND_TYPE_MEMORY_MODEL:
1556 return "memory model";
1557 case SPV_OPERAND_TYPE_EXECUTION_MODE:
1558 return "execution mode";
1559 case SPV_OPERAND_TYPE_STORAGE_CLASS:
1560 return "storage class";
1561 case SPV_OPERAND_TYPE_DIMENSIONALITY:
1562 return "dimensionality";
1563 case SPV_OPERAND_TYPE_SAMPLER_ADDRESSING_MODE:
1564 return "addressing mode";
1565 case SPV_OPERAND_TYPE_SAMPLER_FILTER_MODE:
1566 return "sampler filter mode";
David Netob30a0c52015-09-16 15:56:43 -04001567 case SPV_OPERAND_TYPE_SAMPLER_IMAGE_FORMAT:
1568 return "sampler image format";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001569 case SPV_OPERAND_TYPE_FP_FAST_MATH_MODE:
1570 return "floating pointer fast math mode";
1571 case SPV_OPERAND_TYPE_FP_ROUNDING_MODE:
1572 return "floating point rounding mode";
1573 case SPV_OPERAND_TYPE_LINKAGE_TYPE:
1574 return "linkage type";
1575 case SPV_OPERAND_TYPE_ACCESS_QUALIFIER:
1576 return "access qualifier";
1577 case SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE:
1578 return "function parameter attribute";
1579 case SPV_OPERAND_TYPE_DECORATION:
1580 return "decoration";
1581 case SPV_OPERAND_TYPE_BUILT_IN:
1582 return "built in";
1583 case SPV_OPERAND_TYPE_SELECTION_CONTROL:
1584 return "selection control";
1585 case SPV_OPERAND_TYPE_LOOP_CONTROL:
1586 return "loop control";
1587 case SPV_OPERAND_TYPE_FUNCTION_CONTROL:
1588 return "function control";
1589 case SPV_OPERAND_TYPE_MEMORY_SEMANTICS:
1590 return "memory semantics";
David Neto78c3b432015-08-27 13:03:52 -04001591 case SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001592 return "memory access";
1593 case SPV_OPERAND_TYPE_EXECUTION_SCOPE:
David Netofadbf622015-09-14 17:07:11 -04001594 return "execution scope ID";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001595 case SPV_OPERAND_TYPE_GROUP_OPERATION:
1596 return "group operation";
1597 case SPV_OPERAND_TYPE_KERNEL_ENQ_FLAGS:
1598 return "kernel enqeue flags";
David Neto47994822015-08-27 13:11:01 -04001599 case SPV_OPERAND_TYPE_KERNEL_PROFILING_INFO:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001600 return "kernel profiling info";
1601 case SPV_OPERAND_TYPE_CAPABILITY:
1602 return "capability";
David Netoee1b3bb2015-09-18 11:19:18 -04001603 case SPV_OPERAND_TYPE_OPTIONAL_IMAGE:
1604 return "image operand";
David Neto78c3b432015-08-27 13:03:52 -04001605 case SPV_OPERAND_TYPE_NONE:
1606 return "NONE";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001607 default:
1608 assert(0 && "Unhandled operand type!");
1609 break;
1610 }
1611 return "unknown";
1612}
David Neto78c3b432015-08-27 13:03:52 -04001613
1614void spvPrependOperandTypes(const spv_operand_type_t* types,
1615 spv_operand_pattern_t* pattern) {
1616 const spv_operand_type_t* endTypes;
1617 for (endTypes = types ; *endTypes != SPV_OPERAND_TYPE_NONE ; ++endTypes)
1618 ;
1619 pattern->insert(pattern->begin(), types, endTypes);
1620}
1621
David Neto5bf88fc2015-09-17 17:06:10 -04001622void spvPrependOperandTypesForMask(const spv_operand_table operandTable,
1623 const spv_operand_type_t type,
1624 const uint32_t mask,
1625 spv_operand_pattern_t* pattern) {
1626 // Scan from highest bits to lowest bits because we will prepend in LIFO
1627 // fashion, and we need the operands for lower order bits to appear first.
1628 for (uint32_t candidate_bit = (1 << 31); candidate_bit; candidate_bit >>= 1) {
1629 if (candidate_bit & mask) {
1630 spv_operand_desc entry = nullptr;
1631 if (SPV_SUCCESS == spvOperandTableValueLookup(operandTable, type,
1632 candidate_bit, &entry)) {
1633 spvPrependOperandTypes(entry->operandTypes, pattern);
1634 }
1635 }
1636 }
1637}
1638
David Neto78c3b432015-08-27 13:03:52 -04001639bool spvOperandIsOptional(spv_operand_type_t type) {
1640 // Variable means zero or more times.
1641 if (spvOperandIsVariable(type))
1642 return true;
1643
1644 switch (type) {
1645 case SPV_OPERAND_TYPE_OPTIONAL_ID:
1646 case SPV_OPERAND_TYPE_OPTIONAL_IMAGE:
1647 case SPV_OPERAND_TYPE_OPTIONAL_LITERAL:
1648 case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_STRING:
1649 case SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS:
1650 case SPV_OPERAND_TYPE_OPTIONAL_EXECUTION_MODE:
1651 return true;
1652 default:
1653 break;
1654 }
1655 return false;
1656}
1657
1658bool spvOperandIsVariable(spv_operand_type_t type) {
1659 switch (type) {
1660 case SPV_OPERAND_TYPE_VARIABLE_ID:
1661 case SPV_OPERAND_TYPE_VARIABLE_LITERAL:
1662 case SPV_OPERAND_TYPE_VARIABLE_ID_LITERAL:
1663 case SPV_OPERAND_TYPE_VARIABLE_LITERAL_ID:
David Neto78c3b432015-08-27 13:03:52 -04001664 case SPV_OPERAND_TYPE_VARIABLE_EXECUTION_MODE:
1665 return true;
1666 default:
1667 break;
1668 }
1669 return false;
1670}
1671
1672
1673bool spvExpandOperandSequenceOnce(spv_operand_type_t type,
1674 spv_operand_pattern_t* pattern) {
1675 switch (type) {
1676 case SPV_OPERAND_TYPE_VARIABLE_ID:
1677 pattern->insert(pattern->begin(), {SPV_OPERAND_TYPE_OPTIONAL_ID, type});
1678 return true;
1679 case SPV_OPERAND_TYPE_VARIABLE_LITERAL:
1680 pattern->insert(pattern->begin(),
1681 {SPV_OPERAND_TYPE_OPTIONAL_LITERAL, type});
1682 return true;
1683 case SPV_OPERAND_TYPE_VARIABLE_LITERAL_ID:
1684 // Represents Zero or more (Literal, Id) pairs.
1685 pattern->insert(pattern->begin(),
1686 {SPV_OPERAND_TYPE_OPTIONAL_LITERAL,
1687 SPV_OPERAND_TYPE_ID_IN_OPTIONAL_TUPLE, type});
1688 return true;
1689 case SPV_OPERAND_TYPE_VARIABLE_ID_LITERAL:
1690 // Represents Zero or more (Id, Literal) pairs.
1691 pattern->insert(pattern->begin(),
1692 {SPV_OPERAND_TYPE_OPTIONAL_ID,
1693 SPV_OPERAND_TYPE_LITERAL_IN_OPTIONAL_TUPLE, type});
1694 return true;
David Neto78c3b432015-08-27 13:03:52 -04001695 case SPV_OPERAND_TYPE_VARIABLE_EXECUTION_MODE:
1696 pattern->insert(pattern->begin(), {SPV_OPERAND_TYPE_OPTIONAL_EXECUTION_MODE, type});
1697 return true;
1698 default:
1699 break;
1700 }
1701 return false;
1702}
1703
1704spv_operand_type_t spvTakeFirstMatchableOperand(spv_operand_pattern_t* pattern) {
1705 assert(!pattern->empty());
1706 spv_operand_type_t result;
1707 do {
1708 result = pattern->front();
1709 pattern->pop_front();
1710 } while(spvExpandOperandSequenceOnce(result, pattern));
1711 return result;
1712}