blob: 2dd6cc243b4069c7cc100af47e6d1ab6694096b8 [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
Lei Zhang85c6f792015-09-23 15:42:18 -0400129// Execution mode requiring the given capability and having no operands.
130#define ExecMode0(mode, cap) \
131 #mode, ExecutionMode##mode, SPV_OPCODE_FLAGS_CAPABILITIES, Capability##cap, \
132 { \
133 SPV_OPERAND_TYPE_NONE \
134 }
135// Execution mode requiring the given capability and having one literal number
136// operand.
137#define ExecMode1(mode, cap) \
138 #mode, ExecutionMode##mode, SPV_OPCODE_FLAGS_CAPABILITIES, Capability##cap, \
139 { \
140 SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE \
141 }
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100142static const spv_operand_desc_t executionModeEntries[] = {
Lei Zhang85c6f792015-09-23 15:42:18 -0400143 {ExecMode1(Invocations, Geometry)},
144 {ExecMode0(SpacingEqual, Tessellation)},
145 {ExecMode0(SpacingFractionalEven, Tessellation)},
146 {ExecMode0(SpacingFractionalOdd, Tessellation)},
147 {ExecMode0(VertexOrderCw, Tessellation)},
148 {ExecMode0(VertexOrderCcw, Tessellation)},
149 {ExecMode0(PixelCenterInteger, Shader)},
150 {ExecMode0(OriginUpperLeft, Shader)},
151 {ExecMode0(OriginLowerLeft, Shader)},
152 {ExecMode0(EarlyFragmentTests, Shader)},
153 {ExecMode0(PointMode, Tessellation)},
154 {ExecMode0(Xfb, Shader)},
155 {ExecMode0(DepthReplacing, Shader)},
156 {ExecMode0(DepthAny, Shader)},
157 {ExecMode0(DepthGreater, Shader)},
158 {ExecMode0(DepthLess, Shader)},
159 {ExecMode0(DepthUnchanged, Shader)},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100160 {"LocalSize",
161 ExecutionModeLocalSize,
162 SPV_OPCODE_FLAGS_NONE,
163 0,
164 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_LITERAL_NUMBER,
165 SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
166 {"LocalSizeHint",
167 ExecutionModeLocalSizeHint,
168 SPV_OPCODE_FLAGS_CAPABILITIES,
169 CapabilityKernel,
170 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_LITERAL_NUMBER,
171 SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
Lei Zhang85c6f792015-09-23 15:42:18 -0400172 {ExecMode0(InputPoints, Geometry)},
173 {ExecMode0(InputLines, Geometry)},
174 {ExecMode0(InputLinesAdjacency, Geometry)},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100175 {"InputTriangles",
176 ExecutionModeInputTriangles,
177 SPV_OPCODE_FLAGS_CAPABILITIES,
Lei Zhang85c6f792015-09-23 15:42:18 -0400178 // TODO(dneto): Capabilities are defined as sequential numbers instead of
179 // bit masks. They cannot be meaningfully combined with a bitwise OR.
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100180 CapabilityGeometry | CapabilityTessellation,
181 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang85c6f792015-09-23 15:42:18 -0400182 {ExecMode0(InputTrianglesAdjacency, Geometry)},
183 {ExecMode0(InputQuads, Tessellation)},
184 {ExecMode0(InputIsolines, Tessellation)},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100185 {"OutputVertices",
186 ExecutionModeOutputVertices,
187 SPV_OPCODE_FLAGS_CAPABILITIES,
Lei Zhang85c6f792015-09-23 15:42:18 -0400188 // TODO(dneto): Capabilities are defined as sequential numbers instead of
189 // bit masks. They cannot be meaningfully combined with a bitwise OR.
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100190 CapabilityGeometry | CapabilityTessellation,
191 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
Lei Zhang85c6f792015-09-23 15:42:18 -0400192 {ExecMode0(OutputPoints, Geometry)},
193 {ExecMode0(OutputLineStrip, Geometry)},
194 {ExecMode0(OutputTriangleStrip, Geometry)},
195 {ExecMode1(VecTypeHint, Kernel)},
196 {ExecMode0(ContractionOff, Kernel)},
197 {ExecMode0(IndependentForwardProgress, Kernel)},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100198};
Lei Zhang85c6f792015-09-23 15:42:18 -0400199#undef ExecMode0
200#undef ExecMode1
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100201
202static const spv_operand_desc_t storageClassEntries[] = {
David Neto5494dd42015-09-15 16:41:38 -0400203 // TODO(dneto): There are more storage classes in Rev32 and later.
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100204 {"UniformConstant",
205 StorageClassUniformConstant,
206 SPV_OPCODE_FLAGS_NONE,
207 0,
208 {SPV_OPERAND_TYPE_NONE}},
209 {"Input",
210 StorageClassInput,
211 SPV_OPCODE_FLAGS_CAPABILITIES,
212 CapabilityShader,
213 {SPV_OPERAND_TYPE_NONE}},
214 {"Uniform",
215 StorageClassUniform,
216 SPV_OPCODE_FLAGS_CAPABILITIES,
217 CapabilityShader,
218 {SPV_OPERAND_TYPE_NONE}},
219 {"Output",
220 StorageClassOutput,
221 SPV_OPCODE_FLAGS_CAPABILITIES,
222 CapabilityShader,
223 {SPV_OPERAND_TYPE_NONE}},
224 {"WorkgroupLocal",
225 StorageClassWorkgroupLocal,
226 SPV_OPCODE_FLAGS_NONE,
227 0,
228 {SPV_OPERAND_TYPE_NONE}},
229 {"WorkgroupGlobal",
230 StorageClassWorkgroupGlobal,
231 SPV_OPCODE_FLAGS_NONE,
232 0,
233 {SPV_OPERAND_TYPE_NONE}},
234 {"PrivateGlobal",
235 StorageClassPrivateGlobal,
236 SPV_OPCODE_FLAGS_CAPABILITIES,
237 CapabilityShader,
238 {SPV_OPERAND_TYPE_NONE}},
239 {"Function",
240 StorageClassFunction,
241 SPV_OPCODE_FLAGS_NONE,
242 0,
243 {SPV_OPERAND_TYPE_NONE}},
244 {"Generic",
245 StorageClassGeneric,
246 SPV_OPCODE_FLAGS_CAPABILITIES,
247 CapabilityKernel,
248 {SPV_OPERAND_TYPE_NONE}},
David Neto9819adf2015-09-23 10:19:57 -0400249 {"PushConstant",
250 StorageClassPushConstant,
251 SPV_OPCODE_FLAGS_CAPABILITIES,
252 CapabilityShader,
253 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100254 {"AtomicCounter",
255 StorageClassAtomicCounter,
256 SPV_OPCODE_FLAGS_CAPABILITIES,
257 CapabilityShader,
258 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400259 {"Image",
260 StorageClassImage,
261 SPV_OPCODE_FLAGS_NONE,
262 0,
263 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100264};
265
266static const spv_operand_desc_t dimensionalityEntries[] = {
David Netoaa0c3a52015-09-23 10:30:06 -0400267 // TODO(dneto): Update capability dependencies for Rev32
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100268 {"1D", Dim1D, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_NONE}},
269 {"2D", Dim2D, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_NONE}},
270 {"3D", Dim3D, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_NONE}},
271 {"Cube",
272 DimCube,
273 SPV_OPCODE_FLAGS_CAPABILITIES,
274 CapabilityShader,
275 {SPV_OPERAND_TYPE_NONE}},
276 {"Rect",
277 DimRect,
278 SPV_OPCODE_FLAGS_CAPABILITIES,
279 CapabilityShader,
280 {SPV_OPERAND_TYPE_NONE}},
281 {"Buffer", DimBuffer, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_NONE}},
David Netoaa0c3a52015-09-23 10:30:06 -0400282 {"InputTarget",
283 DimInputTarget,
284 SPV_OPCODE_FLAGS_CAPABILITIES,
285 CapabilityInputTarget,
286 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100287};
288
289static const spv_operand_desc_t samplerAddressingModeEntries[] = {
290 {"None",
291 SamplerAddressingModeNone,
292 SPV_OPCODE_FLAGS_CAPABILITIES,
293 CapabilityKernel,
294 {SPV_OPERAND_TYPE_NONE}},
295 {"ClampToEdge",
296 SamplerAddressingModeClampToEdge,
297 SPV_OPCODE_FLAGS_CAPABILITIES,
298 CapabilityKernel,
299 {SPV_OPERAND_TYPE_NONE}},
300 {"Clamp",
301 SamplerAddressingModeClamp,
302 SPV_OPCODE_FLAGS_CAPABILITIES,
303 CapabilityKernel,
304 {SPV_OPERAND_TYPE_NONE}},
305 {"Repeat",
306 SamplerAddressingModeRepeat,
307 SPV_OPCODE_FLAGS_CAPABILITIES,
308 CapabilityKernel,
309 {SPV_OPERAND_TYPE_NONE}},
310 {"RepeatMirrored",
311 SamplerAddressingModeRepeatMirrored,
312 SPV_OPCODE_FLAGS_CAPABILITIES,
313 CapabilityKernel,
314 {SPV_OPERAND_TYPE_NONE}},
315};
316
317static const spv_operand_desc_t samplerFilterModeEntries[] = {
318 {"Nearest",
319 SamplerFilterModeNearest,
320 SPV_OPCODE_FLAGS_CAPABILITIES,
321 CapabilityKernel,
322 {SPV_OPERAND_TYPE_NONE}},
323 {"Linear",
324 SamplerFilterModeLinear,
325 SPV_OPCODE_FLAGS_CAPABILITIES,
326 CapabilityKernel,
327 {SPV_OPERAND_TYPE_NONE}},
328};
329
David Netob30a0c52015-09-16 15:56:43 -0400330static const spv_operand_desc_t samplerImageFormatEntries[] = {
331// In Rev31, all the cases depend on the Shader capability.
332// TODO(dneto): In Rev32, many of these depend on the AdvancedFormats
333// capability instead.
334#define CASE(NAME) \
335 { \
336 #NAME, ImageFormat##NAME, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityShader, \
337 { \
338 SPV_OPERAND_TYPE_NONE \
339 } \
340 }
341 // clang-format off
342 CASE(Unknown),
343 CASE(Rgba32f),
344 CASE(Rgba16f),
345 CASE(R32f),
346 CASE(Rgba8),
347 CASE(Rgba8Snorm),
348 CASE(Rg32f),
349 CASE(Rg16f),
350 CASE(R11fG11fB10f),
351 CASE(R16f),
352 CASE(Rgba16),
353 CASE(Rgb10A2),
354 CASE(Rg16),
355 CASE(Rg8),
356 CASE(R16),
357 CASE(R8),
358 CASE(Rgba16Snorm),
359 CASE(Rg16Snorm),
360 CASE(Rg8Snorm),
361 CASE(R16Snorm),
362 CASE(R8Snorm),
363 CASE(Rgba32i),
364 CASE(Rgba16i),
365 CASE(Rgba8i),
366 CASE(R32i),
367 CASE(Rg32i),
368 CASE(Rg16i),
369 CASE(Rg8i),
370 CASE(R16i),
371 CASE(R8i),
372 CASE(Rgba32ui),
373 CASE(Rgba16ui),
374 CASE(Rgba8ui),
375 CASE(R32ui),
376 CASE(Rgb10a2ui),
377 CASE(Rg32ui),
378 CASE(Rg16ui),
379 CASE(Rg8ui),
380 CASE(R16ui),
381 CASE(R8ui),
382 // clang-format on
383#undef CASE
384};
385
David Netoee1b3bb2015-09-18 11:19:18 -0400386// Image operand definitions. Each enum value is a mask. When that mask
387// bit is set, the instruction should have further ID operands.
388// Some mask values depend on a capability.
389static const spv_operand_desc_t imageOperandEntries[] = {
390// Rev32 and later adds many more enums.
391#define CASE(NAME) \
392 #NAME, spv::ImageOperands##NAME##Mask, SPV_OPCODE_FLAGS_NONE, 0
393#define CASE_CAP(NAME, CAP) \
394 #NAME, spv::ImageOperands##NAME##Mask, SPV_OPCODE_FLAGS_CAPABILITIES, CAP
395#define ID SPV_OPERAND_TYPE_ID
396#define NONE SPV_OPERAND_TYPE_NONE
397 {"None", spv::ImageOperandsMaskNone, SPV_OPCODE_FLAGS_NONE, 0, {NONE}},
398 {CASE_CAP(Bias, CapabilityShader), {ID, NONE}},
399 {CASE(Lod), {ID, NONE}},
400 {CASE(Grad), {ID, ID, NONE}},
401 {CASE(ConstOffset), {ID, NONE}},
402 {CASE_CAP(Offset, CapabilityImageGatherExtended), {ID, NONE}},
403 {CASE(ConstOffsets), {ID, NONE}},
404 {CASE(Sample), {ID, NONE}},
David Neto8576c9c2015-09-23 14:32:37 -0400405 {CASE_CAP(MinLod, CapabilityMinLod), {ID, NONE}},
David Netoee1b3bb2015-09-18 11:19:18 -0400406#undef CASE
407#undef CASE_CAP
408#undef ID
409#undef NONE
410};
411
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100412static const spv_operand_desc_t fpFastMathModeEntries[] = {
413 {"None",
414 FPFastMathModeMaskNone,
415 SPV_OPCODE_FLAGS_NONE,
416 0,
417 {SPV_OPERAND_TYPE_NONE}},
418 {"NotNaN",
419 FPFastMathModeNotNaNMask,
420 SPV_OPCODE_FLAGS_CAPABILITIES,
421 CapabilityKernel,
422 {SPV_OPERAND_TYPE_NONE}},
423 {"NotInf",
424 FPFastMathModeNotInfMask,
425 SPV_OPCODE_FLAGS_CAPABILITIES,
426 CapabilityKernel,
427 {SPV_OPERAND_TYPE_NONE}},
428 {"NSZ",
429 FPFastMathModeNSZMask,
430 SPV_OPCODE_FLAGS_CAPABILITIES,
431 CapabilityKernel,
432 {SPV_OPERAND_TYPE_NONE}},
433 {"AllowRecip",
434 FPFastMathModeAllowRecipMask,
435 SPV_OPCODE_FLAGS_CAPABILITIES,
436 CapabilityKernel,
437 {SPV_OPERAND_TYPE_NONE}},
438 {"Fast",
439 FPFastMathModeFastMask,
440 SPV_OPCODE_FLAGS_CAPABILITIES,
441 CapabilityKernel,
442 {SPV_OPERAND_TYPE_NONE}},
443};
444
445static const spv_operand_desc_t fpRoundingModeEntries[] = {
446 {"RTE",
447 FPRoundingModeRTE,
448 SPV_OPCODE_FLAGS_CAPABILITIES,
449 CapabilityKernel,
450 {SPV_OPERAND_TYPE_NONE}},
451 {"RTZ",
452 FPRoundingModeRTZ,
453 SPV_OPCODE_FLAGS_CAPABILITIES,
454 CapabilityKernel,
455 {SPV_OPERAND_TYPE_NONE}},
456 {"RTP",
457 FPRoundingModeRTP,
458 SPV_OPCODE_FLAGS_CAPABILITIES,
459 CapabilityKernel,
460 {SPV_OPERAND_TYPE_NONE}},
461 {"RTN",
462 FPRoundingModeRTN,
463 SPV_OPCODE_FLAGS_CAPABILITIES,
464 CapabilityKernel,
465 {SPV_OPERAND_TYPE_NONE}},
466};
467
468static const spv_operand_desc_t linkageTypeEntries[] = {
469 {"Export",
470 LinkageTypeExport,
471 SPV_OPCODE_FLAGS_CAPABILITIES,
472 CapabilityLinkage,
473 {SPV_OPERAND_TYPE_NONE}},
474 {"Import",
475 LinkageTypeImport,
476 SPV_OPCODE_FLAGS_CAPABILITIES,
477 CapabilityLinkage,
478 {SPV_OPERAND_TYPE_NONE}},
479};
480
481static const spv_operand_desc_t accessQualifierEntries[] = {
482 {"ReadOnly",
483 AccessQualifierReadOnly,
484 SPV_OPCODE_FLAGS_CAPABILITIES,
485 CapabilityKernel,
486 {SPV_OPERAND_TYPE_NONE}},
487 {"WriteOnly",
488 AccessQualifierWriteOnly,
489 SPV_OPCODE_FLAGS_CAPABILITIES,
490 CapabilityKernel,
491 {SPV_OPERAND_TYPE_NONE}},
492 {"ReadWrite",
493 AccessQualifierReadWrite,
494 SPV_OPCODE_FLAGS_CAPABILITIES,
495 CapabilityKernel,
496 {SPV_OPERAND_TYPE_NONE}},
497};
498
499static const spv_operand_desc_t functionParameterAttributeEntries[] = {
500 {"Zext",
501 FunctionParameterAttributeZext,
502 SPV_OPCODE_FLAGS_CAPABILITIES,
503 CapabilityKernel,
504 {SPV_OPERAND_TYPE_NONE}},
505 {"Sext",
506 FunctionParameterAttributeSext,
507 SPV_OPCODE_FLAGS_CAPABILITIES,
508 CapabilityKernel,
509 {SPV_OPERAND_TYPE_NONE}},
510 {"ByVal",
511 FunctionParameterAttributeByVal,
512 SPV_OPCODE_FLAGS_CAPABILITIES,
513 CapabilityKernel,
514 {SPV_OPERAND_TYPE_NONE}},
515 {"Sret",
516 FunctionParameterAttributeSret,
517 SPV_OPCODE_FLAGS_CAPABILITIES,
518 CapabilityKernel,
519 {SPV_OPERAND_TYPE_NONE}},
520 {"NoAlias",
521 FunctionParameterAttributeNoAlias,
522 SPV_OPCODE_FLAGS_CAPABILITIES,
523 CapabilityKernel,
524 {SPV_OPERAND_TYPE_NONE}},
David Neto37547b22015-09-10 13:23:11 -0400525 {"NoCapture",
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100526 FunctionParameterAttributeNoCapture,
527 SPV_OPCODE_FLAGS_CAPABILITIES,
528 CapabilityKernel,
529 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100530 {"NoWrite",
531 FunctionParameterAttributeNoWrite,
532 SPV_OPCODE_FLAGS_CAPABILITIES,
533 CapabilityKernel,
534 {SPV_OPERAND_TYPE_NONE}},
535 {"NoReadWrite",
536 FunctionParameterAttributeNoReadWrite,
537 SPV_OPCODE_FLAGS_CAPABILITIES,
538 CapabilityKernel,
539 {SPV_OPERAND_TYPE_NONE}},
540};
541
542static const spv_operand_desc_t decorationEntries[] = {
Lei Zhang604e5ce2015-08-14 14:46:43 -0400543 {"RelaxedPrecision",
544 DecorationRelaxedPrecision,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100545 SPV_OPCODE_FLAGS_CAPABILITIES,
546 CapabilityShader,
547 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400548 {
549 "SpecId",
550 DecorationSpecId,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100551 SPV_OPCODE_FLAGS_CAPABILITIES,
552 CapabilityShader,
Lei Zhang604e5ce2015-08-14 14:46:43 -0400553 {SPV_OPERAND_TYPE_LITERAL_NUMBER},
554 },
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100555 {"Block",
556 DecorationBlock,
557 SPV_OPCODE_FLAGS_CAPABILITIES,
558 CapabilityShader,
559 {SPV_OPERAND_TYPE_NONE}},
560 {"BufferBlock",
561 DecorationBufferBlock,
562 SPV_OPCODE_FLAGS_CAPABILITIES,
563 CapabilityShader,
564 {SPV_OPERAND_TYPE_NONE}},
565 {"RowMajor",
566 DecorationRowMajor,
567 SPV_OPCODE_FLAGS_CAPABILITIES,
568 CapabilityMatrix,
569 {SPV_OPERAND_TYPE_NONE}},
570 {"ColMajor",
571 DecorationColMajor,
572 SPV_OPCODE_FLAGS_CAPABILITIES,
573 CapabilityMatrix,
574 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400575 {"ArrayStride",
576 DecorationArrayStride,
577 SPV_OPCODE_FLAGS_CAPABILITIES,
578 CapabilityShader,
579 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
580 {"MatrixStride",
581 DecorationMatrixStride,
582 SPV_OPCODE_FLAGS_CAPABILITIES,
583 CapabilityShader,
584 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100585 {"GLSLShared",
586 DecorationGLSLShared,
587 SPV_OPCODE_FLAGS_CAPABILITIES,
588 CapabilityShader,
589 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100590 {"GLSLPacked",
591 DecorationGLSLPacked,
592 SPV_OPCODE_FLAGS_CAPABILITIES,
593 CapabilityShader,
594 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400595 {"CPacked",
596 DecorationCPacked,
597 SPV_OPCODE_FLAGS_CAPABILITIES,
598 CapabilityKernel,
599 {SPV_OPERAND_TYPE_NONE}},
600 {"BuiltIn",
601 DecorationBuiltIn,
602 SPV_OPCODE_FLAGS_CAPABILITIES,
603 CapabilityShader,
604 {SPV_OPERAND_TYPE_BUILT_IN, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100605 {"Smooth",
606 DecorationSmooth,
607 SPV_OPCODE_FLAGS_CAPABILITIES,
608 CapabilityShader,
609 {SPV_OPERAND_TYPE_NONE}},
David Netodbaf4072015-09-22 16:23:06 -0400610 {"NoPerspective",
611 DecorationNoPerspective,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100612 SPV_OPCODE_FLAGS_CAPABILITIES,
613 CapabilityShader,
614 {SPV_OPERAND_TYPE_NONE}},
615 {"Flat",
616 DecorationFlat,
617 SPV_OPCODE_FLAGS_CAPABILITIES,
618 CapabilityShader,
619 {SPV_OPERAND_TYPE_NONE}},
620 {"Patch",
621 DecorationPatch,
622 SPV_OPCODE_FLAGS_CAPABILITIES,
623 CapabilityTessellation,
624 {SPV_OPERAND_TYPE_NONE}},
625 {"Centroid",
626 DecorationCentroid,
627 SPV_OPCODE_FLAGS_CAPABILITIES,
628 CapabilityShader,
629 {SPV_OPERAND_TYPE_NONE}},
630 {"Sample",
631 DecorationSample,
632 SPV_OPCODE_FLAGS_CAPABILITIES,
633 CapabilityShader,
634 {SPV_OPERAND_TYPE_NONE}},
635 {"Invariant",
636 DecorationInvariant,
637 SPV_OPCODE_FLAGS_CAPABILITIES,
638 CapabilityShader,
639 {SPV_OPERAND_TYPE_NONE}},
640 {"Restrict",
641 DecorationRestrict,
642 SPV_OPCODE_FLAGS_NONE,
643 0,
644 {SPV_OPERAND_TYPE_NONE}},
645 {"Aliased",
646 DecorationAliased,
647 SPV_OPCODE_FLAGS_NONE,
648 0,
649 {SPV_OPERAND_TYPE_NONE}},
650 {"Volatile",
651 DecorationVolatile,
652 SPV_OPCODE_FLAGS_NONE,
653 0,
654 {SPV_OPERAND_TYPE_NONE}},
655 {"Constant",
656 DecorationConstant,
657 SPV_OPCODE_FLAGS_CAPABILITIES,
658 CapabilityKernel,
659 {SPV_OPERAND_TYPE_NONE}},
660 {"Coherent",
661 DecorationCoherent,
662 SPV_OPCODE_FLAGS_NONE,
663 0,
664 {SPV_OPERAND_TYPE_NONE}},
David Netodbaf4072015-09-22 16:23:06 -0400665 {"NonWritable",
666 DecorationNonWritable,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100667 SPV_OPCODE_FLAGS_NONE,
668 0,
669 {SPV_OPERAND_TYPE_NONE}},
David Netodbaf4072015-09-22 16:23:06 -0400670 {"NonReadable",
671 DecorationNonReadable,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100672 SPV_OPCODE_FLAGS_NONE,
673 0,
674 {SPV_OPERAND_TYPE_NONE}},
675 {"Uniform",
676 DecorationUniform,
677 SPV_OPCODE_FLAGS_CAPABILITIES,
678 CapabilityShader,
679 {SPV_OPERAND_TYPE_NONE}},
David Neto37547b22015-09-10 13:23:11 -0400680 {"SaturatedConversion",
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100681 DecorationSaturatedConversion,
682 SPV_OPCODE_FLAGS_CAPABILITIES,
683 CapabilityKernel,
684 {SPV_OPERAND_TYPE_NONE}},
685 {"Stream",
686 DecorationStream,
687 SPV_OPCODE_FLAGS_CAPABILITIES,
688 CapabilityGeometry,
689 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
690 {"Location",
691 DecorationLocation,
692 SPV_OPCODE_FLAGS_CAPABILITIES,
693 CapabilityShader,
694 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
695 {"Component",
696 DecorationComponent,
697 SPV_OPCODE_FLAGS_CAPABILITIES,
698 CapabilityShader,
699 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
700 {"Index",
701 DecorationIndex,
702 SPV_OPCODE_FLAGS_CAPABILITIES,
703 CapabilityShader,
704 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
705 {"Binding",
706 DecorationBinding,
707 SPV_OPCODE_FLAGS_CAPABILITIES,
708 CapabilityShader,
709 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
710 {"DescriptorSet",
711 DecorationDescriptorSet,
712 SPV_OPCODE_FLAGS_CAPABILITIES,
713 CapabilityShader,
714 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
715 {"Offset",
716 DecorationOffset,
717 SPV_OPCODE_FLAGS_NONE,
718 0,
719 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100720 {"XfbBuffer",
721 DecorationXfbBuffer,
722 SPV_OPCODE_FLAGS_CAPABILITIES,
723 CapabilityShader,
724 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400725 {"XfbStride",
726 DecorationXfbStride,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100727 SPV_OPCODE_FLAGS_CAPABILITIES,
728 CapabilityShader,
729 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100730 {"FuncParamAttr",
731 DecorationFuncParamAttr,
732 SPV_OPCODE_FLAGS_CAPABILITIES,
733 CapabilityKernel,
734 {SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE, SPV_OPERAND_TYPE_NONE}},
735 {"FPRoundingMode",
736 DecorationFPRoundingMode,
737 SPV_OPCODE_FLAGS_CAPABILITIES,
738 CapabilityKernel,
739 {SPV_OPERAND_TYPE_FP_ROUNDING_MODE, SPV_OPERAND_TYPE_NONE}},
740 {"FPFastMathMode",
David Neto37547b22015-09-10 13:23:11 -0400741 DecorationFPFastMathMode,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100742 SPV_OPCODE_FLAGS_CAPABILITIES,
743 CapabilityKernel,
744 {SPV_OPERAND_TYPE_FP_FAST_MATH_MODE, SPV_OPERAND_TYPE_NONE}},
745 {"LinkageAttributes",
746 DecorationLinkageAttributes,
747 SPV_OPCODE_FLAGS_CAPABILITIES,
748 CapabilityLinkage,
David Neto55bdfcb2015-09-10 15:51:57 -0400749 {SPV_OPERAND_TYPE_LITERAL_STRING, SPV_OPERAND_TYPE_LINKAGE_TYPE, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100750};
751
752static const spv_operand_desc_t builtInEntries[] = {
753 {"Position",
754 BuiltInPosition,
755 SPV_OPCODE_FLAGS_CAPABILITIES,
756 CapabilityShader,
757 {SPV_OPERAND_TYPE_NONE}},
758 {"PointSize",
759 BuiltInPointSize,
760 SPV_OPCODE_FLAGS_CAPABILITIES,
761 CapabilityShader,
762 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100763 {"ClipDistance",
764 BuiltInClipDistance,
765 SPV_OPCODE_FLAGS_CAPABILITIES,
766 CapabilityShader,
767 {SPV_OPERAND_TYPE_NONE}},
768 {"CullDistance",
769 BuiltInCullDistance,
770 SPV_OPCODE_FLAGS_CAPABILITIES,
771 CapabilityShader,
772 {SPV_OPERAND_TYPE_NONE}},
773 {"VertexId",
774 BuiltInVertexId,
775 SPV_OPCODE_FLAGS_CAPABILITIES,
776 CapabilityShader,
777 {SPV_OPERAND_TYPE_NONE}},
778 {"InstanceId",
779 BuiltInInstanceId,
780 SPV_OPCODE_FLAGS_CAPABILITIES,
781 CapabilityShader,
782 {SPV_OPERAND_TYPE_NONE}},
783 {"PrimitiveId",
784 BuiltInPrimitiveId,
785 SPV_OPCODE_FLAGS_CAPABILITIES,
786 CapabilityGeometry | CapabilityTessellation,
787 {SPV_OPERAND_TYPE_NONE}},
788 {"InvocationId",
789 BuiltInInvocationId,
790 SPV_OPCODE_FLAGS_CAPABILITIES,
791 CapabilityGeometry | CapabilityTessellation,
792 {SPV_OPERAND_TYPE_NONE}},
793 {"Layer",
794 BuiltInLayer,
795 SPV_OPCODE_FLAGS_CAPABILITIES,
796 CapabilityGeometry,
797 {SPV_OPERAND_TYPE_NONE}},
798 {"ViewportIndex",
799 BuiltInViewportIndex,
800 SPV_OPCODE_FLAGS_CAPABILITIES,
801 CapabilityGeometry,
802 {SPV_OPERAND_TYPE_NONE}},
803 {"TessLevelOuter",
804 BuiltInTessLevelOuter,
805 SPV_OPCODE_FLAGS_CAPABILITIES,
806 CapabilityTessellation,
807 {SPV_OPERAND_TYPE_NONE}},
808 {"TessLevelInner",
809 BuiltInTessLevelInner,
810 SPV_OPCODE_FLAGS_CAPABILITIES,
811 CapabilityTessellation,
812 {SPV_OPERAND_TYPE_NONE}},
813 {"TessCoord",
814 BuiltInTessCoord,
815 SPV_OPCODE_FLAGS_CAPABILITIES,
816 CapabilityTessellation,
817 {SPV_OPERAND_TYPE_NONE}},
818 {"PatchVertices",
819 BuiltInPatchVertices,
820 SPV_OPCODE_FLAGS_CAPABILITIES,
821 CapabilityTessellation,
822 {SPV_OPERAND_TYPE_NONE}},
823 {"FragCoord",
824 BuiltInFragCoord,
825 SPV_OPCODE_FLAGS_CAPABILITIES,
826 CapabilityShader,
827 {SPV_OPERAND_TYPE_NONE}},
828 {"PointCoord",
829 BuiltInPointCoord,
830 SPV_OPCODE_FLAGS_CAPABILITIES,
831 CapabilityShader,
832 {SPV_OPERAND_TYPE_NONE}},
833 {"FrontFacing",
834 BuiltInFrontFacing,
835 SPV_OPCODE_FLAGS_CAPABILITIES,
836 CapabilityShader,
837 {SPV_OPERAND_TYPE_NONE}},
838 {"SampleId",
839 BuiltInSampleId,
840 SPV_OPCODE_FLAGS_CAPABILITIES,
841 CapabilityShader,
842 {SPV_OPERAND_TYPE_NONE}},
843 {"SamplePosition",
844 BuiltInSamplePosition,
845 SPV_OPCODE_FLAGS_CAPABILITIES,
846 CapabilityShader,
847 {SPV_OPERAND_TYPE_NONE}},
848 {"SampleMask",
849 BuiltInSampleMask,
850 SPV_OPCODE_FLAGS_CAPABILITIES,
851 CapabilityShader,
852 {SPV_OPERAND_TYPE_NONE}},
853 {"FragColor",
854 BuiltInFragColor,
855 SPV_OPCODE_FLAGS_CAPABILITIES,
856 CapabilityShader,
857 {SPV_OPERAND_TYPE_NONE}},
858 {"FragDepth",
859 BuiltInFragDepth,
860 SPV_OPCODE_FLAGS_CAPABILITIES,
861 CapabilityShader,
862 {SPV_OPERAND_TYPE_NONE}},
863 {"HelperInvocation",
864 BuiltInHelperInvocation,
865 SPV_OPCODE_FLAGS_CAPABILITIES,
866 CapabilityShader,
867 {SPV_OPERAND_TYPE_NONE}},
868 {"NumWorkgroups",
869 BuiltInNumWorkgroups,
870 SPV_OPCODE_FLAGS_NONE,
871 0,
872 {SPV_OPERAND_TYPE_NONE}},
873 {"WorkgroupSize",
874 BuiltInWorkgroupSize,
875 SPV_OPCODE_FLAGS_NONE,
876 0,
877 {SPV_OPERAND_TYPE_NONE}},
878 {"WorkgroupId",
879 BuiltInWorkgroupId,
880 SPV_OPCODE_FLAGS_NONE,
881 0,
882 {SPV_OPERAND_TYPE_NONE}},
883 {"LocalInvocationId",
884 BuiltInLocalInvocationId,
885 SPV_OPCODE_FLAGS_NONE,
886 0,
887 {SPV_OPERAND_TYPE_NONE}},
888 {"GlobalInvocationId",
889 BuiltInGlobalInvocationId,
890 SPV_OPCODE_FLAGS_NONE,
891 0,
892 {SPV_OPERAND_TYPE_NONE}},
893 {"LocalInvocationIndex",
David Neto37547b22015-09-10 13:23:11 -0400894 BuiltInLocalInvocationIndex,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100895 SPV_OPCODE_FLAGS_CAPABILITIES,
896 CapabilityShader,
897 {SPV_OPERAND_TYPE_NONE}},
898 {"WorkDim",
899 BuiltInWorkDim,
900 SPV_OPCODE_FLAGS_CAPABILITIES,
901 CapabilityKernel,
902 {SPV_OPERAND_TYPE_NONE}},
903 {"GlobalSize",
904 BuiltInGlobalSize,
905 SPV_OPCODE_FLAGS_CAPABILITIES,
906 CapabilityKernel,
907 {SPV_OPERAND_TYPE_NONE}},
908 {"EnqueuedWorkgroupSize",
909 BuiltInEnqueuedWorkgroupSize,
910 SPV_OPCODE_FLAGS_CAPABILITIES,
911 CapabilityKernel,
912 {SPV_OPERAND_TYPE_NONE}},
913 {"GlobalOffset",
914 BuiltInGlobalOffset,
915 SPV_OPCODE_FLAGS_CAPABILITIES,
916 CapabilityKernel,
917 {SPV_OPERAND_TYPE_NONE}},
918 {"GlobalLinearId",
919 BuiltInGlobalLinearId,
920 SPV_OPCODE_FLAGS_CAPABILITIES,
921 CapabilityKernel,
922 {SPV_OPERAND_TYPE_NONE}},
923 {"WorkgroupLinearId",
924 BuiltInWorkgroupLinearId,
925 SPV_OPCODE_FLAGS_CAPABILITIES,
926 CapabilityKernel,
927 {SPV_OPERAND_TYPE_NONE}},
928 {"SubgroupSize",
929 BuiltInSubgroupSize,
930 SPV_OPCODE_FLAGS_CAPABILITIES,
931 CapabilityKernel,
932 {SPV_OPERAND_TYPE_NONE}},
933 {"SubgroupMaxSize",
934 BuiltInSubgroupMaxSize,
935 SPV_OPCODE_FLAGS_CAPABILITIES,
936 CapabilityKernel,
937 {SPV_OPERAND_TYPE_NONE}},
938 {"NumSubgroups",
939 BuiltInNumSubgroups,
940 SPV_OPCODE_FLAGS_CAPABILITIES,
941 CapabilityKernel,
942 {SPV_OPERAND_TYPE_NONE}},
943 {"NumEnqueuedSubgroups",
944 BuiltInNumEnqueuedSubgroups,
945 SPV_OPCODE_FLAGS_CAPABILITIES,
946 CapabilityKernel,
947 {SPV_OPERAND_TYPE_NONE}},
948 {"SubgroupId",
David Neto37547b22015-09-10 13:23:11 -0400949 BuiltInSubgroupId,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100950 SPV_OPCODE_FLAGS_CAPABILITIES,
951 CapabilityKernel,
952 {SPV_OPERAND_TYPE_NONE}},
953 {"SubgroupLocalInvocationId",
954 BuiltInSubgroupLocalInvocationId,
955 SPV_OPCODE_FLAGS_CAPABILITIES,
956 CapabilityKernel,
957 {SPV_OPERAND_TYPE_NONE}},
David Neto2d1b5e52015-09-23 15:35:27 -0400958 {"VertexIndex",
959 BuiltInVertexIndex,
960 SPV_OPCODE_FLAGS_CAPABILITIES,
961 CapabilityShader,
962 {SPV_OPERAND_TYPE_NONE}},
963 {"InstanceIndex",
964 BuiltInInstanceIndex,
965 SPV_OPCODE_FLAGS_CAPABILITIES,
966 CapabilityShader,
967 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100968};
969
970static const spv_operand_desc_t selectionControlEntries[] = {
971 {"None",
972 SelectionControlMaskNone,
973 SPV_OPCODE_FLAGS_NONE,
974 0,
975 {SPV_OPERAND_TYPE_NONE}},
976 {"Flatten",
977 SelectionControlFlattenMask,
978 SPV_OPCODE_FLAGS_NONE,
979 0,
980 {SPV_OPERAND_TYPE_NONE}},
981 {"DontFlatten",
982 SelectionControlDontFlattenMask,
983 SPV_OPCODE_FLAGS_NONE,
984 0,
985 {SPV_OPERAND_TYPE_NONE}},
986};
987
988static const spv_operand_desc_t loopControlEntries[] = {
989 {"None",
990 LoopControlMaskNone,
991 SPV_OPCODE_FLAGS_NONE,
992 0,
993 {SPV_OPERAND_TYPE_NONE}},
994 {"Unroll",
995 LoopControlUnrollMask,
996 SPV_OPCODE_FLAGS_NONE,
997 0,
998 {SPV_OPERAND_TYPE_NONE}},
999 {"DontUnroll",
1000 LoopControlDontUnrollMask,
1001 SPV_OPCODE_FLAGS_NONE,
1002 0,
1003 {SPV_OPERAND_TYPE_NONE}},
1004};
1005
1006static const spv_operand_desc_t functionControlEntries[] = {
1007 {"None",
1008 FunctionControlMaskNone,
1009 SPV_OPCODE_FLAGS_NONE,
1010 0,
1011 {SPV_OPERAND_TYPE_NONE}},
David Netof4fde6c2015-09-14 14:50:37 -04001012 {"Inline",
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001013 FunctionControlInlineMask,
1014 SPV_OPCODE_FLAGS_NONE,
1015 0,
1016 {SPV_OPERAND_TYPE_NONE}},
1017 {"DontInline",
1018 FunctionControlDontInlineMask,
1019 SPV_OPCODE_FLAGS_NONE,
1020 0,
1021 {SPV_OPERAND_TYPE_NONE}},
1022 {"Pure",
1023 FunctionControlPureMask,
1024 SPV_OPCODE_FLAGS_NONE,
1025 0,
1026 {SPV_OPERAND_TYPE_NONE}},
1027 {"Const",
1028 FunctionControlConstMask,
1029 SPV_OPCODE_FLAGS_NONE,
1030 0,
1031 {SPV_OPERAND_TYPE_NONE}},
1032};
1033
1034static const spv_operand_desc_t memorySemanticsEntries[] = {
1035 {"None",
1036 MemorySemanticsMaskNone,
1037 SPV_OPCODE_FLAGS_NONE,
1038 0,
1039 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001040 {"SequentiallyConsistent",
1041 MemorySemanticsSequentiallyConsistentMask,
1042 SPV_OPCODE_FLAGS_NONE,
1043 0,
1044 {SPV_OPERAND_TYPE_NONE}},
1045 {"Acquire",
1046 MemorySemanticsAcquireMask,
1047 SPV_OPCODE_FLAGS_NONE,
1048 0,
1049 {SPV_OPERAND_TYPE_NONE}},
1050 {"Release",
1051 MemorySemanticsReleaseMask,
1052 SPV_OPCODE_FLAGS_NONE,
1053 0,
1054 {SPV_OPERAND_TYPE_NONE}},
1055 {"UniformMemory",
1056 MemorySemanticsUniformMemoryMask,
1057 SPV_OPCODE_FLAGS_CAPABILITIES,
1058 CapabilityShader,
1059 {SPV_OPERAND_TYPE_NONE}},
1060 {"SubgroupMemory",
1061 MemorySemanticsSubgroupMemoryMask,
1062 SPV_OPCODE_FLAGS_NONE,
1063 0,
1064 {SPV_OPERAND_TYPE_NONE}},
1065 {"WorkgroupLocalMemory",
1066 MemorySemanticsWorkgroupLocalMemoryMask,
1067 SPV_OPCODE_FLAGS_NONE,
1068 0,
1069 {SPV_OPERAND_TYPE_NONE}},
1070 {"WorkgroupGlobalMemory",
1071 MemorySemanticsWorkgroupGlobalMemoryMask,
1072 SPV_OPCODE_FLAGS_NONE,
1073 0,
1074 {SPV_OPERAND_TYPE_NONE}},
1075 {"AtomicCounterMemory",
1076 MemorySemanticsAtomicCounterMemoryMask,
1077 SPV_OPCODE_FLAGS_CAPABILITIES,
1078 CapabilityShader,
1079 {SPV_OPERAND_TYPE_NONE}},
1080 {
1081 "ImageMemory",
1082 MemorySemanticsImageMemoryMask,
1083 SPV_OPCODE_FLAGS_NONE,
1084 0,
1085 {SPV_OPERAND_TYPE_NONE},
1086 },
1087};
1088
1089static const spv_operand_desc_t memoryAccessEntries[] = {
1090 {"None",
1091 MemoryAccessMaskNone,
1092 SPV_OPCODE_FLAGS_NONE,
1093 0,
1094 {SPV_OPERAND_TYPE_NONE}},
1095 {"Volatile",
1096 MemoryAccessVolatileMask,
1097 SPV_OPCODE_FLAGS_NONE,
1098 0,
1099 {SPV_OPERAND_TYPE_NONE}},
1100 {
1101 "Aligned",
1102 MemoryAccessAlignedMask,
1103 SPV_OPCODE_FLAGS_NONE,
1104 0,
David Neto4a291312015-09-14 15:08:48 -04001105 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001106 },
David Neto49c299b2015-09-23 15:38:59 -04001107 {"Nontemporal",
1108 MemoryAccessNontemporalMask,
1109 SPV_OPCODE_FLAGS_NONE,
1110 0,
1111 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001112};
1113
1114static const spv_operand_desc_t scopeEntries[] = {
1115 {"CrossDevice",
1116 ScopeCrossDevice,
1117 SPV_OPCODE_FLAGS_NONE,
1118 0,
1119 {SPV_OPERAND_TYPE_NONE}},
1120 {"Device", ScopeDevice, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_NONE}},
1121 {"Workgroup",
1122 ScopeWorkgroup,
1123 SPV_OPCODE_FLAGS_NONE,
1124 0,
1125 {SPV_OPERAND_TYPE_NONE}},
1126 {"Subgroup",
1127 ScopeSubgroup,
1128 SPV_OPCODE_FLAGS_NONE,
1129 0,
1130 {SPV_OPERAND_TYPE_NONE}},
1131 {
1132 "Invocation",
1133 ScopeInvocation,
1134 SPV_OPCODE_FLAGS_NONE,
1135 0,
1136 {SPV_OPERAND_TYPE_NONE},
1137 },
1138};
1139
1140static const spv_operand_desc_t groupOperationEntries[] = {
1141 {"Reduce",
1142 GroupOperationReduce,
1143 SPV_OPCODE_FLAGS_CAPABILITIES,
1144 CapabilityKernel,
1145 {SPV_OPERAND_TYPE_NONE}},
1146 {"InclusiveScan",
1147 GroupOperationInclusiveScan,
1148 SPV_OPCODE_FLAGS_CAPABILITIES,
1149 CapabilityKernel,
1150 {SPV_OPERAND_TYPE_NONE}},
1151 {"ExclusiveScan",
1152 GroupOperationExclusiveScan,
1153 SPV_OPCODE_FLAGS_CAPABILITIES,
1154 CapabilityKernel,
1155 {SPV_OPERAND_TYPE_NONE}},
1156};
1157
1158static const spv_operand_desc_t kernelKernelEnqueueFlagssEntries[] = {
1159 {"NoWait",
1160 KernelEnqueueFlagsNoWait,
1161 SPV_OPCODE_FLAGS_CAPABILITIES,
1162 CapabilityKernel,
1163 {SPV_OPERAND_TYPE_NONE}},
1164 {"WaitKernel",
1165 KernelEnqueueFlagsWaitKernel,
1166 SPV_OPCODE_FLAGS_CAPABILITIES,
1167 CapabilityKernel,
1168 {SPV_OPERAND_TYPE_NONE}},
1169 {"WaitWorkGroup",
1170 KernelEnqueueFlagsWaitWorkGroup,
1171 SPV_OPCODE_FLAGS_CAPABILITIES,
1172 CapabilityKernel,
1173 {SPV_OPERAND_TYPE_NONE}},
1174};
1175
1176static const spv_operand_desc_t kernelProfilingInfoEntries[] = {
1177 {"None",
1178 KernelProfilingInfoMaskNone,
1179 SPV_OPCODE_FLAGS_NONE,
1180 0,
1181 {SPV_OPERAND_TYPE_NONE}},
1182 {"CmdExecTime",
1183 KernelProfilingInfoCmdExecTimeMask,
1184 SPV_OPCODE_FLAGS_CAPABILITIES,
1185 CapabilityKernel,
1186 {SPV_OPERAND_TYPE_NONE}},
1187};
1188
1189static const spv_operand_desc_t capabilityInfoEntries[] = {
1190 {"Matrix",
1191 CapabilityMatrix,
1192 SPV_OPCODE_FLAGS_NONE,
1193 0,
1194 {SPV_OPERAND_TYPE_NONE}},
1195 {"Shader",
1196 CapabilityShader,
1197 SPV_OPCODE_FLAGS_CAPABILITIES,
1198 CapabilityMatrix,
1199 {SPV_OPERAND_TYPE_NONE}},
1200 {"Geometry",
1201 CapabilityGeometry,
1202 SPV_OPCODE_FLAGS_CAPABILITIES,
1203 CapabilityShader,
1204 {SPV_OPERAND_TYPE_NONE}},
1205 {"Tessellation",
1206 CapabilityTessellation,
1207 SPV_OPCODE_FLAGS_CAPABILITIES,
1208 CapabilityShader,
1209 {SPV_OPERAND_TYPE_NONE}},
1210 {"Addresses",
1211 CapabilityAddresses,
1212 SPV_OPCODE_FLAGS_NONE,
1213 0,
1214 {SPV_OPERAND_TYPE_NONE}},
1215 {"Linkage",
1216 CapabilityLinkage,
1217 SPV_OPCODE_FLAGS_NONE,
1218 0,
1219 {SPV_OPERAND_TYPE_NONE}},
1220 {"Kernel",
1221 CapabilityKernel,
1222 SPV_OPCODE_FLAGS_NONE,
1223 0,
1224 {SPV_OPERAND_TYPE_NONE}},
1225 {"Vector16",
1226 CapabilityVector16,
1227 SPV_OPCODE_FLAGS_NONE,
1228 0,
1229 {SPV_OPERAND_TYPE_NONE}},
1230 {"Float16Buffer",
1231 CapabilityFloat16Buffer,
1232 SPV_OPCODE_FLAGS_NONE,
1233 0,
1234 {SPV_OPERAND_TYPE_NONE}},
1235 {"Float16",
1236 CapabilityFloat16,
1237 SPV_OPCODE_FLAGS_NONE,
1238 0,
1239 {SPV_OPERAND_TYPE_NONE}},
1240 {"Float64",
1241 CapabilityFloat64,
1242 SPV_OPCODE_FLAGS_NONE,
1243 0,
1244 {SPV_OPERAND_TYPE_NONE}},
1245 {"Int64",
1246 CapabilityInt64,
1247 SPV_OPCODE_FLAGS_NONE,
1248 0,
1249 {SPV_OPERAND_TYPE_NONE}},
1250 {"Int64Atomics",
1251 CapabilityInt64Atomics,
1252 SPV_OPCODE_FLAGS_NONE,
1253 0,
1254 {SPV_OPERAND_TYPE_NONE}},
1255 {"ImageBasic",
1256 CapabilityImageBasic,
1257 SPV_OPCODE_FLAGS_NONE,
1258 0,
1259 {SPV_OPERAND_TYPE_NONE}},
1260 {"ImageReadWrite",
1261 CapabilityImageReadWrite,
1262 SPV_OPCODE_FLAGS_NONE,
1263 0,
1264 {SPV_OPERAND_TYPE_NONE}},
David Netoc6402d62015-09-10 16:39:09 -04001265 {"ImageMipmap",
1266 CapabilityImageMipmap,
1267 SPV_OPCODE_FLAGS_NONE,
1268 0,
1269 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001270 {"ImageSRGBWrite",
1271 CapabilityImageSRGBWrite,
1272 SPV_OPCODE_FLAGS_NONE,
1273 0,
1274 {SPV_OPERAND_TYPE_NONE}},
1275 {"Pipes",
1276 CapabilityPipes,
1277 SPV_OPCODE_FLAGS_NONE,
1278 0,
1279 {SPV_OPERAND_TYPE_NONE}},
1280 {"Groups",
1281 CapabilityGroups,
1282 SPV_OPCODE_FLAGS_NONE,
1283 0,
1284 {SPV_OPERAND_TYPE_NONE}},
1285 {"DeviceEnqueue",
1286 CapabilityDeviceEnqueue,
1287 SPV_OPCODE_FLAGS_NONE,
1288 0,
1289 {SPV_OPERAND_TYPE_NONE}},
David Netoc6402d62015-09-10 16:39:09 -04001290// A macro for defining a capability that doesn't depend on other capabilities.
David Netoe994e2e2015-09-11 12:15:58 -04001291// TODO(dneto): Rev32 adds many dependencies between capbilities.
David Netoc6402d62015-09-10 16:39:09 -04001292#define CASE(NAME) { #NAME, Capability##NAME, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_NONE}}
1293 CASE(LiteralSampler),
1294 CASE(AtomicStorage),
1295 CASE(Int16),
1296 CASE(TessellationPointSize),
1297 CASE(GeometryPointSize),
1298 CASE(ImageGatherExtended),
1299 CASE(StorageImageExtendedFormats),
1300 CASE(StorageImageMultisample),
1301 CASE(UniformBufferArrayDynamicIndexing),
1302 CASE(SampledImageArrayDynamicIndexing),
1303 CASE(StorageBufferArrayDynamicIndexing),
1304 CASE(StorageImageArrayDynamicIndexing),
1305 CASE(ClipDistance),
1306 CASE(CullDistance),
1307 CASE(ImageCubeArray),
1308 CASE(SampleRateShading),
David Netoc66f5072015-09-23 15:44:02 -04001309 CASE(ImageRect),
1310 CASE(SampledRect),
1311 CASE(GenericPointer),
1312 CASE(Int8),
1313 CASE(InputTarget),
1314 CASE(SparseResidency),
1315 CASE(MinLod),
1316 CASE(Sampled1D),
1317 CASE(Image1D),
1318 CASE(SampledCubeArray),
1319 CASE(SampledBuffer),
1320 CASE(ImageBuffer),
1321 CASE(ImageMSArray),
1322 CASE(AdvancedFormats),
1323 CASE(ImageQuery),
1324 CASE(DerivativeControl),
1325 CASE(InterpolationFunction),
1326 CASE(TransformFeedback),
David Netoc6402d62015-09-10 16:39:09 -04001327#undef CASE
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001328};
1329
1330static const spv_operand_desc_group_t opcodeEntryTypes[] = {
1331 {SPV_OPERAND_TYPE_SOURCE_LANGUAGE,
1332 sizeof(sourceLanguageEntries) / sizeof(spv_operand_desc_t),
1333 sourceLanguageEntries},
1334 {SPV_OPERAND_TYPE_EXECUTION_MODEL,
1335 sizeof(executionModelEntries) / sizeof(spv_operand_desc_t),
1336 executionModelEntries},
1337 {SPV_OPERAND_TYPE_ADDRESSING_MODEL,
1338 sizeof(addressingModelEntries) / sizeof(spv_operand_desc_t),
1339 addressingModelEntries},
1340 {SPV_OPERAND_TYPE_MEMORY_MODEL,
1341 sizeof(memoryModelEntries) / sizeof(spv_operand_desc_t),
1342 memoryModelEntries},
1343 {SPV_OPERAND_TYPE_EXECUTION_MODE,
1344 sizeof(executionModeEntries) / sizeof(spv_operand_desc_t),
1345 executionModeEntries},
1346 {SPV_OPERAND_TYPE_STORAGE_CLASS,
1347 sizeof(storageClassEntries) / sizeof(spv_operand_desc_t),
1348 storageClassEntries},
1349 {SPV_OPERAND_TYPE_DIMENSIONALITY,
1350 sizeof(dimensionalityEntries) / sizeof(spv_operand_desc_t),
1351 dimensionalityEntries},
1352 {SPV_OPERAND_TYPE_SAMPLER_ADDRESSING_MODE,
1353 sizeof(samplerAddressingModeEntries) / sizeof(spv_operand_desc_t),
1354 samplerAddressingModeEntries},
1355 {SPV_OPERAND_TYPE_SAMPLER_FILTER_MODE,
1356 sizeof(samplerFilterModeEntries) / sizeof(spv_operand_desc_t),
1357 samplerFilterModeEntries},
David Netob30a0c52015-09-16 15:56:43 -04001358 {SPV_OPERAND_TYPE_SAMPLER_IMAGE_FORMAT,
1359 sizeof(samplerImageFormatEntries) / sizeof(spv_operand_desc_t),
1360 samplerImageFormatEntries},
David Netoee1b3bb2015-09-18 11:19:18 -04001361 {SPV_OPERAND_TYPE_OPTIONAL_IMAGE,
1362 sizeof(imageOperandEntries) / sizeof(spv_operand_desc_t),
1363 imageOperandEntries},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001364 {SPV_OPERAND_TYPE_FP_FAST_MATH_MODE,
1365 sizeof(fpFastMathModeEntries) / sizeof(spv_operand_desc_t),
1366 fpFastMathModeEntries},
1367 {SPV_OPERAND_TYPE_FP_ROUNDING_MODE,
1368 sizeof(fpRoundingModeEntries) / sizeof(spv_operand_desc_t),
1369 fpRoundingModeEntries},
1370 {SPV_OPERAND_TYPE_LINKAGE_TYPE,
1371 sizeof(linkageTypeEntries) / sizeof(spv_operand_desc_t),
1372 linkageTypeEntries},
1373 {SPV_OPERAND_TYPE_ACCESS_QUALIFIER,
1374 sizeof(accessQualifierEntries) / sizeof(spv_operand_desc_t),
1375 accessQualifierEntries},
1376 {SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE,
1377 sizeof(functionParameterAttributeEntries) / sizeof(spv_operand_desc_t),
1378 functionParameterAttributeEntries},
1379 {SPV_OPERAND_TYPE_DECORATION,
1380 sizeof(decorationEntries) / sizeof(spv_operand_desc_t), decorationEntries},
1381 {SPV_OPERAND_TYPE_BUILT_IN,
1382 sizeof(builtInEntries) / sizeof(spv_operand_desc_t), builtInEntries},
1383 {SPV_OPERAND_TYPE_SELECTION_CONTROL,
1384 sizeof(selectionControlEntries) / sizeof(spv_operand_desc_t),
1385 selectionControlEntries},
1386 {SPV_OPERAND_TYPE_LOOP_CONTROL,
1387 sizeof(loopControlEntries) / sizeof(spv_operand_desc_t),
1388 loopControlEntries},
1389 {SPV_OPERAND_TYPE_FUNCTION_CONTROL,
1390 sizeof(functionControlEntries) / sizeof(spv_operand_desc_t),
1391 functionControlEntries},
1392 {SPV_OPERAND_TYPE_MEMORY_SEMANTICS,
1393 sizeof(memorySemanticsEntries) / sizeof(spv_operand_desc_t),
1394 memorySemanticsEntries},
David Neto78c3b432015-08-27 13:03:52 -04001395 {SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001396 sizeof(memoryAccessEntries) / sizeof(spv_operand_desc_t),
1397 memoryAccessEntries},
1398 {SPV_OPERAND_TYPE_EXECUTION_SCOPE,
1399 sizeof(scopeEntries) / sizeof(spv_operand_desc_t), scopeEntries},
1400 {SPV_OPERAND_TYPE_GROUP_OPERATION,
1401 sizeof(groupOperationEntries) / sizeof(spv_operand_desc_t),
1402 groupOperationEntries},
1403 {SPV_OPERAND_TYPE_KERNEL_ENQ_FLAGS,
1404 sizeof(kernelKernelEnqueueFlagssEntries) / sizeof(spv_operand_desc_t),
1405 kernelKernelEnqueueFlagssEntries},
David Neto47994822015-08-27 13:11:01 -04001406 {SPV_OPERAND_TYPE_KERNEL_PROFILING_INFO,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001407 sizeof(kernelProfilingInfoEntries) / sizeof(spv_operand_desc_t),
1408 kernelProfilingInfoEntries},
1409 {SPV_OPERAND_TYPE_CAPABILITY,
1410 sizeof(capabilityInfoEntries) / sizeof(spv_operand_desc_t),
1411 capabilityInfoEntries},
1412};
1413
1414spv_result_t spvOperandTableGet(spv_operand_table *pOperandTable) {
Lei Zhang40056702015-09-11 14:31:27 -04001415 if (!pOperandTable) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001416
1417 static const spv_operand_table_t table = {
1418 sizeof(opcodeEntryTypes) / sizeof(spv_operand_desc_group_t),
1419 opcodeEntryTypes};
1420
1421 *pOperandTable = &table;
1422
1423 return SPV_SUCCESS;
1424}
1425
1426spv_result_t spvOperandTableNameLookup(const spv_operand_table table,
1427 const spv_operand_type_t type,
David Neto388c40d2015-09-16 16:42:56 -04001428 const char* name,
1429 const size_t nameLength,
1430 spv_operand_desc* pEntry) {
Lei Zhang40056702015-09-11 14:31:27 -04001431 if (!table) return SPV_ERROR_INVALID_TABLE;
1432 if (!name || !pEntry) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001433
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001434 for (uint64_t typeIndex = 0; typeIndex < table->count; ++typeIndex) {
1435 if (type == table->types[typeIndex].type) {
1436 for (uint64_t operandIndex = 0;
1437 operandIndex < table->types[typeIndex].count; ++operandIndex) {
1438 if (nameLength ==
1439 strlen(table->types[typeIndex].entries[operandIndex].name) &&
1440 !strncmp(table->types[typeIndex].entries[operandIndex].name, name,
David Neto388c40d2015-09-16 16:42:56 -04001441 nameLength)) {
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001442 *pEntry = &table->types[typeIndex].entries[operandIndex];
1443 return SPV_SUCCESS;
1444 }
1445 }
1446 }
1447 }
1448
1449 return SPV_ERROR_INVALID_LOOKUP;
1450}
1451
1452spv_result_t spvOperandTableValueLookup(const spv_operand_table table,
1453 const spv_operand_type_t type,
1454 const uint32_t value,
1455 spv_operand_desc *pEntry) {
Lei Zhang40056702015-09-11 14:31:27 -04001456 if (!table) return SPV_ERROR_INVALID_TABLE;
1457 if (!pEntry) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001458
1459 for (uint64_t typeIndex = 0; typeIndex < table->count; ++typeIndex) {
1460 if (type == table->types[typeIndex].type) {
1461 for (uint64_t operandIndex = 0;
1462 operandIndex < table->types[typeIndex].count; ++operandIndex) {
1463 if (value == table->types[typeIndex].entries[operandIndex].value) {
1464 *pEntry = &table->types[typeIndex].entries[operandIndex];
1465 return SPV_SUCCESS;
1466 }
1467 }
1468 }
1469 }
1470
1471 return SPV_ERROR_INVALID_LOOKUP;
1472}
1473
1474const char *spvOperandTypeStr(spv_operand_type_t type) {
1475 switch (type) {
1476 case SPV_OPERAND_TYPE_ID:
David Netofadbf622015-09-14 17:07:11 -04001477 case SPV_OPERAND_TYPE_OPTIONAL_ID:
1478 case SPV_OPERAND_TYPE_ID_IN_OPTIONAL_TUPLE:
1479 return "ID";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001480 case SPV_OPERAND_TYPE_RESULT_ID:
1481 return "result ID";
1482 case SPV_OPERAND_TYPE_LITERAL:
1483 return "literal";
1484 case SPV_OPERAND_TYPE_LITERAL_NUMBER:
1485 return "literal number";
Lei Zhangb41d1502015-09-14 15:22:23 -04001486 case SPV_OPERAND_TYPE_MULTIWORD_LITERAL_NUMBER:
1487 return "multiple word literal number";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001488 case SPV_OPERAND_TYPE_LITERAL_STRING:
1489 return "literal string";
1490 case SPV_OPERAND_TYPE_SOURCE_LANGUAGE:
1491 return "source langauge";
1492 case SPV_OPERAND_TYPE_EXECUTION_MODEL:
1493 return "execution model";
1494 case SPV_OPERAND_TYPE_ADDRESSING_MODEL:
1495 return "addressing model";
1496 case SPV_OPERAND_TYPE_MEMORY_MODEL:
1497 return "memory model";
1498 case SPV_OPERAND_TYPE_EXECUTION_MODE:
1499 return "execution mode";
1500 case SPV_OPERAND_TYPE_STORAGE_CLASS:
1501 return "storage class";
1502 case SPV_OPERAND_TYPE_DIMENSIONALITY:
1503 return "dimensionality";
1504 case SPV_OPERAND_TYPE_SAMPLER_ADDRESSING_MODE:
1505 return "addressing mode";
1506 case SPV_OPERAND_TYPE_SAMPLER_FILTER_MODE:
1507 return "sampler filter mode";
David Netob30a0c52015-09-16 15:56:43 -04001508 case SPV_OPERAND_TYPE_SAMPLER_IMAGE_FORMAT:
1509 return "sampler image format";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001510 case SPV_OPERAND_TYPE_FP_FAST_MATH_MODE:
1511 return "floating pointer fast math mode";
1512 case SPV_OPERAND_TYPE_FP_ROUNDING_MODE:
1513 return "floating point rounding mode";
1514 case SPV_OPERAND_TYPE_LINKAGE_TYPE:
1515 return "linkage type";
1516 case SPV_OPERAND_TYPE_ACCESS_QUALIFIER:
1517 return "access qualifier";
1518 case SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE:
1519 return "function parameter attribute";
1520 case SPV_OPERAND_TYPE_DECORATION:
1521 return "decoration";
1522 case SPV_OPERAND_TYPE_BUILT_IN:
1523 return "built in";
1524 case SPV_OPERAND_TYPE_SELECTION_CONTROL:
1525 return "selection control";
1526 case SPV_OPERAND_TYPE_LOOP_CONTROL:
1527 return "loop control";
1528 case SPV_OPERAND_TYPE_FUNCTION_CONTROL:
1529 return "function control";
1530 case SPV_OPERAND_TYPE_MEMORY_SEMANTICS:
1531 return "memory semantics";
David Neto78c3b432015-08-27 13:03:52 -04001532 case SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001533 return "memory access";
1534 case SPV_OPERAND_TYPE_EXECUTION_SCOPE:
David Netofadbf622015-09-14 17:07:11 -04001535 return "execution scope ID";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001536 case SPV_OPERAND_TYPE_GROUP_OPERATION:
1537 return "group operation";
1538 case SPV_OPERAND_TYPE_KERNEL_ENQ_FLAGS:
1539 return "kernel enqeue flags";
David Neto47994822015-08-27 13:11:01 -04001540 case SPV_OPERAND_TYPE_KERNEL_PROFILING_INFO:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001541 return "kernel profiling info";
1542 case SPV_OPERAND_TYPE_CAPABILITY:
1543 return "capability";
David Netoee1b3bb2015-09-18 11:19:18 -04001544 case SPV_OPERAND_TYPE_OPTIONAL_IMAGE:
1545 return "image operand";
David Neto78c3b432015-08-27 13:03:52 -04001546 case SPV_OPERAND_TYPE_NONE:
1547 return "NONE";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001548 default:
1549 assert(0 && "Unhandled operand type!");
1550 break;
1551 }
1552 return "unknown";
1553}
David Neto78c3b432015-08-27 13:03:52 -04001554
1555void spvPrependOperandTypes(const spv_operand_type_t* types,
1556 spv_operand_pattern_t* pattern) {
1557 const spv_operand_type_t* endTypes;
1558 for (endTypes = types ; *endTypes != SPV_OPERAND_TYPE_NONE ; ++endTypes)
1559 ;
1560 pattern->insert(pattern->begin(), types, endTypes);
1561}
1562
David Neto5bf88fc2015-09-17 17:06:10 -04001563void spvPrependOperandTypesForMask(const spv_operand_table operandTable,
1564 const spv_operand_type_t type,
1565 const uint32_t mask,
1566 spv_operand_pattern_t* pattern) {
1567 // Scan from highest bits to lowest bits because we will prepend in LIFO
1568 // fashion, and we need the operands for lower order bits to appear first.
1569 for (uint32_t candidate_bit = (1 << 31); candidate_bit; candidate_bit >>= 1) {
1570 if (candidate_bit & mask) {
1571 spv_operand_desc entry = nullptr;
1572 if (SPV_SUCCESS == spvOperandTableValueLookup(operandTable, type,
1573 candidate_bit, &entry)) {
1574 spvPrependOperandTypes(entry->operandTypes, pattern);
1575 }
1576 }
1577 }
1578}
1579
David Neto78c3b432015-08-27 13:03:52 -04001580bool spvOperandIsOptional(spv_operand_type_t type) {
1581 // Variable means zero or more times.
1582 if (spvOperandIsVariable(type))
1583 return true;
1584
1585 switch (type) {
1586 case SPV_OPERAND_TYPE_OPTIONAL_ID:
1587 case SPV_OPERAND_TYPE_OPTIONAL_IMAGE:
1588 case SPV_OPERAND_TYPE_OPTIONAL_LITERAL:
1589 case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_STRING:
1590 case SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS:
1591 case SPV_OPERAND_TYPE_OPTIONAL_EXECUTION_MODE:
1592 return true;
1593 default:
1594 break;
1595 }
1596 return false;
1597}
1598
1599bool spvOperandIsVariable(spv_operand_type_t type) {
1600 switch (type) {
1601 case SPV_OPERAND_TYPE_VARIABLE_ID:
1602 case SPV_OPERAND_TYPE_VARIABLE_LITERAL:
1603 case SPV_OPERAND_TYPE_VARIABLE_ID_LITERAL:
1604 case SPV_OPERAND_TYPE_VARIABLE_LITERAL_ID:
David Neto78c3b432015-08-27 13:03:52 -04001605 case SPV_OPERAND_TYPE_VARIABLE_EXECUTION_MODE:
1606 return true;
1607 default:
1608 break;
1609 }
1610 return false;
1611}
1612
1613
1614bool spvExpandOperandSequenceOnce(spv_operand_type_t type,
1615 spv_operand_pattern_t* pattern) {
1616 switch (type) {
1617 case SPV_OPERAND_TYPE_VARIABLE_ID:
1618 pattern->insert(pattern->begin(), {SPV_OPERAND_TYPE_OPTIONAL_ID, type});
1619 return true;
1620 case SPV_OPERAND_TYPE_VARIABLE_LITERAL:
1621 pattern->insert(pattern->begin(),
1622 {SPV_OPERAND_TYPE_OPTIONAL_LITERAL, type});
1623 return true;
1624 case SPV_OPERAND_TYPE_VARIABLE_LITERAL_ID:
1625 // Represents Zero or more (Literal, Id) pairs.
1626 pattern->insert(pattern->begin(),
1627 {SPV_OPERAND_TYPE_OPTIONAL_LITERAL,
1628 SPV_OPERAND_TYPE_ID_IN_OPTIONAL_TUPLE, type});
1629 return true;
1630 case SPV_OPERAND_TYPE_VARIABLE_ID_LITERAL:
1631 // Represents Zero or more (Id, Literal) pairs.
1632 pattern->insert(pattern->begin(),
1633 {SPV_OPERAND_TYPE_OPTIONAL_ID,
1634 SPV_OPERAND_TYPE_LITERAL_IN_OPTIONAL_TUPLE, type});
1635 return true;
David Neto78c3b432015-08-27 13:03:52 -04001636 case SPV_OPERAND_TYPE_VARIABLE_EXECUTION_MODE:
1637 pattern->insert(pattern->begin(), {SPV_OPERAND_TYPE_OPTIONAL_EXECUTION_MODE, type});
1638 return true;
1639 default:
1640 break;
1641 }
1642 return false;
1643}
1644
1645spv_operand_type_t spvTakeFirstMatchableOperand(spv_operand_pattern_t* pattern) {
1646 assert(!pattern->empty());
1647 spv_operand_type_t result;
1648 do {
1649 result = pattern->front();
1650 pattern->pop_front();
1651 } while(spvExpandOperandSequenceOnce(result, pattern));
1652 return result;
1653}