blob: 27bd5450bd4bd1f0bea8f78fea9a285350cd1d9b [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)},
Lei Zhang863ddbe2015-09-23 17:09:01 -0400154 {ExecMode0(Xfb, TransformFeedback)},
Lei Zhang85c6f792015-09-23 15:42:18 -0400155 {ExecMode0(DepthReplacing, Shader)},
Lei Zhang85c6f792015-09-23 15:42:18 -0400156 {ExecMode0(DepthGreater, Shader)},
157 {ExecMode0(DepthLess, Shader)},
158 {ExecMode0(DepthUnchanged, Shader)},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100159 {"LocalSize",
160 ExecutionModeLocalSize,
161 SPV_OPCODE_FLAGS_NONE,
162 0,
163 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_LITERAL_NUMBER,
164 SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
165 {"LocalSizeHint",
166 ExecutionModeLocalSizeHint,
167 SPV_OPCODE_FLAGS_CAPABILITIES,
168 CapabilityKernel,
169 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_LITERAL_NUMBER,
170 SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
Lei Zhang85c6f792015-09-23 15:42:18 -0400171 {ExecMode0(InputPoints, Geometry)},
172 {ExecMode0(InputLines, Geometry)},
173 {ExecMode0(InputLinesAdjacency, Geometry)},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100174 {"InputTriangles",
175 ExecutionModeInputTriangles,
176 SPV_OPCODE_FLAGS_CAPABILITIES,
Lei Zhang85c6f792015-09-23 15:42:18 -0400177 // TODO(dneto): Capabilities are defined as sequential numbers instead of
178 // bit masks. They cannot be meaningfully combined with a bitwise OR.
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100179 CapabilityGeometry | CapabilityTessellation,
180 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang85c6f792015-09-23 15:42:18 -0400181 {ExecMode0(InputTrianglesAdjacency, Geometry)},
182 {ExecMode0(InputQuads, Tessellation)},
183 {ExecMode0(InputIsolines, Tessellation)},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100184 {"OutputVertices",
185 ExecutionModeOutputVertices,
186 SPV_OPCODE_FLAGS_CAPABILITIES,
Lei Zhang85c6f792015-09-23 15:42:18 -0400187 // TODO(dneto): Capabilities are defined as sequential numbers instead of
188 // bit masks. They cannot be meaningfully combined with a bitwise OR.
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100189 CapabilityGeometry | CapabilityTessellation,
190 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
Lei Zhang85c6f792015-09-23 15:42:18 -0400191 {ExecMode0(OutputPoints, Geometry)},
192 {ExecMode0(OutputLineStrip, Geometry)},
193 {ExecMode0(OutputTriangleStrip, Geometry)},
194 {ExecMode1(VecTypeHint, Kernel)},
195 {ExecMode0(ContractionOff, Kernel)},
196 {ExecMode0(IndependentForwardProgress, Kernel)},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100197};
Lei Zhang85c6f792015-09-23 15:42:18 -0400198#undef ExecMode0
199#undef ExecMode1
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100200
201static const spv_operand_desc_t storageClassEntries[] = {
Dejan Mircevski50babb22015-09-29 10:56:32 -0400202 // TODO(dneto): There are more storage classes in Rev32 and later.
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100203 {"UniformConstant",
204 StorageClassUniformConstant,
205 SPV_OPCODE_FLAGS_NONE,
206 0,
207 {SPV_OPERAND_TYPE_NONE}},
208 {"Input",
209 StorageClassInput,
210 SPV_OPCODE_FLAGS_CAPABILITIES,
211 CapabilityShader,
212 {SPV_OPERAND_TYPE_NONE}},
213 {"Uniform",
214 StorageClassUniform,
215 SPV_OPCODE_FLAGS_CAPABILITIES,
216 CapabilityShader,
217 {SPV_OPERAND_TYPE_NONE}},
218 {"Output",
219 StorageClassOutput,
220 SPV_OPCODE_FLAGS_CAPABILITIES,
221 CapabilityShader,
222 {SPV_OPERAND_TYPE_NONE}},
223 {"WorkgroupLocal",
224 StorageClassWorkgroupLocal,
225 SPV_OPCODE_FLAGS_NONE,
226 0,
227 {SPV_OPERAND_TYPE_NONE}},
228 {"WorkgroupGlobal",
229 StorageClassWorkgroupGlobal,
230 SPV_OPCODE_FLAGS_NONE,
231 0,
232 {SPV_OPERAND_TYPE_NONE}},
233 {"PrivateGlobal",
234 StorageClassPrivateGlobal,
235 SPV_OPCODE_FLAGS_CAPABILITIES,
236 CapabilityShader,
237 {SPV_OPERAND_TYPE_NONE}},
238 {"Function",
239 StorageClassFunction,
240 SPV_OPCODE_FLAGS_NONE,
241 0,
242 {SPV_OPERAND_TYPE_NONE}},
243 {"Generic",
244 StorageClassGeneric,
245 SPV_OPCODE_FLAGS_CAPABILITIES,
246 CapabilityKernel,
247 {SPV_OPERAND_TYPE_NONE}},
David Neto9819adf2015-09-23 10:19:57 -0400248 {"PushConstant",
249 StorageClassPushConstant,
250 SPV_OPCODE_FLAGS_CAPABILITIES,
251 CapabilityShader,
252 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100253 {"AtomicCounter",
254 StorageClassAtomicCounter,
255 SPV_OPCODE_FLAGS_CAPABILITIES,
256 CapabilityShader,
257 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400258 {"Image",
259 StorageClassImage,
260 SPV_OPCODE_FLAGS_NONE,
261 0,
262 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100263};
264
265static const spv_operand_desc_t dimensionalityEntries[] = {
Dejan Mircevski50babb22015-09-29 10:56:32 -0400266 // TODO(dneto): Update capability dependencies for Rev32
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100267 {"1D", Dim1D, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_NONE}},
268 {"2D", Dim2D, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_NONE}},
269 {"3D", Dim3D, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_NONE}},
270 {"Cube",
271 DimCube,
272 SPV_OPCODE_FLAGS_CAPABILITIES,
273 CapabilityShader,
274 {SPV_OPERAND_TYPE_NONE}},
275 {"Rect",
276 DimRect,
277 SPV_OPCODE_FLAGS_CAPABILITIES,
278 CapabilityShader,
279 {SPV_OPERAND_TYPE_NONE}},
280 {"Buffer", DimBuffer, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_NONE}},
David Netoaa0c3a52015-09-23 10:30:06 -0400281 {"InputTarget",
282 DimInputTarget,
283 SPV_OPCODE_FLAGS_CAPABILITIES,
284 CapabilityInputTarget,
285 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100286};
287
288static const spv_operand_desc_t samplerAddressingModeEntries[] = {
289 {"None",
290 SamplerAddressingModeNone,
291 SPV_OPCODE_FLAGS_CAPABILITIES,
292 CapabilityKernel,
293 {SPV_OPERAND_TYPE_NONE}},
294 {"ClampToEdge",
295 SamplerAddressingModeClampToEdge,
296 SPV_OPCODE_FLAGS_CAPABILITIES,
297 CapabilityKernel,
298 {SPV_OPERAND_TYPE_NONE}},
299 {"Clamp",
300 SamplerAddressingModeClamp,
301 SPV_OPCODE_FLAGS_CAPABILITIES,
302 CapabilityKernel,
303 {SPV_OPERAND_TYPE_NONE}},
304 {"Repeat",
305 SamplerAddressingModeRepeat,
306 SPV_OPCODE_FLAGS_CAPABILITIES,
307 CapabilityKernel,
308 {SPV_OPERAND_TYPE_NONE}},
309 {"RepeatMirrored",
310 SamplerAddressingModeRepeatMirrored,
311 SPV_OPCODE_FLAGS_CAPABILITIES,
312 CapabilityKernel,
313 {SPV_OPERAND_TYPE_NONE}},
314};
315
316static const spv_operand_desc_t samplerFilterModeEntries[] = {
317 {"Nearest",
318 SamplerFilterModeNearest,
319 SPV_OPCODE_FLAGS_CAPABILITIES,
320 CapabilityKernel,
321 {SPV_OPERAND_TYPE_NONE}},
322 {"Linear",
323 SamplerFilterModeLinear,
324 SPV_OPCODE_FLAGS_CAPABILITIES,
325 CapabilityKernel,
326 {SPV_OPERAND_TYPE_NONE}},
327};
328
David Netob30a0c52015-09-16 15:56:43 -0400329static const spv_operand_desc_t samplerImageFormatEntries[] = {
330// In Rev31, all the cases depend on the Shader capability.
331// TODO(dneto): In Rev32, many of these depend on the AdvancedFormats
332// capability instead.
333#define CASE(NAME) \
334 { \
335 #NAME, ImageFormat##NAME, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityShader, \
336 { \
337 SPV_OPERAND_TYPE_NONE \
338 } \
339 }
Dejan Mircevski50babb22015-09-29 10:56:32 -0400340 // clang-format off
David Netob30a0c52015-09-16 15:56:43 -0400341 CASE(Unknown),
342 CASE(Rgba32f),
343 CASE(Rgba16f),
344 CASE(R32f),
345 CASE(Rgba8),
346 CASE(Rgba8Snorm),
347 CASE(Rg32f),
348 CASE(Rg16f),
349 CASE(R11fG11fB10f),
350 CASE(R16f),
351 CASE(Rgba16),
352 CASE(Rgb10A2),
353 CASE(Rg16),
354 CASE(Rg8),
355 CASE(R16),
356 CASE(R8),
357 CASE(Rgba16Snorm),
358 CASE(Rg16Snorm),
359 CASE(Rg8Snorm),
360 CASE(R16Snorm),
361 CASE(R8Snorm),
362 CASE(Rgba32i),
363 CASE(Rgba16i),
364 CASE(Rgba8i),
365 CASE(R32i),
366 CASE(Rg32i),
367 CASE(Rg16i),
368 CASE(Rg8i),
369 CASE(R16i),
370 CASE(R8i),
371 CASE(Rgba32ui),
372 CASE(Rgba16ui),
373 CASE(Rgba8ui),
374 CASE(R32ui),
375 CASE(Rgb10a2ui),
376 CASE(Rg32ui),
377 CASE(Rg16ui),
378 CASE(Rg8ui),
379 CASE(R16ui),
380 CASE(R8ui),
Dejan Mircevski50babb22015-09-29 10:56:32 -0400381// clang-format on
David Netob30a0c52015-09-16 15:56:43 -0400382#undef CASE
383};
384
David Netoee1b3bb2015-09-18 11:19:18 -0400385// Image operand definitions. Each enum value is a mask. When that mask
386// bit is set, the instruction should have further ID operands.
387// Some mask values depend on a capability.
388static const spv_operand_desc_t imageOperandEntries[] = {
389// Rev32 and later adds many more enums.
390#define CASE(NAME) \
391 #NAME, spv::ImageOperands##NAME##Mask, SPV_OPCODE_FLAGS_NONE, 0
392#define CASE_CAP(NAME, CAP) \
393 #NAME, spv::ImageOperands##NAME##Mask, SPV_OPCODE_FLAGS_CAPABILITIES, CAP
394#define ID SPV_OPERAND_TYPE_ID
395#define NONE SPV_OPERAND_TYPE_NONE
396 {"None", spv::ImageOperandsMaskNone, SPV_OPCODE_FLAGS_NONE, 0, {NONE}},
397 {CASE_CAP(Bias, CapabilityShader), {ID, NONE}},
398 {CASE(Lod), {ID, NONE}},
399 {CASE(Grad), {ID, ID, NONE}},
400 {CASE(ConstOffset), {ID, NONE}},
401 {CASE_CAP(Offset, CapabilityImageGatherExtended), {ID, NONE}},
402 {CASE(ConstOffsets), {ID, NONE}},
403 {CASE(Sample), {ID, NONE}},
David Neto8576c9c2015-09-23 14:32:37 -0400404 {CASE_CAP(MinLod, CapabilityMinLod), {ID, NONE}},
David Netoee1b3bb2015-09-18 11:19:18 -0400405#undef CASE
406#undef CASE_CAP
407#undef ID
408#undef NONE
409};
410
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100411static const spv_operand_desc_t fpFastMathModeEntries[] = {
412 {"None",
413 FPFastMathModeMaskNone,
414 SPV_OPCODE_FLAGS_NONE,
415 0,
416 {SPV_OPERAND_TYPE_NONE}},
417 {"NotNaN",
418 FPFastMathModeNotNaNMask,
419 SPV_OPCODE_FLAGS_CAPABILITIES,
420 CapabilityKernel,
421 {SPV_OPERAND_TYPE_NONE}},
422 {"NotInf",
423 FPFastMathModeNotInfMask,
424 SPV_OPCODE_FLAGS_CAPABILITIES,
425 CapabilityKernel,
426 {SPV_OPERAND_TYPE_NONE}},
427 {"NSZ",
428 FPFastMathModeNSZMask,
429 SPV_OPCODE_FLAGS_CAPABILITIES,
430 CapabilityKernel,
431 {SPV_OPERAND_TYPE_NONE}},
432 {"AllowRecip",
433 FPFastMathModeAllowRecipMask,
434 SPV_OPCODE_FLAGS_CAPABILITIES,
435 CapabilityKernel,
436 {SPV_OPERAND_TYPE_NONE}},
437 {"Fast",
438 FPFastMathModeFastMask,
439 SPV_OPCODE_FLAGS_CAPABILITIES,
440 CapabilityKernel,
441 {SPV_OPERAND_TYPE_NONE}},
442};
443
444static const spv_operand_desc_t fpRoundingModeEntries[] = {
445 {"RTE",
446 FPRoundingModeRTE,
447 SPV_OPCODE_FLAGS_CAPABILITIES,
448 CapabilityKernel,
449 {SPV_OPERAND_TYPE_NONE}},
450 {"RTZ",
451 FPRoundingModeRTZ,
452 SPV_OPCODE_FLAGS_CAPABILITIES,
453 CapabilityKernel,
454 {SPV_OPERAND_TYPE_NONE}},
455 {"RTP",
456 FPRoundingModeRTP,
457 SPV_OPCODE_FLAGS_CAPABILITIES,
458 CapabilityKernel,
459 {SPV_OPERAND_TYPE_NONE}},
460 {"RTN",
461 FPRoundingModeRTN,
462 SPV_OPCODE_FLAGS_CAPABILITIES,
463 CapabilityKernel,
464 {SPV_OPERAND_TYPE_NONE}},
465};
466
467static const spv_operand_desc_t linkageTypeEntries[] = {
468 {"Export",
469 LinkageTypeExport,
470 SPV_OPCODE_FLAGS_CAPABILITIES,
471 CapabilityLinkage,
472 {SPV_OPERAND_TYPE_NONE}},
473 {"Import",
474 LinkageTypeImport,
475 SPV_OPCODE_FLAGS_CAPABILITIES,
476 CapabilityLinkage,
477 {SPV_OPERAND_TYPE_NONE}},
478};
479
480static const spv_operand_desc_t accessQualifierEntries[] = {
481 {"ReadOnly",
482 AccessQualifierReadOnly,
483 SPV_OPCODE_FLAGS_CAPABILITIES,
484 CapabilityKernel,
485 {SPV_OPERAND_TYPE_NONE}},
486 {"WriteOnly",
487 AccessQualifierWriteOnly,
488 SPV_OPCODE_FLAGS_CAPABILITIES,
489 CapabilityKernel,
490 {SPV_OPERAND_TYPE_NONE}},
491 {"ReadWrite",
492 AccessQualifierReadWrite,
493 SPV_OPCODE_FLAGS_CAPABILITIES,
494 CapabilityKernel,
495 {SPV_OPERAND_TYPE_NONE}},
496};
497
498static const spv_operand_desc_t functionParameterAttributeEntries[] = {
499 {"Zext",
500 FunctionParameterAttributeZext,
501 SPV_OPCODE_FLAGS_CAPABILITIES,
502 CapabilityKernel,
503 {SPV_OPERAND_TYPE_NONE}},
504 {"Sext",
505 FunctionParameterAttributeSext,
506 SPV_OPCODE_FLAGS_CAPABILITIES,
507 CapabilityKernel,
508 {SPV_OPERAND_TYPE_NONE}},
509 {"ByVal",
510 FunctionParameterAttributeByVal,
511 SPV_OPCODE_FLAGS_CAPABILITIES,
512 CapabilityKernel,
513 {SPV_OPERAND_TYPE_NONE}},
514 {"Sret",
515 FunctionParameterAttributeSret,
516 SPV_OPCODE_FLAGS_CAPABILITIES,
517 CapabilityKernel,
518 {SPV_OPERAND_TYPE_NONE}},
519 {"NoAlias",
520 FunctionParameterAttributeNoAlias,
521 SPV_OPCODE_FLAGS_CAPABILITIES,
522 CapabilityKernel,
523 {SPV_OPERAND_TYPE_NONE}},
David Neto37547b22015-09-10 13:23:11 -0400524 {"NoCapture",
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100525 FunctionParameterAttributeNoCapture,
526 SPV_OPCODE_FLAGS_CAPABILITIES,
527 CapabilityKernel,
528 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100529 {"NoWrite",
530 FunctionParameterAttributeNoWrite,
531 SPV_OPCODE_FLAGS_CAPABILITIES,
532 CapabilityKernel,
533 {SPV_OPERAND_TYPE_NONE}},
534 {"NoReadWrite",
535 FunctionParameterAttributeNoReadWrite,
536 SPV_OPCODE_FLAGS_CAPABILITIES,
537 CapabilityKernel,
538 {SPV_OPERAND_TYPE_NONE}},
539};
540
541static const spv_operand_desc_t decorationEntries[] = {
Lei Zhang604e5ce2015-08-14 14:46:43 -0400542 {"RelaxedPrecision",
543 DecorationRelaxedPrecision,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100544 SPV_OPCODE_FLAGS_CAPABILITIES,
545 CapabilityShader,
546 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400547 {
Dejan Mircevski50babb22015-09-29 10:56:32 -0400548 "SpecId",
549 DecorationSpecId,
550 SPV_OPCODE_FLAGS_CAPABILITIES,
551 CapabilityShader,
552 {SPV_OPERAND_TYPE_LITERAL_NUMBER},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400553 },
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100554 {"Block",
555 DecorationBlock,
556 SPV_OPCODE_FLAGS_CAPABILITIES,
557 CapabilityShader,
558 {SPV_OPERAND_TYPE_NONE}},
559 {"BufferBlock",
560 DecorationBufferBlock,
561 SPV_OPCODE_FLAGS_CAPABILITIES,
562 CapabilityShader,
563 {SPV_OPERAND_TYPE_NONE}},
564 {"RowMajor",
565 DecorationRowMajor,
566 SPV_OPCODE_FLAGS_CAPABILITIES,
567 CapabilityMatrix,
568 {SPV_OPERAND_TYPE_NONE}},
569 {"ColMajor",
570 DecorationColMajor,
571 SPV_OPCODE_FLAGS_CAPABILITIES,
572 CapabilityMatrix,
573 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400574 {"ArrayStride",
575 DecorationArrayStride,
576 SPV_OPCODE_FLAGS_CAPABILITIES,
577 CapabilityShader,
578 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
579 {"MatrixStride",
580 DecorationMatrixStride,
581 SPV_OPCODE_FLAGS_CAPABILITIES,
582 CapabilityShader,
583 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100584 {"GLSLShared",
585 DecorationGLSLShared,
586 SPV_OPCODE_FLAGS_CAPABILITIES,
587 CapabilityShader,
588 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100589 {"GLSLPacked",
590 DecorationGLSLPacked,
591 SPV_OPCODE_FLAGS_CAPABILITIES,
592 CapabilityShader,
593 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400594 {"CPacked",
595 DecorationCPacked,
596 SPV_OPCODE_FLAGS_CAPABILITIES,
597 CapabilityKernel,
598 {SPV_OPERAND_TYPE_NONE}},
599 {"BuiltIn",
600 DecorationBuiltIn,
601 SPV_OPCODE_FLAGS_CAPABILITIES,
602 CapabilityShader,
603 {SPV_OPERAND_TYPE_BUILT_IN, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100604 {"Smooth",
605 DecorationSmooth,
606 SPV_OPCODE_FLAGS_CAPABILITIES,
607 CapabilityShader,
608 {SPV_OPERAND_TYPE_NONE}},
David Netodbaf4072015-09-22 16:23:06 -0400609 {"NoPerspective",
610 DecorationNoPerspective,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100611 SPV_OPCODE_FLAGS_CAPABILITIES,
612 CapabilityShader,
613 {SPV_OPERAND_TYPE_NONE}},
614 {"Flat",
615 DecorationFlat,
616 SPV_OPCODE_FLAGS_CAPABILITIES,
617 CapabilityShader,
618 {SPV_OPERAND_TYPE_NONE}},
619 {"Patch",
620 DecorationPatch,
621 SPV_OPCODE_FLAGS_CAPABILITIES,
622 CapabilityTessellation,
623 {SPV_OPERAND_TYPE_NONE}},
624 {"Centroid",
625 DecorationCentroid,
626 SPV_OPCODE_FLAGS_CAPABILITIES,
627 CapabilityShader,
628 {SPV_OPERAND_TYPE_NONE}},
629 {"Sample",
630 DecorationSample,
631 SPV_OPCODE_FLAGS_CAPABILITIES,
632 CapabilityShader,
633 {SPV_OPERAND_TYPE_NONE}},
634 {"Invariant",
635 DecorationInvariant,
636 SPV_OPCODE_FLAGS_CAPABILITIES,
637 CapabilityShader,
638 {SPV_OPERAND_TYPE_NONE}},
639 {"Restrict",
640 DecorationRestrict,
641 SPV_OPCODE_FLAGS_NONE,
642 0,
643 {SPV_OPERAND_TYPE_NONE}},
644 {"Aliased",
645 DecorationAliased,
646 SPV_OPCODE_FLAGS_NONE,
647 0,
648 {SPV_OPERAND_TYPE_NONE}},
649 {"Volatile",
650 DecorationVolatile,
651 SPV_OPCODE_FLAGS_NONE,
652 0,
653 {SPV_OPERAND_TYPE_NONE}},
654 {"Constant",
655 DecorationConstant,
656 SPV_OPCODE_FLAGS_CAPABILITIES,
657 CapabilityKernel,
658 {SPV_OPERAND_TYPE_NONE}},
659 {"Coherent",
660 DecorationCoherent,
661 SPV_OPCODE_FLAGS_NONE,
662 0,
663 {SPV_OPERAND_TYPE_NONE}},
David Netodbaf4072015-09-22 16:23:06 -0400664 {"NonWritable",
665 DecorationNonWritable,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100666 SPV_OPCODE_FLAGS_NONE,
667 0,
668 {SPV_OPERAND_TYPE_NONE}},
David Netodbaf4072015-09-22 16:23:06 -0400669 {"NonReadable",
670 DecorationNonReadable,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100671 SPV_OPCODE_FLAGS_NONE,
672 0,
673 {SPV_OPERAND_TYPE_NONE}},
674 {"Uniform",
675 DecorationUniform,
676 SPV_OPCODE_FLAGS_CAPABILITIES,
677 CapabilityShader,
678 {SPV_OPERAND_TYPE_NONE}},
David Neto37547b22015-09-10 13:23:11 -0400679 {"SaturatedConversion",
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100680 DecorationSaturatedConversion,
681 SPV_OPCODE_FLAGS_CAPABILITIES,
682 CapabilityKernel,
683 {SPV_OPERAND_TYPE_NONE}},
684 {"Stream",
685 DecorationStream,
686 SPV_OPCODE_FLAGS_CAPABILITIES,
687 CapabilityGeometry,
688 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
689 {"Location",
690 DecorationLocation,
691 SPV_OPCODE_FLAGS_CAPABILITIES,
692 CapabilityShader,
693 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
694 {"Component",
695 DecorationComponent,
696 SPV_OPCODE_FLAGS_CAPABILITIES,
697 CapabilityShader,
698 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
699 {"Index",
700 DecorationIndex,
701 SPV_OPCODE_FLAGS_CAPABILITIES,
702 CapabilityShader,
703 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
704 {"Binding",
705 DecorationBinding,
706 SPV_OPCODE_FLAGS_CAPABILITIES,
707 CapabilityShader,
708 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
709 {"DescriptorSet",
710 DecorationDescriptorSet,
711 SPV_OPCODE_FLAGS_CAPABILITIES,
712 CapabilityShader,
713 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
714 {"Offset",
715 DecorationOffset,
716 SPV_OPCODE_FLAGS_NONE,
717 0,
718 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100719 {"XfbBuffer",
720 DecorationXfbBuffer,
721 SPV_OPCODE_FLAGS_CAPABILITIES,
722 CapabilityShader,
723 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400724 {"XfbStride",
725 DecorationXfbStride,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100726 SPV_OPCODE_FLAGS_CAPABILITIES,
727 CapabilityShader,
728 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100729 {"FuncParamAttr",
730 DecorationFuncParamAttr,
731 SPV_OPCODE_FLAGS_CAPABILITIES,
732 CapabilityKernel,
733 {SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE, SPV_OPERAND_TYPE_NONE}},
734 {"FPRoundingMode",
735 DecorationFPRoundingMode,
736 SPV_OPCODE_FLAGS_CAPABILITIES,
737 CapabilityKernel,
738 {SPV_OPERAND_TYPE_FP_ROUNDING_MODE, SPV_OPERAND_TYPE_NONE}},
739 {"FPFastMathMode",
David Neto37547b22015-09-10 13:23:11 -0400740 DecorationFPFastMathMode,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100741 SPV_OPCODE_FLAGS_CAPABILITIES,
742 CapabilityKernel,
743 {SPV_OPERAND_TYPE_FP_FAST_MATH_MODE, SPV_OPERAND_TYPE_NONE}},
744 {"LinkageAttributes",
745 DecorationLinkageAttributes,
746 SPV_OPCODE_FLAGS_CAPABILITIES,
747 CapabilityLinkage,
Dejan Mircevski50babb22015-09-29 10:56:32 -0400748 {SPV_OPERAND_TYPE_LITERAL_STRING, SPV_OPERAND_TYPE_LINKAGE_TYPE,
749 SPV_OPERAND_TYPE_NONE}},
David Netod7687982015-09-23 14:59:27 -0400750 {"NoContraction",
751 DecorationNoContraction,
752 SPV_OPCODE_FLAGS_CAPABILITIES,
753 CapabilityShader,
754 {SPV_OPERAND_TYPE_NONE}},
755 {"InputTargetIndex",
756 DecorationInputTargetIndex,
757 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski50babb22015-09-29 10:56:32 -0400758 CapabilityShader, // TODO(dneto): Should this be CapabilityInputTarget?
759 {SPV_OPERAND_TYPE_NONE}}, // TODO(dneto): Should this have a literal
760 // number argument?
David Netod7687982015-09-23 14:59:27 -0400761 {"Alignment",
762 DecorationAlignment,
763 SPV_OPCODE_FLAGS_CAPABILITIES,
764 CapabilityKernel,
765 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100766};
767
768static const spv_operand_desc_t builtInEntries[] = {
769 {"Position",
770 BuiltInPosition,
771 SPV_OPCODE_FLAGS_CAPABILITIES,
772 CapabilityShader,
773 {SPV_OPERAND_TYPE_NONE}},
774 {"PointSize",
775 BuiltInPointSize,
776 SPV_OPCODE_FLAGS_CAPABILITIES,
777 CapabilityShader,
778 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100779 {"ClipDistance",
780 BuiltInClipDistance,
781 SPV_OPCODE_FLAGS_CAPABILITIES,
782 CapabilityShader,
783 {SPV_OPERAND_TYPE_NONE}},
784 {"CullDistance",
785 BuiltInCullDistance,
786 SPV_OPCODE_FLAGS_CAPABILITIES,
787 CapabilityShader,
788 {SPV_OPERAND_TYPE_NONE}},
789 {"VertexId",
790 BuiltInVertexId,
791 SPV_OPCODE_FLAGS_CAPABILITIES,
792 CapabilityShader,
793 {SPV_OPERAND_TYPE_NONE}},
794 {"InstanceId",
795 BuiltInInstanceId,
796 SPV_OPCODE_FLAGS_CAPABILITIES,
797 CapabilityShader,
798 {SPV_OPERAND_TYPE_NONE}},
799 {"PrimitiveId",
800 BuiltInPrimitiveId,
801 SPV_OPCODE_FLAGS_CAPABILITIES,
802 CapabilityGeometry | CapabilityTessellation,
803 {SPV_OPERAND_TYPE_NONE}},
804 {"InvocationId",
805 BuiltInInvocationId,
806 SPV_OPCODE_FLAGS_CAPABILITIES,
807 CapabilityGeometry | CapabilityTessellation,
808 {SPV_OPERAND_TYPE_NONE}},
809 {"Layer",
810 BuiltInLayer,
811 SPV_OPCODE_FLAGS_CAPABILITIES,
812 CapabilityGeometry,
813 {SPV_OPERAND_TYPE_NONE}},
814 {"ViewportIndex",
815 BuiltInViewportIndex,
816 SPV_OPCODE_FLAGS_CAPABILITIES,
817 CapabilityGeometry,
818 {SPV_OPERAND_TYPE_NONE}},
819 {"TessLevelOuter",
820 BuiltInTessLevelOuter,
821 SPV_OPCODE_FLAGS_CAPABILITIES,
822 CapabilityTessellation,
823 {SPV_OPERAND_TYPE_NONE}},
824 {"TessLevelInner",
825 BuiltInTessLevelInner,
826 SPV_OPCODE_FLAGS_CAPABILITIES,
827 CapabilityTessellation,
828 {SPV_OPERAND_TYPE_NONE}},
829 {"TessCoord",
830 BuiltInTessCoord,
831 SPV_OPCODE_FLAGS_CAPABILITIES,
832 CapabilityTessellation,
833 {SPV_OPERAND_TYPE_NONE}},
834 {"PatchVertices",
835 BuiltInPatchVertices,
836 SPV_OPCODE_FLAGS_CAPABILITIES,
837 CapabilityTessellation,
838 {SPV_OPERAND_TYPE_NONE}},
839 {"FragCoord",
840 BuiltInFragCoord,
841 SPV_OPCODE_FLAGS_CAPABILITIES,
842 CapabilityShader,
843 {SPV_OPERAND_TYPE_NONE}},
844 {"PointCoord",
845 BuiltInPointCoord,
846 SPV_OPCODE_FLAGS_CAPABILITIES,
847 CapabilityShader,
848 {SPV_OPERAND_TYPE_NONE}},
849 {"FrontFacing",
850 BuiltInFrontFacing,
851 SPV_OPCODE_FLAGS_CAPABILITIES,
852 CapabilityShader,
853 {SPV_OPERAND_TYPE_NONE}},
854 {"SampleId",
855 BuiltInSampleId,
856 SPV_OPCODE_FLAGS_CAPABILITIES,
857 CapabilityShader,
858 {SPV_OPERAND_TYPE_NONE}},
859 {"SamplePosition",
860 BuiltInSamplePosition,
861 SPV_OPCODE_FLAGS_CAPABILITIES,
862 CapabilityShader,
863 {SPV_OPERAND_TYPE_NONE}},
864 {"SampleMask",
865 BuiltInSampleMask,
866 SPV_OPCODE_FLAGS_CAPABILITIES,
867 CapabilityShader,
868 {SPV_OPERAND_TYPE_NONE}},
869 {"FragColor",
870 BuiltInFragColor,
871 SPV_OPCODE_FLAGS_CAPABILITIES,
872 CapabilityShader,
873 {SPV_OPERAND_TYPE_NONE}},
874 {"FragDepth",
875 BuiltInFragDepth,
876 SPV_OPCODE_FLAGS_CAPABILITIES,
877 CapabilityShader,
878 {SPV_OPERAND_TYPE_NONE}},
879 {"HelperInvocation",
880 BuiltInHelperInvocation,
881 SPV_OPCODE_FLAGS_CAPABILITIES,
882 CapabilityShader,
883 {SPV_OPERAND_TYPE_NONE}},
884 {"NumWorkgroups",
885 BuiltInNumWorkgroups,
886 SPV_OPCODE_FLAGS_NONE,
887 0,
888 {SPV_OPERAND_TYPE_NONE}},
889 {"WorkgroupSize",
890 BuiltInWorkgroupSize,
891 SPV_OPCODE_FLAGS_NONE,
892 0,
893 {SPV_OPERAND_TYPE_NONE}},
894 {"WorkgroupId",
895 BuiltInWorkgroupId,
896 SPV_OPCODE_FLAGS_NONE,
897 0,
898 {SPV_OPERAND_TYPE_NONE}},
899 {"LocalInvocationId",
900 BuiltInLocalInvocationId,
901 SPV_OPCODE_FLAGS_NONE,
902 0,
903 {SPV_OPERAND_TYPE_NONE}},
904 {"GlobalInvocationId",
905 BuiltInGlobalInvocationId,
906 SPV_OPCODE_FLAGS_NONE,
907 0,
908 {SPV_OPERAND_TYPE_NONE}},
909 {"LocalInvocationIndex",
David Neto37547b22015-09-10 13:23:11 -0400910 BuiltInLocalInvocationIndex,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100911 SPV_OPCODE_FLAGS_CAPABILITIES,
912 CapabilityShader,
913 {SPV_OPERAND_TYPE_NONE}},
914 {"WorkDim",
915 BuiltInWorkDim,
916 SPV_OPCODE_FLAGS_CAPABILITIES,
917 CapabilityKernel,
918 {SPV_OPERAND_TYPE_NONE}},
919 {"GlobalSize",
920 BuiltInGlobalSize,
921 SPV_OPCODE_FLAGS_CAPABILITIES,
922 CapabilityKernel,
923 {SPV_OPERAND_TYPE_NONE}},
924 {"EnqueuedWorkgroupSize",
925 BuiltInEnqueuedWorkgroupSize,
926 SPV_OPCODE_FLAGS_CAPABILITIES,
927 CapabilityKernel,
928 {SPV_OPERAND_TYPE_NONE}},
929 {"GlobalOffset",
930 BuiltInGlobalOffset,
931 SPV_OPCODE_FLAGS_CAPABILITIES,
932 CapabilityKernel,
933 {SPV_OPERAND_TYPE_NONE}},
934 {"GlobalLinearId",
935 BuiltInGlobalLinearId,
936 SPV_OPCODE_FLAGS_CAPABILITIES,
937 CapabilityKernel,
938 {SPV_OPERAND_TYPE_NONE}},
939 {"WorkgroupLinearId",
940 BuiltInWorkgroupLinearId,
941 SPV_OPCODE_FLAGS_CAPABILITIES,
942 CapabilityKernel,
943 {SPV_OPERAND_TYPE_NONE}},
944 {"SubgroupSize",
945 BuiltInSubgroupSize,
946 SPV_OPCODE_FLAGS_CAPABILITIES,
947 CapabilityKernel,
948 {SPV_OPERAND_TYPE_NONE}},
949 {"SubgroupMaxSize",
950 BuiltInSubgroupMaxSize,
951 SPV_OPCODE_FLAGS_CAPABILITIES,
952 CapabilityKernel,
953 {SPV_OPERAND_TYPE_NONE}},
954 {"NumSubgroups",
955 BuiltInNumSubgroups,
956 SPV_OPCODE_FLAGS_CAPABILITIES,
957 CapabilityKernel,
958 {SPV_OPERAND_TYPE_NONE}},
959 {"NumEnqueuedSubgroups",
960 BuiltInNumEnqueuedSubgroups,
961 SPV_OPCODE_FLAGS_CAPABILITIES,
962 CapabilityKernel,
963 {SPV_OPERAND_TYPE_NONE}},
964 {"SubgroupId",
David Neto37547b22015-09-10 13:23:11 -0400965 BuiltInSubgroupId,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100966 SPV_OPCODE_FLAGS_CAPABILITIES,
967 CapabilityKernel,
968 {SPV_OPERAND_TYPE_NONE}},
969 {"SubgroupLocalInvocationId",
970 BuiltInSubgroupLocalInvocationId,
971 SPV_OPCODE_FLAGS_CAPABILITIES,
972 CapabilityKernel,
973 {SPV_OPERAND_TYPE_NONE}},
David Neto2d1b5e52015-09-23 15:35:27 -0400974 {"VertexIndex",
975 BuiltInVertexIndex,
976 SPV_OPCODE_FLAGS_CAPABILITIES,
977 CapabilityShader,
978 {SPV_OPERAND_TYPE_NONE}},
979 {"InstanceIndex",
980 BuiltInInstanceIndex,
981 SPV_OPCODE_FLAGS_CAPABILITIES,
982 CapabilityShader,
983 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100984};
985
986static const spv_operand_desc_t selectionControlEntries[] = {
987 {"None",
988 SelectionControlMaskNone,
989 SPV_OPCODE_FLAGS_NONE,
990 0,
991 {SPV_OPERAND_TYPE_NONE}},
992 {"Flatten",
993 SelectionControlFlattenMask,
994 SPV_OPCODE_FLAGS_NONE,
995 0,
996 {SPV_OPERAND_TYPE_NONE}},
997 {"DontFlatten",
998 SelectionControlDontFlattenMask,
999 SPV_OPCODE_FLAGS_NONE,
1000 0,
1001 {SPV_OPERAND_TYPE_NONE}},
1002};
1003
1004static const spv_operand_desc_t loopControlEntries[] = {
1005 {"None",
1006 LoopControlMaskNone,
1007 SPV_OPCODE_FLAGS_NONE,
1008 0,
1009 {SPV_OPERAND_TYPE_NONE}},
1010 {"Unroll",
1011 LoopControlUnrollMask,
1012 SPV_OPCODE_FLAGS_NONE,
1013 0,
1014 {SPV_OPERAND_TYPE_NONE}},
1015 {"DontUnroll",
1016 LoopControlDontUnrollMask,
1017 SPV_OPCODE_FLAGS_NONE,
1018 0,
1019 {SPV_OPERAND_TYPE_NONE}},
1020};
1021
1022static const spv_operand_desc_t functionControlEntries[] = {
1023 {"None",
1024 FunctionControlMaskNone,
1025 SPV_OPCODE_FLAGS_NONE,
1026 0,
1027 {SPV_OPERAND_TYPE_NONE}},
David Netof4fde6c2015-09-14 14:50:37 -04001028 {"Inline",
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001029 FunctionControlInlineMask,
1030 SPV_OPCODE_FLAGS_NONE,
1031 0,
1032 {SPV_OPERAND_TYPE_NONE}},
1033 {"DontInline",
1034 FunctionControlDontInlineMask,
1035 SPV_OPCODE_FLAGS_NONE,
1036 0,
1037 {SPV_OPERAND_TYPE_NONE}},
1038 {"Pure",
1039 FunctionControlPureMask,
1040 SPV_OPCODE_FLAGS_NONE,
1041 0,
1042 {SPV_OPERAND_TYPE_NONE}},
1043 {"Const",
1044 FunctionControlConstMask,
1045 SPV_OPCODE_FLAGS_NONE,
1046 0,
1047 {SPV_OPERAND_TYPE_NONE}},
1048};
1049
1050static const spv_operand_desc_t memorySemanticsEntries[] = {
David Netobfa3d862015-09-25 10:30:27 -04001051 // "Relaxed" should be a synonym for "None".
1052 // Put the Relaxed entry first so that the disassembler
1053 // will prefer to emit "Relaxed".
1054 {"Relaxed",
1055 MemorySemanticsMaskNone,
1056 SPV_OPCODE_FLAGS_NONE,
1057 0,
1058 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001059 {"None",
1060 MemorySemanticsMaskNone,
1061 SPV_OPCODE_FLAGS_NONE,
1062 0,
1063 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001064 {"SequentiallyConsistent",
1065 MemorySemanticsSequentiallyConsistentMask,
1066 SPV_OPCODE_FLAGS_NONE,
1067 0,
1068 {SPV_OPERAND_TYPE_NONE}},
1069 {"Acquire",
1070 MemorySemanticsAcquireMask,
1071 SPV_OPCODE_FLAGS_NONE,
1072 0,
1073 {SPV_OPERAND_TYPE_NONE}},
1074 {"Release",
1075 MemorySemanticsReleaseMask,
1076 SPV_OPCODE_FLAGS_NONE,
1077 0,
1078 {SPV_OPERAND_TYPE_NONE}},
1079 {"UniformMemory",
1080 MemorySemanticsUniformMemoryMask,
1081 SPV_OPCODE_FLAGS_CAPABILITIES,
1082 CapabilityShader,
1083 {SPV_OPERAND_TYPE_NONE}},
1084 {"SubgroupMemory",
1085 MemorySemanticsSubgroupMemoryMask,
1086 SPV_OPCODE_FLAGS_NONE,
1087 0,
1088 {SPV_OPERAND_TYPE_NONE}},
1089 {"WorkgroupLocalMemory",
1090 MemorySemanticsWorkgroupLocalMemoryMask,
1091 SPV_OPCODE_FLAGS_NONE,
1092 0,
1093 {SPV_OPERAND_TYPE_NONE}},
1094 {"WorkgroupGlobalMemory",
1095 MemorySemanticsWorkgroupGlobalMemoryMask,
1096 SPV_OPCODE_FLAGS_NONE,
1097 0,
1098 {SPV_OPERAND_TYPE_NONE}},
1099 {"AtomicCounterMemory",
1100 MemorySemanticsAtomicCounterMemoryMask,
1101 SPV_OPCODE_FLAGS_CAPABILITIES,
1102 CapabilityShader,
1103 {SPV_OPERAND_TYPE_NONE}},
1104 {
Dejan Mircevski50babb22015-09-29 10:56:32 -04001105 "ImageMemory",
1106 MemorySemanticsImageMemoryMask,
1107 SPV_OPCODE_FLAGS_NONE,
1108 0,
1109 {SPV_OPERAND_TYPE_NONE},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001110 },
1111};
1112
1113static const spv_operand_desc_t memoryAccessEntries[] = {
1114 {"None",
1115 MemoryAccessMaskNone,
1116 SPV_OPCODE_FLAGS_NONE,
1117 0,
1118 {SPV_OPERAND_TYPE_NONE}},
1119 {"Volatile",
1120 MemoryAccessVolatileMask,
1121 SPV_OPCODE_FLAGS_NONE,
1122 0,
1123 {SPV_OPERAND_TYPE_NONE}},
1124 {
Dejan Mircevski50babb22015-09-29 10:56:32 -04001125 "Aligned",
1126 MemoryAccessAlignedMask,
1127 SPV_OPCODE_FLAGS_NONE,
1128 0,
1129 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001130 },
David Neto49c299b2015-09-23 15:38:59 -04001131 {"Nontemporal",
1132 MemoryAccessNontemporalMask,
1133 SPV_OPCODE_FLAGS_NONE,
1134 0,
1135 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001136};
1137
1138static const spv_operand_desc_t scopeEntries[] = {
1139 {"CrossDevice",
1140 ScopeCrossDevice,
1141 SPV_OPCODE_FLAGS_NONE,
1142 0,
1143 {SPV_OPERAND_TYPE_NONE}},
1144 {"Device", ScopeDevice, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_NONE}},
1145 {"Workgroup",
1146 ScopeWorkgroup,
1147 SPV_OPCODE_FLAGS_NONE,
1148 0,
1149 {SPV_OPERAND_TYPE_NONE}},
1150 {"Subgroup",
1151 ScopeSubgroup,
1152 SPV_OPCODE_FLAGS_NONE,
1153 0,
1154 {SPV_OPERAND_TYPE_NONE}},
1155 {
Dejan Mircevski50babb22015-09-29 10:56:32 -04001156 "Invocation",
1157 ScopeInvocation,
1158 SPV_OPCODE_FLAGS_NONE,
1159 0,
1160 {SPV_OPERAND_TYPE_NONE},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001161 },
1162};
1163
1164static const spv_operand_desc_t groupOperationEntries[] = {
1165 {"Reduce",
1166 GroupOperationReduce,
1167 SPV_OPCODE_FLAGS_CAPABILITIES,
1168 CapabilityKernel,
1169 {SPV_OPERAND_TYPE_NONE}},
1170 {"InclusiveScan",
1171 GroupOperationInclusiveScan,
1172 SPV_OPCODE_FLAGS_CAPABILITIES,
1173 CapabilityKernel,
1174 {SPV_OPERAND_TYPE_NONE}},
1175 {"ExclusiveScan",
1176 GroupOperationExclusiveScan,
1177 SPV_OPCODE_FLAGS_CAPABILITIES,
1178 CapabilityKernel,
1179 {SPV_OPERAND_TYPE_NONE}},
1180};
1181
1182static const spv_operand_desc_t kernelKernelEnqueueFlagssEntries[] = {
1183 {"NoWait",
1184 KernelEnqueueFlagsNoWait,
1185 SPV_OPCODE_FLAGS_CAPABILITIES,
1186 CapabilityKernel,
1187 {SPV_OPERAND_TYPE_NONE}},
1188 {"WaitKernel",
1189 KernelEnqueueFlagsWaitKernel,
1190 SPV_OPCODE_FLAGS_CAPABILITIES,
1191 CapabilityKernel,
1192 {SPV_OPERAND_TYPE_NONE}},
1193 {"WaitWorkGroup",
1194 KernelEnqueueFlagsWaitWorkGroup,
1195 SPV_OPCODE_FLAGS_CAPABILITIES,
1196 CapabilityKernel,
1197 {SPV_OPERAND_TYPE_NONE}},
1198};
1199
1200static const spv_operand_desc_t kernelProfilingInfoEntries[] = {
1201 {"None",
1202 KernelProfilingInfoMaskNone,
1203 SPV_OPCODE_FLAGS_NONE,
1204 0,
1205 {SPV_OPERAND_TYPE_NONE}},
1206 {"CmdExecTime",
1207 KernelProfilingInfoCmdExecTimeMask,
1208 SPV_OPCODE_FLAGS_CAPABILITIES,
1209 CapabilityKernel,
1210 {SPV_OPERAND_TYPE_NONE}},
1211};
1212
David Netod30b2332015-09-23 16:04:24 -04001213// A macro for defining a capability that doesn't depend on another capability.
1214#define CASE(NAME) \
1215 { \
1216 #NAME, Capability##NAME, SPV_OPCODE_FLAGS_NONE, 0, { \
1217 SPV_OPERAND_TYPE_NONE \
1218 } \
1219 }
1220
1221// A macro for defining a capability that depends on another.
1222#define CASE_CAP(NAME, CAP) \
1223 { \
1224 #NAME, Capability##NAME, SPV_OPCODE_FLAGS_CAPABILITIES, Capability##CAP, { \
1225 SPV_OPERAND_TYPE_NONE \
1226 } \
1227 }
1228
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001229static const spv_operand_desc_t capabilityInfoEntries[] = {
David Netod30b2332015-09-23 16:04:24 -04001230 CASE(Matrix),
1231 CASE_CAP(Shader, Matrix),
1232 CASE_CAP(Geometry, Shader),
1233 CASE_CAP(Tessellation, Shader),
1234 CASE(Addresses),
1235 CASE(Linkage),
1236 CASE(Kernel),
1237 CASE_CAP(Vector16, Kernel),
1238 CASE_CAP(Float16Buffer, Kernel),
1239 CASE_CAP(Float16, Float16Buffer),
1240 CASE(Float64),
1241 CASE(Int64),
1242 CASE_CAP(Int64Atomics, Int64),
1243 CASE_CAP(ImageBasic, Kernel),
1244 CASE_CAP(ImageReadWrite, Kernel),
1245 CASE_CAP(ImageMipmap, Kernel),
1246 CASE_CAP(ImageSRGBWrite, Kernel),
1247 CASE_CAP(Pipes, Kernel),
1248 CASE(Groups),
1249 CASE_CAP(DeviceEnqueue, Kernel),
1250 CASE_CAP(LiteralSampler, Kernel),
1251 CASE_CAP(AtomicStorage, Shader),
1252 CASE(Int16),
1253 CASE_CAP(TessellationPointSize, Tessellation),
1254 CASE_CAP(GeometryPointSize, Geometry),
1255 CASE_CAP(ImageGatherExtended, Shader),
1256 CASE_CAP(StorageImageExtendedFormats, Shader),
1257 CASE_CAP(StorageImageMultisample, Shader),
1258 CASE_CAP(UniformBufferArrayDynamicIndexing, Shader),
1259 CASE_CAP(SampledImageArrayDynamicIndexing, Shader),
1260 CASE_CAP(StorageBufferArrayDynamicIndexing, Shader),
1261 CASE_CAP(StorageImageArrayDynamicIndexing, Shader),
1262 CASE_CAP(ClipDistance, Shader),
1263 CASE_CAP(CullDistance, Shader),
1264 CASE_CAP(ImageCubeArray, SampledCubeArray),
1265 CASE_CAP(SampleRateShading, Shader),
1266 CASE_CAP(ImageRect, SampledRect),
1267 CASE_CAP(SampledRect, Shader),
1268 CASE_CAP(GenericPointer, Addresses),
1269 CASE_CAP(Int8, Kernel),
1270 CASE_CAP(InputTarget, Shader),
1271 CASE_CAP(SparseResidency, Shader),
1272 CASE_CAP(MinLod, Shader),
1273 CASE_CAP(Sampled1D, Shader),
1274 CASE_CAP(Image1D, Sampled1D),
1275 CASE_CAP(SampledCubeArray, Shader),
1276 CASE_CAP(SampledBuffer, Shader),
1277 CASE_CAP(ImageBuffer, SampledBuffer),
1278 CASE_CAP(ImageMSArray, Shader),
1279 CASE_CAP(AdvancedFormats, Shader),
1280 CASE_CAP(ImageQuery, Shader),
1281 CASE_CAP(DerivativeControl, Shader),
1282 CASE_CAP(InterpolationFunction, Shader),
1283 CASE_CAP(TransformFeedback, Shader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001284};
David Netod30b2332015-09-23 16:04:24 -04001285#undef CASE
1286#undef CASE_CAP
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001287
1288static const spv_operand_desc_group_t opcodeEntryTypes[] = {
1289 {SPV_OPERAND_TYPE_SOURCE_LANGUAGE,
1290 sizeof(sourceLanguageEntries) / sizeof(spv_operand_desc_t),
1291 sourceLanguageEntries},
1292 {SPV_OPERAND_TYPE_EXECUTION_MODEL,
1293 sizeof(executionModelEntries) / sizeof(spv_operand_desc_t),
1294 executionModelEntries},
1295 {SPV_OPERAND_TYPE_ADDRESSING_MODEL,
1296 sizeof(addressingModelEntries) / sizeof(spv_operand_desc_t),
1297 addressingModelEntries},
1298 {SPV_OPERAND_TYPE_MEMORY_MODEL,
1299 sizeof(memoryModelEntries) / sizeof(spv_operand_desc_t),
1300 memoryModelEntries},
1301 {SPV_OPERAND_TYPE_EXECUTION_MODE,
1302 sizeof(executionModeEntries) / sizeof(spv_operand_desc_t),
1303 executionModeEntries},
1304 {SPV_OPERAND_TYPE_STORAGE_CLASS,
1305 sizeof(storageClassEntries) / sizeof(spv_operand_desc_t),
1306 storageClassEntries},
1307 {SPV_OPERAND_TYPE_DIMENSIONALITY,
1308 sizeof(dimensionalityEntries) / sizeof(spv_operand_desc_t),
1309 dimensionalityEntries},
1310 {SPV_OPERAND_TYPE_SAMPLER_ADDRESSING_MODE,
1311 sizeof(samplerAddressingModeEntries) / sizeof(spv_operand_desc_t),
1312 samplerAddressingModeEntries},
1313 {SPV_OPERAND_TYPE_SAMPLER_FILTER_MODE,
1314 sizeof(samplerFilterModeEntries) / sizeof(spv_operand_desc_t),
1315 samplerFilterModeEntries},
David Netob30a0c52015-09-16 15:56:43 -04001316 {SPV_OPERAND_TYPE_SAMPLER_IMAGE_FORMAT,
1317 sizeof(samplerImageFormatEntries) / sizeof(spv_operand_desc_t),
1318 samplerImageFormatEntries},
David Netoee1b3bb2015-09-18 11:19:18 -04001319 {SPV_OPERAND_TYPE_OPTIONAL_IMAGE,
1320 sizeof(imageOperandEntries) / sizeof(spv_operand_desc_t),
1321 imageOperandEntries},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001322 {SPV_OPERAND_TYPE_FP_FAST_MATH_MODE,
1323 sizeof(fpFastMathModeEntries) / sizeof(spv_operand_desc_t),
1324 fpFastMathModeEntries},
1325 {SPV_OPERAND_TYPE_FP_ROUNDING_MODE,
1326 sizeof(fpRoundingModeEntries) / sizeof(spv_operand_desc_t),
1327 fpRoundingModeEntries},
1328 {SPV_OPERAND_TYPE_LINKAGE_TYPE,
1329 sizeof(linkageTypeEntries) / sizeof(spv_operand_desc_t),
1330 linkageTypeEntries},
1331 {SPV_OPERAND_TYPE_ACCESS_QUALIFIER,
1332 sizeof(accessQualifierEntries) / sizeof(spv_operand_desc_t),
1333 accessQualifierEntries},
1334 {SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE,
1335 sizeof(functionParameterAttributeEntries) / sizeof(spv_operand_desc_t),
1336 functionParameterAttributeEntries},
1337 {SPV_OPERAND_TYPE_DECORATION,
1338 sizeof(decorationEntries) / sizeof(spv_operand_desc_t), decorationEntries},
1339 {SPV_OPERAND_TYPE_BUILT_IN,
1340 sizeof(builtInEntries) / sizeof(spv_operand_desc_t), builtInEntries},
1341 {SPV_OPERAND_TYPE_SELECTION_CONTROL,
1342 sizeof(selectionControlEntries) / sizeof(spv_operand_desc_t),
1343 selectionControlEntries},
1344 {SPV_OPERAND_TYPE_LOOP_CONTROL,
1345 sizeof(loopControlEntries) / sizeof(spv_operand_desc_t),
1346 loopControlEntries},
1347 {SPV_OPERAND_TYPE_FUNCTION_CONTROL,
1348 sizeof(functionControlEntries) / sizeof(spv_operand_desc_t),
1349 functionControlEntries},
1350 {SPV_OPERAND_TYPE_MEMORY_SEMANTICS,
1351 sizeof(memorySemanticsEntries) / sizeof(spv_operand_desc_t),
1352 memorySemanticsEntries},
David Neto78c3b432015-08-27 13:03:52 -04001353 {SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001354 sizeof(memoryAccessEntries) / sizeof(spv_operand_desc_t),
1355 memoryAccessEntries},
1356 {SPV_OPERAND_TYPE_EXECUTION_SCOPE,
1357 sizeof(scopeEntries) / sizeof(spv_operand_desc_t), scopeEntries},
1358 {SPV_OPERAND_TYPE_GROUP_OPERATION,
1359 sizeof(groupOperationEntries) / sizeof(spv_operand_desc_t),
1360 groupOperationEntries},
1361 {SPV_OPERAND_TYPE_KERNEL_ENQ_FLAGS,
1362 sizeof(kernelKernelEnqueueFlagssEntries) / sizeof(spv_operand_desc_t),
1363 kernelKernelEnqueueFlagssEntries},
David Neto47994822015-08-27 13:11:01 -04001364 {SPV_OPERAND_TYPE_KERNEL_PROFILING_INFO,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001365 sizeof(kernelProfilingInfoEntries) / sizeof(spv_operand_desc_t),
1366 kernelProfilingInfoEntries},
1367 {SPV_OPERAND_TYPE_CAPABILITY,
1368 sizeof(capabilityInfoEntries) / sizeof(spv_operand_desc_t),
1369 capabilityInfoEntries},
1370};
1371
Dejan Mircevski50babb22015-09-29 10:56:32 -04001372spv_result_t spvOperandTableGet(spv_operand_table* pOperandTable) {
Lei Zhang40056702015-09-11 14:31:27 -04001373 if (!pOperandTable) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001374
1375 static const spv_operand_table_t table = {
1376 sizeof(opcodeEntryTypes) / sizeof(spv_operand_desc_group_t),
1377 opcodeEntryTypes};
1378
1379 *pOperandTable = &table;
1380
1381 return SPV_SUCCESS;
1382}
1383
1384spv_result_t spvOperandTableNameLookup(const spv_operand_table table,
1385 const spv_operand_type_t type,
David Neto388c40d2015-09-16 16:42:56 -04001386 const char* name,
1387 const size_t nameLength,
1388 spv_operand_desc* pEntry) {
Lei Zhang40056702015-09-11 14:31:27 -04001389 if (!table) return SPV_ERROR_INVALID_TABLE;
1390 if (!name || !pEntry) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001391
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001392 for (uint64_t typeIndex = 0; typeIndex < table->count; ++typeIndex) {
1393 if (type == table->types[typeIndex].type) {
1394 for (uint64_t operandIndex = 0;
1395 operandIndex < table->types[typeIndex].count; ++operandIndex) {
1396 if (nameLength ==
1397 strlen(table->types[typeIndex].entries[operandIndex].name) &&
1398 !strncmp(table->types[typeIndex].entries[operandIndex].name, name,
David Neto388c40d2015-09-16 16:42:56 -04001399 nameLength)) {
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001400 *pEntry = &table->types[typeIndex].entries[operandIndex];
1401 return SPV_SUCCESS;
1402 }
1403 }
1404 }
1405 }
1406
1407 return SPV_ERROR_INVALID_LOOKUP;
1408}
1409
1410spv_result_t spvOperandTableValueLookup(const spv_operand_table table,
1411 const spv_operand_type_t type,
1412 const uint32_t value,
Dejan Mircevski50babb22015-09-29 10:56:32 -04001413 spv_operand_desc* pEntry) {
Lei Zhang40056702015-09-11 14:31:27 -04001414 if (!table) return SPV_ERROR_INVALID_TABLE;
1415 if (!pEntry) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001416
1417 for (uint64_t typeIndex = 0; typeIndex < table->count; ++typeIndex) {
1418 if (type == table->types[typeIndex].type) {
1419 for (uint64_t operandIndex = 0;
1420 operandIndex < table->types[typeIndex].count; ++operandIndex) {
1421 if (value == table->types[typeIndex].entries[operandIndex].value) {
1422 *pEntry = &table->types[typeIndex].entries[operandIndex];
1423 return SPV_SUCCESS;
1424 }
1425 }
1426 }
1427 }
1428
1429 return SPV_ERROR_INVALID_LOOKUP;
1430}
1431
Dejan Mircevski50babb22015-09-29 10:56:32 -04001432const char* spvOperandTypeStr(spv_operand_type_t type) {
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001433 switch (type) {
1434 case SPV_OPERAND_TYPE_ID:
David Netofadbf622015-09-14 17:07:11 -04001435 case SPV_OPERAND_TYPE_OPTIONAL_ID:
1436 case SPV_OPERAND_TYPE_ID_IN_OPTIONAL_TUPLE:
1437 return "ID";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001438 case SPV_OPERAND_TYPE_RESULT_ID:
1439 return "result ID";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001440 case SPV_OPERAND_TYPE_LITERAL_NUMBER:
1441 return "literal number";
Lei Zhangb41d1502015-09-14 15:22:23 -04001442 case SPV_OPERAND_TYPE_MULTIWORD_LITERAL_NUMBER:
1443 return "multiple word literal number";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001444 case SPV_OPERAND_TYPE_LITERAL_STRING:
1445 return "literal string";
1446 case SPV_OPERAND_TYPE_SOURCE_LANGUAGE:
1447 return "source langauge";
1448 case SPV_OPERAND_TYPE_EXECUTION_MODEL:
1449 return "execution model";
1450 case SPV_OPERAND_TYPE_ADDRESSING_MODEL:
1451 return "addressing model";
1452 case SPV_OPERAND_TYPE_MEMORY_MODEL:
1453 return "memory model";
1454 case SPV_OPERAND_TYPE_EXECUTION_MODE:
1455 return "execution mode";
1456 case SPV_OPERAND_TYPE_STORAGE_CLASS:
1457 return "storage class";
1458 case SPV_OPERAND_TYPE_DIMENSIONALITY:
1459 return "dimensionality";
1460 case SPV_OPERAND_TYPE_SAMPLER_ADDRESSING_MODE:
1461 return "addressing mode";
1462 case SPV_OPERAND_TYPE_SAMPLER_FILTER_MODE:
1463 return "sampler filter mode";
David Netob30a0c52015-09-16 15:56:43 -04001464 case SPV_OPERAND_TYPE_SAMPLER_IMAGE_FORMAT:
1465 return "sampler image format";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001466 case SPV_OPERAND_TYPE_FP_FAST_MATH_MODE:
1467 return "floating pointer fast math mode";
1468 case SPV_OPERAND_TYPE_FP_ROUNDING_MODE:
1469 return "floating point rounding mode";
1470 case SPV_OPERAND_TYPE_LINKAGE_TYPE:
1471 return "linkage type";
1472 case SPV_OPERAND_TYPE_ACCESS_QUALIFIER:
1473 return "access qualifier";
1474 case SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE:
1475 return "function parameter attribute";
1476 case SPV_OPERAND_TYPE_DECORATION:
1477 return "decoration";
1478 case SPV_OPERAND_TYPE_BUILT_IN:
1479 return "built in";
1480 case SPV_OPERAND_TYPE_SELECTION_CONTROL:
1481 return "selection control";
1482 case SPV_OPERAND_TYPE_LOOP_CONTROL:
1483 return "loop control";
1484 case SPV_OPERAND_TYPE_FUNCTION_CONTROL:
1485 return "function control";
1486 case SPV_OPERAND_TYPE_MEMORY_SEMANTICS:
1487 return "memory semantics";
David Neto78c3b432015-08-27 13:03:52 -04001488 case SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001489 return "memory access";
1490 case SPV_OPERAND_TYPE_EXECUTION_SCOPE:
David Netofadbf622015-09-14 17:07:11 -04001491 return "execution scope ID";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001492 case SPV_OPERAND_TYPE_GROUP_OPERATION:
1493 return "group operation";
1494 case SPV_OPERAND_TYPE_KERNEL_ENQ_FLAGS:
1495 return "kernel enqeue flags";
David Neto47994822015-08-27 13:11:01 -04001496 case SPV_OPERAND_TYPE_KERNEL_PROFILING_INFO:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001497 return "kernel profiling info";
1498 case SPV_OPERAND_TYPE_CAPABILITY:
1499 return "capability";
David Netoee1b3bb2015-09-18 11:19:18 -04001500 case SPV_OPERAND_TYPE_OPTIONAL_IMAGE:
1501 return "image operand";
David Neto78c3b432015-08-27 13:03:52 -04001502 case SPV_OPERAND_TYPE_NONE:
1503 return "NONE";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001504 default:
1505 assert(0 && "Unhandled operand type!");
1506 break;
1507 }
1508 return "unknown";
1509}
David Neto78c3b432015-08-27 13:03:52 -04001510
1511void spvPrependOperandTypes(const spv_operand_type_t* types,
1512 spv_operand_pattern_t* pattern) {
1513 const spv_operand_type_t* endTypes;
Dejan Mircevski50babb22015-09-29 10:56:32 -04001514 for (endTypes = types; *endTypes != SPV_OPERAND_TYPE_NONE; ++endTypes)
David Neto78c3b432015-08-27 13:03:52 -04001515 ;
1516 pattern->insert(pattern->begin(), types, endTypes);
1517}
1518
David Neto5bf88fc2015-09-17 17:06:10 -04001519void spvPrependOperandTypesForMask(const spv_operand_table operandTable,
1520 const spv_operand_type_t type,
1521 const uint32_t mask,
1522 spv_operand_pattern_t* pattern) {
1523 // Scan from highest bits to lowest bits because we will prepend in LIFO
1524 // fashion, and we need the operands for lower order bits to appear first.
1525 for (uint32_t candidate_bit = (1 << 31); candidate_bit; candidate_bit >>= 1) {
1526 if (candidate_bit & mask) {
1527 spv_operand_desc entry = nullptr;
1528 if (SPV_SUCCESS == spvOperandTableValueLookup(operandTable, type,
1529 candidate_bit, &entry)) {
1530 spvPrependOperandTypes(entry->operandTypes, pattern);
1531 }
1532 }
1533 }
1534}
1535
David Neto78c3b432015-08-27 13:03:52 -04001536bool spvOperandIsOptional(spv_operand_type_t type) {
1537 // Variable means zero or more times.
Dejan Mircevski50babb22015-09-29 10:56:32 -04001538 if (spvOperandIsVariable(type)) return true;
David Neto78c3b432015-08-27 13:03:52 -04001539
1540 switch (type) {
1541 case SPV_OPERAND_TYPE_OPTIONAL_ID:
1542 case SPV_OPERAND_TYPE_OPTIONAL_IMAGE:
David Neto561dc4e2015-09-25 14:23:29 -04001543 case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_NUMBER:
David Neto78c3b432015-08-27 13:03:52 -04001544 case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_STRING:
1545 case SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS:
1546 case SPV_OPERAND_TYPE_OPTIONAL_EXECUTION_MODE:
Dejan Mircevski903f9d62015-09-28 17:04:39 -04001547 case SPV_OPERAND_TYPE_OPTIONAL_CIV:
David Neto78c3b432015-08-27 13:03:52 -04001548 return true;
1549 default:
1550 break;
1551 }
1552 return false;
1553}
1554
1555bool spvOperandIsVariable(spv_operand_type_t type) {
1556 switch (type) {
1557 case SPV_OPERAND_TYPE_VARIABLE_ID:
David Neto561dc4e2015-09-25 14:23:29 -04001558 case SPV_OPERAND_TYPE_VARIABLE_LITERAL_NUMBER:
1559 case SPV_OPERAND_TYPE_VARIABLE_ID_LITERAL_NUMBER:
1560 case SPV_OPERAND_TYPE_VARIABLE_LITERAL_NUMBER_ID:
David Neto78c3b432015-08-27 13:03:52 -04001561 case SPV_OPERAND_TYPE_VARIABLE_EXECUTION_MODE:
1562 return true;
1563 default:
1564 break;
1565 }
1566 return false;
1567}
1568
David Neto78c3b432015-08-27 13:03:52 -04001569bool spvExpandOperandSequenceOnce(spv_operand_type_t type,
1570 spv_operand_pattern_t* pattern) {
1571 switch (type) {
1572 case SPV_OPERAND_TYPE_VARIABLE_ID:
1573 pattern->insert(pattern->begin(), {SPV_OPERAND_TYPE_OPTIONAL_ID, type});
1574 return true;
David Neto561dc4e2015-09-25 14:23:29 -04001575 case SPV_OPERAND_TYPE_VARIABLE_LITERAL_NUMBER:
David Neto78c3b432015-08-27 13:03:52 -04001576 pattern->insert(pattern->begin(),
David Neto561dc4e2015-09-25 14:23:29 -04001577 {SPV_OPERAND_TYPE_OPTIONAL_LITERAL_NUMBER, type});
David Neto78c3b432015-08-27 13:03:52 -04001578 return true;
David Neto561dc4e2015-09-25 14:23:29 -04001579 case SPV_OPERAND_TYPE_VARIABLE_LITERAL_NUMBER_ID:
1580 // Represents Zero or more (Literal number, Id) pairs.
David Neto78c3b432015-08-27 13:03:52 -04001581 pattern->insert(pattern->begin(),
David Neto561dc4e2015-09-25 14:23:29 -04001582 {SPV_OPERAND_TYPE_OPTIONAL_LITERAL_NUMBER,
David Neto78c3b432015-08-27 13:03:52 -04001583 SPV_OPERAND_TYPE_ID_IN_OPTIONAL_TUPLE, type});
1584 return true;
David Neto561dc4e2015-09-25 14:23:29 -04001585 case SPV_OPERAND_TYPE_VARIABLE_ID_LITERAL_NUMBER:
1586 // Represents Zero or more (Id, Literal number) pairs.
Dejan Mircevski50babb22015-09-29 10:56:32 -04001587 pattern->insert(
1588 pattern->begin(),
1589 {SPV_OPERAND_TYPE_OPTIONAL_ID,
1590 SPV_OPERAND_TYPE_LITERAL_NUMBER_IN_OPTIONAL_TUPLE, type});
David Neto78c3b432015-08-27 13:03:52 -04001591 return true;
David Neto78c3b432015-08-27 13:03:52 -04001592 case SPV_OPERAND_TYPE_VARIABLE_EXECUTION_MODE:
Dejan Mircevski50babb22015-09-29 10:56:32 -04001593 pattern->insert(pattern->begin(),
1594 {SPV_OPERAND_TYPE_OPTIONAL_EXECUTION_MODE, type});
David Neto78c3b432015-08-27 13:03:52 -04001595 return true;
1596 default:
1597 break;
1598 }
1599 return false;
1600}
1601
Dejan Mircevski50babb22015-09-29 10:56:32 -04001602spv_operand_type_t spvTakeFirstMatchableOperand(
1603 spv_operand_pattern_t* pattern) {
David Neto78c3b432015-08-27 13:03:52 -04001604 assert(!pattern->empty());
1605 spv_operand_type_t result;
1606 do {
1607 result = pattern->front();
1608 pattern->pop_front();
Dejan Mircevski50babb22015-09-29 10:56:32 -04001609 } while (spvExpandOperandSequenceOnce(result, pattern));
David Neto78c3b432015-08-27 13:03:52 -04001610 return result;
1611}
Dejan Mircevski903f9d62015-09-28 17:04:39 -04001612
Dejan Mircevski897bff92015-09-29 10:38:18 -04001613spv_operand_pattern_t spvAlternatePatternFollowingImmediate(
1614 const spv_operand_pattern_t& pattern) {
1615 spv_operand_pattern_t alternatePattern;
1616 for (const auto& operand : pattern) {
1617 if (operand == SPV_OPERAND_TYPE_RESULT_ID) {
1618 alternatePattern.push_back(operand);
1619 alternatePattern.push_back(SPV_OPERAND_TYPE_OPTIONAL_CIV);
1620 return alternatePattern;
Dejan Mircevski903f9d62015-09-28 17:04:39 -04001621 }
Dejan Mircevski897bff92015-09-29 10:38:18 -04001622 alternatePattern.push_back(SPV_OPERAND_TYPE_OPTIONAL_CIV);
Dejan Mircevski903f9d62015-09-28 17:04:39 -04001623 }
Dejan Mircevski897bff92015-09-29 10:38:18 -04001624 // No result-id found, so just expect CIVs.
1625 return {SPV_OPERAND_TYPE_OPTIONAL_CIV};
Dejan Mircevski903f9d62015-09-28 17:04:39 -04001626}