blob: 3640a7accb87b581119239f46577b5831033ccf3 [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[] = {
David Neto5494dd42015-09-15 16:41:38 -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[] = {
David Netoaa0c3a52015-09-23 10:30:06 -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 }
340 // clang-format off
341 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),
381 // clang-format on
382#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 {
548 "SpecId",
549 DecorationSpecId,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100550 SPV_OPCODE_FLAGS_CAPABILITIES,
551 CapabilityShader,
Lei Zhang604e5ce2015-08-14 14:46:43 -0400552 {SPV_OPERAND_TYPE_LITERAL_NUMBER},
553 },
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,
David Neto55bdfcb2015-09-10 15:51:57 -0400748 {SPV_OPERAND_TYPE_LITERAL_STRING, SPV_OPERAND_TYPE_LINKAGE_TYPE, SPV_OPERAND_TYPE_NONE}},
David Netod7687982015-09-23 14:59:27 -0400749 {"NoContraction",
750 DecorationNoContraction,
751 SPV_OPCODE_FLAGS_CAPABILITIES,
752 CapabilityShader,
753 {SPV_OPERAND_TYPE_NONE}},
754 {"InputTargetIndex",
755 DecorationInputTargetIndex,
756 SPV_OPCODE_FLAGS_CAPABILITIES,
757 CapabilityShader, // TODO(dneto): Should this be CapabilityInputTarget?
758 {SPV_OPERAND_TYPE_NONE}}, // TODO(dneto): Should this have a literal number argument?
759 {"Alignment",
760 DecorationAlignment,
761 SPV_OPCODE_FLAGS_CAPABILITIES,
762 CapabilityKernel,
763 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100764};
765
766static const spv_operand_desc_t builtInEntries[] = {
767 {"Position",
768 BuiltInPosition,
769 SPV_OPCODE_FLAGS_CAPABILITIES,
770 CapabilityShader,
771 {SPV_OPERAND_TYPE_NONE}},
772 {"PointSize",
773 BuiltInPointSize,
774 SPV_OPCODE_FLAGS_CAPABILITIES,
775 CapabilityShader,
776 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100777 {"ClipDistance",
778 BuiltInClipDistance,
779 SPV_OPCODE_FLAGS_CAPABILITIES,
780 CapabilityShader,
781 {SPV_OPERAND_TYPE_NONE}},
782 {"CullDistance",
783 BuiltInCullDistance,
784 SPV_OPCODE_FLAGS_CAPABILITIES,
785 CapabilityShader,
786 {SPV_OPERAND_TYPE_NONE}},
787 {"VertexId",
788 BuiltInVertexId,
789 SPV_OPCODE_FLAGS_CAPABILITIES,
790 CapabilityShader,
791 {SPV_OPERAND_TYPE_NONE}},
792 {"InstanceId",
793 BuiltInInstanceId,
794 SPV_OPCODE_FLAGS_CAPABILITIES,
795 CapabilityShader,
796 {SPV_OPERAND_TYPE_NONE}},
797 {"PrimitiveId",
798 BuiltInPrimitiveId,
799 SPV_OPCODE_FLAGS_CAPABILITIES,
800 CapabilityGeometry | CapabilityTessellation,
801 {SPV_OPERAND_TYPE_NONE}},
802 {"InvocationId",
803 BuiltInInvocationId,
804 SPV_OPCODE_FLAGS_CAPABILITIES,
805 CapabilityGeometry | CapabilityTessellation,
806 {SPV_OPERAND_TYPE_NONE}},
807 {"Layer",
808 BuiltInLayer,
809 SPV_OPCODE_FLAGS_CAPABILITIES,
810 CapabilityGeometry,
811 {SPV_OPERAND_TYPE_NONE}},
812 {"ViewportIndex",
813 BuiltInViewportIndex,
814 SPV_OPCODE_FLAGS_CAPABILITIES,
815 CapabilityGeometry,
816 {SPV_OPERAND_TYPE_NONE}},
817 {"TessLevelOuter",
818 BuiltInTessLevelOuter,
819 SPV_OPCODE_FLAGS_CAPABILITIES,
820 CapabilityTessellation,
821 {SPV_OPERAND_TYPE_NONE}},
822 {"TessLevelInner",
823 BuiltInTessLevelInner,
824 SPV_OPCODE_FLAGS_CAPABILITIES,
825 CapabilityTessellation,
826 {SPV_OPERAND_TYPE_NONE}},
827 {"TessCoord",
828 BuiltInTessCoord,
829 SPV_OPCODE_FLAGS_CAPABILITIES,
830 CapabilityTessellation,
831 {SPV_OPERAND_TYPE_NONE}},
832 {"PatchVertices",
833 BuiltInPatchVertices,
834 SPV_OPCODE_FLAGS_CAPABILITIES,
835 CapabilityTessellation,
836 {SPV_OPERAND_TYPE_NONE}},
837 {"FragCoord",
838 BuiltInFragCoord,
839 SPV_OPCODE_FLAGS_CAPABILITIES,
840 CapabilityShader,
841 {SPV_OPERAND_TYPE_NONE}},
842 {"PointCoord",
843 BuiltInPointCoord,
844 SPV_OPCODE_FLAGS_CAPABILITIES,
845 CapabilityShader,
846 {SPV_OPERAND_TYPE_NONE}},
847 {"FrontFacing",
848 BuiltInFrontFacing,
849 SPV_OPCODE_FLAGS_CAPABILITIES,
850 CapabilityShader,
851 {SPV_OPERAND_TYPE_NONE}},
852 {"SampleId",
853 BuiltInSampleId,
854 SPV_OPCODE_FLAGS_CAPABILITIES,
855 CapabilityShader,
856 {SPV_OPERAND_TYPE_NONE}},
857 {"SamplePosition",
858 BuiltInSamplePosition,
859 SPV_OPCODE_FLAGS_CAPABILITIES,
860 CapabilityShader,
861 {SPV_OPERAND_TYPE_NONE}},
862 {"SampleMask",
863 BuiltInSampleMask,
864 SPV_OPCODE_FLAGS_CAPABILITIES,
865 CapabilityShader,
866 {SPV_OPERAND_TYPE_NONE}},
867 {"FragColor",
868 BuiltInFragColor,
869 SPV_OPCODE_FLAGS_CAPABILITIES,
870 CapabilityShader,
871 {SPV_OPERAND_TYPE_NONE}},
872 {"FragDepth",
873 BuiltInFragDepth,
874 SPV_OPCODE_FLAGS_CAPABILITIES,
875 CapabilityShader,
876 {SPV_OPERAND_TYPE_NONE}},
877 {"HelperInvocation",
878 BuiltInHelperInvocation,
879 SPV_OPCODE_FLAGS_CAPABILITIES,
880 CapabilityShader,
881 {SPV_OPERAND_TYPE_NONE}},
882 {"NumWorkgroups",
883 BuiltInNumWorkgroups,
884 SPV_OPCODE_FLAGS_NONE,
885 0,
886 {SPV_OPERAND_TYPE_NONE}},
887 {"WorkgroupSize",
888 BuiltInWorkgroupSize,
889 SPV_OPCODE_FLAGS_NONE,
890 0,
891 {SPV_OPERAND_TYPE_NONE}},
892 {"WorkgroupId",
893 BuiltInWorkgroupId,
894 SPV_OPCODE_FLAGS_NONE,
895 0,
896 {SPV_OPERAND_TYPE_NONE}},
897 {"LocalInvocationId",
898 BuiltInLocalInvocationId,
899 SPV_OPCODE_FLAGS_NONE,
900 0,
901 {SPV_OPERAND_TYPE_NONE}},
902 {"GlobalInvocationId",
903 BuiltInGlobalInvocationId,
904 SPV_OPCODE_FLAGS_NONE,
905 0,
906 {SPV_OPERAND_TYPE_NONE}},
907 {"LocalInvocationIndex",
David Neto37547b22015-09-10 13:23:11 -0400908 BuiltInLocalInvocationIndex,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100909 SPV_OPCODE_FLAGS_CAPABILITIES,
910 CapabilityShader,
911 {SPV_OPERAND_TYPE_NONE}},
912 {"WorkDim",
913 BuiltInWorkDim,
914 SPV_OPCODE_FLAGS_CAPABILITIES,
915 CapabilityKernel,
916 {SPV_OPERAND_TYPE_NONE}},
917 {"GlobalSize",
918 BuiltInGlobalSize,
919 SPV_OPCODE_FLAGS_CAPABILITIES,
920 CapabilityKernel,
921 {SPV_OPERAND_TYPE_NONE}},
922 {"EnqueuedWorkgroupSize",
923 BuiltInEnqueuedWorkgroupSize,
924 SPV_OPCODE_FLAGS_CAPABILITIES,
925 CapabilityKernel,
926 {SPV_OPERAND_TYPE_NONE}},
927 {"GlobalOffset",
928 BuiltInGlobalOffset,
929 SPV_OPCODE_FLAGS_CAPABILITIES,
930 CapabilityKernel,
931 {SPV_OPERAND_TYPE_NONE}},
932 {"GlobalLinearId",
933 BuiltInGlobalLinearId,
934 SPV_OPCODE_FLAGS_CAPABILITIES,
935 CapabilityKernel,
936 {SPV_OPERAND_TYPE_NONE}},
937 {"WorkgroupLinearId",
938 BuiltInWorkgroupLinearId,
939 SPV_OPCODE_FLAGS_CAPABILITIES,
940 CapabilityKernel,
941 {SPV_OPERAND_TYPE_NONE}},
942 {"SubgroupSize",
943 BuiltInSubgroupSize,
944 SPV_OPCODE_FLAGS_CAPABILITIES,
945 CapabilityKernel,
946 {SPV_OPERAND_TYPE_NONE}},
947 {"SubgroupMaxSize",
948 BuiltInSubgroupMaxSize,
949 SPV_OPCODE_FLAGS_CAPABILITIES,
950 CapabilityKernel,
951 {SPV_OPERAND_TYPE_NONE}},
952 {"NumSubgroups",
953 BuiltInNumSubgroups,
954 SPV_OPCODE_FLAGS_CAPABILITIES,
955 CapabilityKernel,
956 {SPV_OPERAND_TYPE_NONE}},
957 {"NumEnqueuedSubgroups",
958 BuiltInNumEnqueuedSubgroups,
959 SPV_OPCODE_FLAGS_CAPABILITIES,
960 CapabilityKernel,
961 {SPV_OPERAND_TYPE_NONE}},
962 {"SubgroupId",
David Neto37547b22015-09-10 13:23:11 -0400963 BuiltInSubgroupId,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100964 SPV_OPCODE_FLAGS_CAPABILITIES,
965 CapabilityKernel,
966 {SPV_OPERAND_TYPE_NONE}},
967 {"SubgroupLocalInvocationId",
968 BuiltInSubgroupLocalInvocationId,
969 SPV_OPCODE_FLAGS_CAPABILITIES,
970 CapabilityKernel,
971 {SPV_OPERAND_TYPE_NONE}},
David Neto2d1b5e52015-09-23 15:35:27 -0400972 {"VertexIndex",
973 BuiltInVertexIndex,
974 SPV_OPCODE_FLAGS_CAPABILITIES,
975 CapabilityShader,
976 {SPV_OPERAND_TYPE_NONE}},
977 {"InstanceIndex",
978 BuiltInInstanceIndex,
979 SPV_OPCODE_FLAGS_CAPABILITIES,
980 CapabilityShader,
981 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100982};
983
984static const spv_operand_desc_t selectionControlEntries[] = {
985 {"None",
986 SelectionControlMaskNone,
987 SPV_OPCODE_FLAGS_NONE,
988 0,
989 {SPV_OPERAND_TYPE_NONE}},
990 {"Flatten",
991 SelectionControlFlattenMask,
992 SPV_OPCODE_FLAGS_NONE,
993 0,
994 {SPV_OPERAND_TYPE_NONE}},
995 {"DontFlatten",
996 SelectionControlDontFlattenMask,
997 SPV_OPCODE_FLAGS_NONE,
998 0,
999 {SPV_OPERAND_TYPE_NONE}},
1000};
1001
1002static const spv_operand_desc_t loopControlEntries[] = {
1003 {"None",
1004 LoopControlMaskNone,
1005 SPV_OPCODE_FLAGS_NONE,
1006 0,
1007 {SPV_OPERAND_TYPE_NONE}},
1008 {"Unroll",
1009 LoopControlUnrollMask,
1010 SPV_OPCODE_FLAGS_NONE,
1011 0,
1012 {SPV_OPERAND_TYPE_NONE}},
1013 {"DontUnroll",
1014 LoopControlDontUnrollMask,
1015 SPV_OPCODE_FLAGS_NONE,
1016 0,
1017 {SPV_OPERAND_TYPE_NONE}},
1018};
1019
1020static const spv_operand_desc_t functionControlEntries[] = {
1021 {"None",
1022 FunctionControlMaskNone,
1023 SPV_OPCODE_FLAGS_NONE,
1024 0,
1025 {SPV_OPERAND_TYPE_NONE}},
David Netof4fde6c2015-09-14 14:50:37 -04001026 {"Inline",
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001027 FunctionControlInlineMask,
1028 SPV_OPCODE_FLAGS_NONE,
1029 0,
1030 {SPV_OPERAND_TYPE_NONE}},
1031 {"DontInline",
1032 FunctionControlDontInlineMask,
1033 SPV_OPCODE_FLAGS_NONE,
1034 0,
1035 {SPV_OPERAND_TYPE_NONE}},
1036 {"Pure",
1037 FunctionControlPureMask,
1038 SPV_OPCODE_FLAGS_NONE,
1039 0,
1040 {SPV_OPERAND_TYPE_NONE}},
1041 {"Const",
1042 FunctionControlConstMask,
1043 SPV_OPCODE_FLAGS_NONE,
1044 0,
1045 {SPV_OPERAND_TYPE_NONE}},
1046};
1047
1048static const spv_operand_desc_t memorySemanticsEntries[] = {
1049 {"None",
1050 MemorySemanticsMaskNone,
1051 SPV_OPCODE_FLAGS_NONE,
1052 0,
1053 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001054 {"SequentiallyConsistent",
1055 MemorySemanticsSequentiallyConsistentMask,
1056 SPV_OPCODE_FLAGS_NONE,
1057 0,
1058 {SPV_OPERAND_TYPE_NONE}},
1059 {"Acquire",
1060 MemorySemanticsAcquireMask,
1061 SPV_OPCODE_FLAGS_NONE,
1062 0,
1063 {SPV_OPERAND_TYPE_NONE}},
1064 {"Release",
1065 MemorySemanticsReleaseMask,
1066 SPV_OPCODE_FLAGS_NONE,
1067 0,
1068 {SPV_OPERAND_TYPE_NONE}},
1069 {"UniformMemory",
1070 MemorySemanticsUniformMemoryMask,
1071 SPV_OPCODE_FLAGS_CAPABILITIES,
1072 CapabilityShader,
1073 {SPV_OPERAND_TYPE_NONE}},
1074 {"SubgroupMemory",
1075 MemorySemanticsSubgroupMemoryMask,
1076 SPV_OPCODE_FLAGS_NONE,
1077 0,
1078 {SPV_OPERAND_TYPE_NONE}},
1079 {"WorkgroupLocalMemory",
1080 MemorySemanticsWorkgroupLocalMemoryMask,
1081 SPV_OPCODE_FLAGS_NONE,
1082 0,
1083 {SPV_OPERAND_TYPE_NONE}},
1084 {"WorkgroupGlobalMemory",
1085 MemorySemanticsWorkgroupGlobalMemoryMask,
1086 SPV_OPCODE_FLAGS_NONE,
1087 0,
1088 {SPV_OPERAND_TYPE_NONE}},
1089 {"AtomicCounterMemory",
1090 MemorySemanticsAtomicCounterMemoryMask,
1091 SPV_OPCODE_FLAGS_CAPABILITIES,
1092 CapabilityShader,
1093 {SPV_OPERAND_TYPE_NONE}},
1094 {
1095 "ImageMemory",
1096 MemorySemanticsImageMemoryMask,
1097 SPV_OPCODE_FLAGS_NONE,
1098 0,
1099 {SPV_OPERAND_TYPE_NONE},
1100 },
1101};
1102
1103static const spv_operand_desc_t memoryAccessEntries[] = {
1104 {"None",
1105 MemoryAccessMaskNone,
1106 SPV_OPCODE_FLAGS_NONE,
1107 0,
1108 {SPV_OPERAND_TYPE_NONE}},
1109 {"Volatile",
1110 MemoryAccessVolatileMask,
1111 SPV_OPCODE_FLAGS_NONE,
1112 0,
1113 {SPV_OPERAND_TYPE_NONE}},
1114 {
1115 "Aligned",
1116 MemoryAccessAlignedMask,
1117 SPV_OPCODE_FLAGS_NONE,
1118 0,
David Neto4a291312015-09-14 15:08:48 -04001119 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001120 },
David Neto49c299b2015-09-23 15:38:59 -04001121 {"Nontemporal",
1122 MemoryAccessNontemporalMask,
1123 SPV_OPCODE_FLAGS_NONE,
1124 0,
1125 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001126};
1127
1128static const spv_operand_desc_t scopeEntries[] = {
1129 {"CrossDevice",
1130 ScopeCrossDevice,
1131 SPV_OPCODE_FLAGS_NONE,
1132 0,
1133 {SPV_OPERAND_TYPE_NONE}},
1134 {"Device", ScopeDevice, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_NONE}},
1135 {"Workgroup",
1136 ScopeWorkgroup,
1137 SPV_OPCODE_FLAGS_NONE,
1138 0,
1139 {SPV_OPERAND_TYPE_NONE}},
1140 {"Subgroup",
1141 ScopeSubgroup,
1142 SPV_OPCODE_FLAGS_NONE,
1143 0,
1144 {SPV_OPERAND_TYPE_NONE}},
1145 {
1146 "Invocation",
1147 ScopeInvocation,
1148 SPV_OPCODE_FLAGS_NONE,
1149 0,
1150 {SPV_OPERAND_TYPE_NONE},
1151 },
1152};
1153
1154static const spv_operand_desc_t groupOperationEntries[] = {
1155 {"Reduce",
1156 GroupOperationReduce,
1157 SPV_OPCODE_FLAGS_CAPABILITIES,
1158 CapabilityKernel,
1159 {SPV_OPERAND_TYPE_NONE}},
1160 {"InclusiveScan",
1161 GroupOperationInclusiveScan,
1162 SPV_OPCODE_FLAGS_CAPABILITIES,
1163 CapabilityKernel,
1164 {SPV_OPERAND_TYPE_NONE}},
1165 {"ExclusiveScan",
1166 GroupOperationExclusiveScan,
1167 SPV_OPCODE_FLAGS_CAPABILITIES,
1168 CapabilityKernel,
1169 {SPV_OPERAND_TYPE_NONE}},
1170};
1171
1172static const spv_operand_desc_t kernelKernelEnqueueFlagssEntries[] = {
1173 {"NoWait",
1174 KernelEnqueueFlagsNoWait,
1175 SPV_OPCODE_FLAGS_CAPABILITIES,
1176 CapabilityKernel,
1177 {SPV_OPERAND_TYPE_NONE}},
1178 {"WaitKernel",
1179 KernelEnqueueFlagsWaitKernel,
1180 SPV_OPCODE_FLAGS_CAPABILITIES,
1181 CapabilityKernel,
1182 {SPV_OPERAND_TYPE_NONE}},
1183 {"WaitWorkGroup",
1184 KernelEnqueueFlagsWaitWorkGroup,
1185 SPV_OPCODE_FLAGS_CAPABILITIES,
1186 CapabilityKernel,
1187 {SPV_OPERAND_TYPE_NONE}},
1188};
1189
1190static const spv_operand_desc_t kernelProfilingInfoEntries[] = {
1191 {"None",
1192 KernelProfilingInfoMaskNone,
1193 SPV_OPCODE_FLAGS_NONE,
1194 0,
1195 {SPV_OPERAND_TYPE_NONE}},
1196 {"CmdExecTime",
1197 KernelProfilingInfoCmdExecTimeMask,
1198 SPV_OPCODE_FLAGS_CAPABILITIES,
1199 CapabilityKernel,
1200 {SPV_OPERAND_TYPE_NONE}},
1201};
1202
David Netod30b2332015-09-23 16:04:24 -04001203// A macro for defining a capability that doesn't depend on another capability.
1204#define CASE(NAME) \
1205 { \
1206 #NAME, Capability##NAME, SPV_OPCODE_FLAGS_NONE, 0, { \
1207 SPV_OPERAND_TYPE_NONE \
1208 } \
1209 }
1210
1211// A macro for defining a capability that depends on another.
1212#define CASE_CAP(NAME, CAP) \
1213 { \
1214 #NAME, Capability##NAME, SPV_OPCODE_FLAGS_CAPABILITIES, Capability##CAP, { \
1215 SPV_OPERAND_TYPE_NONE \
1216 } \
1217 }
1218
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001219static const spv_operand_desc_t capabilityInfoEntries[] = {
David Netod30b2332015-09-23 16:04:24 -04001220 CASE(Matrix),
1221 CASE_CAP(Shader, Matrix),
1222 CASE_CAP(Geometry, Shader),
1223 CASE_CAP(Tessellation, Shader),
1224 CASE(Addresses),
1225 CASE(Linkage),
1226 CASE(Kernel),
1227 CASE_CAP(Vector16, Kernel),
1228 CASE_CAP(Float16Buffer, Kernel),
1229 CASE_CAP(Float16, Float16Buffer),
1230 CASE(Float64),
1231 CASE(Int64),
1232 CASE_CAP(Int64Atomics, Int64),
1233 CASE_CAP(ImageBasic, Kernel),
1234 CASE_CAP(ImageReadWrite, Kernel),
1235 CASE_CAP(ImageMipmap, Kernel),
1236 CASE_CAP(ImageSRGBWrite, Kernel),
1237 CASE_CAP(Pipes, Kernel),
1238 CASE(Groups),
1239 CASE_CAP(DeviceEnqueue, Kernel),
1240 CASE_CAP(LiteralSampler, Kernel),
1241 CASE_CAP(AtomicStorage, Shader),
1242 CASE(Int16),
1243 CASE_CAP(TessellationPointSize, Tessellation),
1244 CASE_CAP(GeometryPointSize, Geometry),
1245 CASE_CAP(ImageGatherExtended, Shader),
1246 CASE_CAP(StorageImageExtendedFormats, Shader),
1247 CASE_CAP(StorageImageMultisample, Shader),
1248 CASE_CAP(UniformBufferArrayDynamicIndexing, Shader),
1249 CASE_CAP(SampledImageArrayDynamicIndexing, Shader),
1250 CASE_CAP(StorageBufferArrayDynamicIndexing, Shader),
1251 CASE_CAP(StorageImageArrayDynamicIndexing, Shader),
1252 CASE_CAP(ClipDistance, Shader),
1253 CASE_CAP(CullDistance, Shader),
1254 CASE_CAP(ImageCubeArray, SampledCubeArray),
1255 CASE_CAP(SampleRateShading, Shader),
1256 CASE_CAP(ImageRect, SampledRect),
1257 CASE_CAP(SampledRect, Shader),
1258 CASE_CAP(GenericPointer, Addresses),
1259 CASE_CAP(Int8, Kernel),
1260 CASE_CAP(InputTarget, Shader),
1261 CASE_CAP(SparseResidency, Shader),
1262 CASE_CAP(MinLod, Shader),
1263 CASE_CAP(Sampled1D, Shader),
1264 CASE_CAP(Image1D, Sampled1D),
1265 CASE_CAP(SampledCubeArray, Shader),
1266 CASE_CAP(SampledBuffer, Shader),
1267 CASE_CAP(ImageBuffer, SampledBuffer),
1268 CASE_CAP(ImageMSArray, Shader),
1269 CASE_CAP(AdvancedFormats, Shader),
1270 CASE_CAP(ImageQuery, Shader),
1271 CASE_CAP(DerivativeControl, Shader),
1272 CASE_CAP(InterpolationFunction, Shader),
1273 CASE_CAP(TransformFeedback, Shader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001274};
David Netod30b2332015-09-23 16:04:24 -04001275#undef CASE
1276#undef CASE_CAP
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001277
1278static const spv_operand_desc_group_t opcodeEntryTypes[] = {
1279 {SPV_OPERAND_TYPE_SOURCE_LANGUAGE,
1280 sizeof(sourceLanguageEntries) / sizeof(spv_operand_desc_t),
1281 sourceLanguageEntries},
1282 {SPV_OPERAND_TYPE_EXECUTION_MODEL,
1283 sizeof(executionModelEntries) / sizeof(spv_operand_desc_t),
1284 executionModelEntries},
1285 {SPV_OPERAND_TYPE_ADDRESSING_MODEL,
1286 sizeof(addressingModelEntries) / sizeof(spv_operand_desc_t),
1287 addressingModelEntries},
1288 {SPV_OPERAND_TYPE_MEMORY_MODEL,
1289 sizeof(memoryModelEntries) / sizeof(spv_operand_desc_t),
1290 memoryModelEntries},
1291 {SPV_OPERAND_TYPE_EXECUTION_MODE,
1292 sizeof(executionModeEntries) / sizeof(spv_operand_desc_t),
1293 executionModeEntries},
1294 {SPV_OPERAND_TYPE_STORAGE_CLASS,
1295 sizeof(storageClassEntries) / sizeof(spv_operand_desc_t),
1296 storageClassEntries},
1297 {SPV_OPERAND_TYPE_DIMENSIONALITY,
1298 sizeof(dimensionalityEntries) / sizeof(spv_operand_desc_t),
1299 dimensionalityEntries},
1300 {SPV_OPERAND_TYPE_SAMPLER_ADDRESSING_MODE,
1301 sizeof(samplerAddressingModeEntries) / sizeof(spv_operand_desc_t),
1302 samplerAddressingModeEntries},
1303 {SPV_OPERAND_TYPE_SAMPLER_FILTER_MODE,
1304 sizeof(samplerFilterModeEntries) / sizeof(spv_operand_desc_t),
1305 samplerFilterModeEntries},
David Netob30a0c52015-09-16 15:56:43 -04001306 {SPV_OPERAND_TYPE_SAMPLER_IMAGE_FORMAT,
1307 sizeof(samplerImageFormatEntries) / sizeof(spv_operand_desc_t),
1308 samplerImageFormatEntries},
David Netoee1b3bb2015-09-18 11:19:18 -04001309 {SPV_OPERAND_TYPE_OPTIONAL_IMAGE,
1310 sizeof(imageOperandEntries) / sizeof(spv_operand_desc_t),
1311 imageOperandEntries},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001312 {SPV_OPERAND_TYPE_FP_FAST_MATH_MODE,
1313 sizeof(fpFastMathModeEntries) / sizeof(spv_operand_desc_t),
1314 fpFastMathModeEntries},
1315 {SPV_OPERAND_TYPE_FP_ROUNDING_MODE,
1316 sizeof(fpRoundingModeEntries) / sizeof(spv_operand_desc_t),
1317 fpRoundingModeEntries},
1318 {SPV_OPERAND_TYPE_LINKAGE_TYPE,
1319 sizeof(linkageTypeEntries) / sizeof(spv_operand_desc_t),
1320 linkageTypeEntries},
1321 {SPV_OPERAND_TYPE_ACCESS_QUALIFIER,
1322 sizeof(accessQualifierEntries) / sizeof(spv_operand_desc_t),
1323 accessQualifierEntries},
1324 {SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE,
1325 sizeof(functionParameterAttributeEntries) / sizeof(spv_operand_desc_t),
1326 functionParameterAttributeEntries},
1327 {SPV_OPERAND_TYPE_DECORATION,
1328 sizeof(decorationEntries) / sizeof(spv_operand_desc_t), decorationEntries},
1329 {SPV_OPERAND_TYPE_BUILT_IN,
1330 sizeof(builtInEntries) / sizeof(spv_operand_desc_t), builtInEntries},
1331 {SPV_OPERAND_TYPE_SELECTION_CONTROL,
1332 sizeof(selectionControlEntries) / sizeof(spv_operand_desc_t),
1333 selectionControlEntries},
1334 {SPV_OPERAND_TYPE_LOOP_CONTROL,
1335 sizeof(loopControlEntries) / sizeof(spv_operand_desc_t),
1336 loopControlEntries},
1337 {SPV_OPERAND_TYPE_FUNCTION_CONTROL,
1338 sizeof(functionControlEntries) / sizeof(spv_operand_desc_t),
1339 functionControlEntries},
1340 {SPV_OPERAND_TYPE_MEMORY_SEMANTICS,
1341 sizeof(memorySemanticsEntries) / sizeof(spv_operand_desc_t),
1342 memorySemanticsEntries},
David Neto78c3b432015-08-27 13:03:52 -04001343 {SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001344 sizeof(memoryAccessEntries) / sizeof(spv_operand_desc_t),
1345 memoryAccessEntries},
1346 {SPV_OPERAND_TYPE_EXECUTION_SCOPE,
1347 sizeof(scopeEntries) / sizeof(spv_operand_desc_t), scopeEntries},
1348 {SPV_OPERAND_TYPE_GROUP_OPERATION,
1349 sizeof(groupOperationEntries) / sizeof(spv_operand_desc_t),
1350 groupOperationEntries},
1351 {SPV_OPERAND_TYPE_KERNEL_ENQ_FLAGS,
1352 sizeof(kernelKernelEnqueueFlagssEntries) / sizeof(spv_operand_desc_t),
1353 kernelKernelEnqueueFlagssEntries},
David Neto47994822015-08-27 13:11:01 -04001354 {SPV_OPERAND_TYPE_KERNEL_PROFILING_INFO,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001355 sizeof(kernelProfilingInfoEntries) / sizeof(spv_operand_desc_t),
1356 kernelProfilingInfoEntries},
1357 {SPV_OPERAND_TYPE_CAPABILITY,
1358 sizeof(capabilityInfoEntries) / sizeof(spv_operand_desc_t),
1359 capabilityInfoEntries},
1360};
1361
1362spv_result_t spvOperandTableGet(spv_operand_table *pOperandTable) {
Lei Zhang40056702015-09-11 14:31:27 -04001363 if (!pOperandTable) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001364
1365 static const spv_operand_table_t table = {
1366 sizeof(opcodeEntryTypes) / sizeof(spv_operand_desc_group_t),
1367 opcodeEntryTypes};
1368
1369 *pOperandTable = &table;
1370
1371 return SPV_SUCCESS;
1372}
1373
1374spv_result_t spvOperandTableNameLookup(const spv_operand_table table,
1375 const spv_operand_type_t type,
David Neto388c40d2015-09-16 16:42:56 -04001376 const char* name,
1377 const size_t nameLength,
1378 spv_operand_desc* pEntry) {
Lei Zhang40056702015-09-11 14:31:27 -04001379 if (!table) return SPV_ERROR_INVALID_TABLE;
1380 if (!name || !pEntry) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001381
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001382 for (uint64_t typeIndex = 0; typeIndex < table->count; ++typeIndex) {
1383 if (type == table->types[typeIndex].type) {
1384 for (uint64_t operandIndex = 0;
1385 operandIndex < table->types[typeIndex].count; ++operandIndex) {
1386 if (nameLength ==
1387 strlen(table->types[typeIndex].entries[operandIndex].name) &&
1388 !strncmp(table->types[typeIndex].entries[operandIndex].name, name,
David Neto388c40d2015-09-16 16:42:56 -04001389 nameLength)) {
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001390 *pEntry = &table->types[typeIndex].entries[operandIndex];
1391 return SPV_SUCCESS;
1392 }
1393 }
1394 }
1395 }
1396
1397 return SPV_ERROR_INVALID_LOOKUP;
1398}
1399
1400spv_result_t spvOperandTableValueLookup(const spv_operand_table table,
1401 const spv_operand_type_t type,
1402 const uint32_t value,
1403 spv_operand_desc *pEntry) {
Lei Zhang40056702015-09-11 14:31:27 -04001404 if (!table) return SPV_ERROR_INVALID_TABLE;
1405 if (!pEntry) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001406
1407 for (uint64_t typeIndex = 0; typeIndex < table->count; ++typeIndex) {
1408 if (type == table->types[typeIndex].type) {
1409 for (uint64_t operandIndex = 0;
1410 operandIndex < table->types[typeIndex].count; ++operandIndex) {
1411 if (value == table->types[typeIndex].entries[operandIndex].value) {
1412 *pEntry = &table->types[typeIndex].entries[operandIndex];
1413 return SPV_SUCCESS;
1414 }
1415 }
1416 }
1417 }
1418
1419 return SPV_ERROR_INVALID_LOOKUP;
1420}
1421
1422const char *spvOperandTypeStr(spv_operand_type_t type) {
1423 switch (type) {
1424 case SPV_OPERAND_TYPE_ID:
David Netofadbf622015-09-14 17:07:11 -04001425 case SPV_OPERAND_TYPE_OPTIONAL_ID:
1426 case SPV_OPERAND_TYPE_ID_IN_OPTIONAL_TUPLE:
1427 return "ID";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001428 case SPV_OPERAND_TYPE_RESULT_ID:
1429 return "result ID";
1430 case SPV_OPERAND_TYPE_LITERAL:
1431 return "literal";
1432 case SPV_OPERAND_TYPE_LITERAL_NUMBER:
1433 return "literal number";
Lei Zhangb41d1502015-09-14 15:22:23 -04001434 case SPV_OPERAND_TYPE_MULTIWORD_LITERAL_NUMBER:
1435 return "multiple word literal number";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001436 case SPV_OPERAND_TYPE_LITERAL_STRING:
1437 return "literal string";
1438 case SPV_OPERAND_TYPE_SOURCE_LANGUAGE:
1439 return "source langauge";
1440 case SPV_OPERAND_TYPE_EXECUTION_MODEL:
1441 return "execution model";
1442 case SPV_OPERAND_TYPE_ADDRESSING_MODEL:
1443 return "addressing model";
1444 case SPV_OPERAND_TYPE_MEMORY_MODEL:
1445 return "memory model";
1446 case SPV_OPERAND_TYPE_EXECUTION_MODE:
1447 return "execution mode";
1448 case SPV_OPERAND_TYPE_STORAGE_CLASS:
1449 return "storage class";
1450 case SPV_OPERAND_TYPE_DIMENSIONALITY:
1451 return "dimensionality";
1452 case SPV_OPERAND_TYPE_SAMPLER_ADDRESSING_MODE:
1453 return "addressing mode";
1454 case SPV_OPERAND_TYPE_SAMPLER_FILTER_MODE:
1455 return "sampler filter mode";
David Netob30a0c52015-09-16 15:56:43 -04001456 case SPV_OPERAND_TYPE_SAMPLER_IMAGE_FORMAT:
1457 return "sampler image format";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001458 case SPV_OPERAND_TYPE_FP_FAST_MATH_MODE:
1459 return "floating pointer fast math mode";
1460 case SPV_OPERAND_TYPE_FP_ROUNDING_MODE:
1461 return "floating point rounding mode";
1462 case SPV_OPERAND_TYPE_LINKAGE_TYPE:
1463 return "linkage type";
1464 case SPV_OPERAND_TYPE_ACCESS_QUALIFIER:
1465 return "access qualifier";
1466 case SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE:
1467 return "function parameter attribute";
1468 case SPV_OPERAND_TYPE_DECORATION:
1469 return "decoration";
1470 case SPV_OPERAND_TYPE_BUILT_IN:
1471 return "built in";
1472 case SPV_OPERAND_TYPE_SELECTION_CONTROL:
1473 return "selection control";
1474 case SPV_OPERAND_TYPE_LOOP_CONTROL:
1475 return "loop control";
1476 case SPV_OPERAND_TYPE_FUNCTION_CONTROL:
1477 return "function control";
1478 case SPV_OPERAND_TYPE_MEMORY_SEMANTICS:
1479 return "memory semantics";
David Neto78c3b432015-08-27 13:03:52 -04001480 case SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001481 return "memory access";
1482 case SPV_OPERAND_TYPE_EXECUTION_SCOPE:
David Netofadbf622015-09-14 17:07:11 -04001483 return "execution scope ID";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001484 case SPV_OPERAND_TYPE_GROUP_OPERATION:
1485 return "group operation";
1486 case SPV_OPERAND_TYPE_KERNEL_ENQ_FLAGS:
1487 return "kernel enqeue flags";
David Neto47994822015-08-27 13:11:01 -04001488 case SPV_OPERAND_TYPE_KERNEL_PROFILING_INFO:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001489 return "kernel profiling info";
1490 case SPV_OPERAND_TYPE_CAPABILITY:
1491 return "capability";
David Netoee1b3bb2015-09-18 11:19:18 -04001492 case SPV_OPERAND_TYPE_OPTIONAL_IMAGE:
1493 return "image operand";
David Neto78c3b432015-08-27 13:03:52 -04001494 case SPV_OPERAND_TYPE_NONE:
1495 return "NONE";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001496 default:
1497 assert(0 && "Unhandled operand type!");
1498 break;
1499 }
1500 return "unknown";
1501}
David Neto78c3b432015-08-27 13:03:52 -04001502
1503void spvPrependOperandTypes(const spv_operand_type_t* types,
1504 spv_operand_pattern_t* pattern) {
1505 const spv_operand_type_t* endTypes;
1506 for (endTypes = types ; *endTypes != SPV_OPERAND_TYPE_NONE ; ++endTypes)
1507 ;
1508 pattern->insert(pattern->begin(), types, endTypes);
1509}
1510
David Neto5bf88fc2015-09-17 17:06:10 -04001511void spvPrependOperandTypesForMask(const spv_operand_table operandTable,
1512 const spv_operand_type_t type,
1513 const uint32_t mask,
1514 spv_operand_pattern_t* pattern) {
1515 // Scan from highest bits to lowest bits because we will prepend in LIFO
1516 // fashion, and we need the operands for lower order bits to appear first.
1517 for (uint32_t candidate_bit = (1 << 31); candidate_bit; candidate_bit >>= 1) {
1518 if (candidate_bit & mask) {
1519 spv_operand_desc entry = nullptr;
1520 if (SPV_SUCCESS == spvOperandTableValueLookup(operandTable, type,
1521 candidate_bit, &entry)) {
1522 spvPrependOperandTypes(entry->operandTypes, pattern);
1523 }
1524 }
1525 }
1526}
1527
David Neto78c3b432015-08-27 13:03:52 -04001528bool spvOperandIsOptional(spv_operand_type_t type) {
1529 // Variable means zero or more times.
1530 if (spvOperandIsVariable(type))
1531 return true;
1532
1533 switch (type) {
1534 case SPV_OPERAND_TYPE_OPTIONAL_ID:
1535 case SPV_OPERAND_TYPE_OPTIONAL_IMAGE:
1536 case SPV_OPERAND_TYPE_OPTIONAL_LITERAL:
1537 case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_STRING:
1538 case SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS:
1539 case SPV_OPERAND_TYPE_OPTIONAL_EXECUTION_MODE:
1540 return true;
1541 default:
1542 break;
1543 }
1544 return false;
1545}
1546
1547bool spvOperandIsVariable(spv_operand_type_t type) {
1548 switch (type) {
1549 case SPV_OPERAND_TYPE_VARIABLE_ID:
1550 case SPV_OPERAND_TYPE_VARIABLE_LITERAL:
1551 case SPV_OPERAND_TYPE_VARIABLE_ID_LITERAL:
1552 case SPV_OPERAND_TYPE_VARIABLE_LITERAL_ID:
David Neto78c3b432015-08-27 13:03:52 -04001553 case SPV_OPERAND_TYPE_VARIABLE_EXECUTION_MODE:
1554 return true;
1555 default:
1556 break;
1557 }
1558 return false;
1559}
1560
1561
1562bool spvExpandOperandSequenceOnce(spv_operand_type_t type,
1563 spv_operand_pattern_t* pattern) {
1564 switch (type) {
1565 case SPV_OPERAND_TYPE_VARIABLE_ID:
1566 pattern->insert(pattern->begin(), {SPV_OPERAND_TYPE_OPTIONAL_ID, type});
1567 return true;
1568 case SPV_OPERAND_TYPE_VARIABLE_LITERAL:
1569 pattern->insert(pattern->begin(),
1570 {SPV_OPERAND_TYPE_OPTIONAL_LITERAL, type});
1571 return true;
1572 case SPV_OPERAND_TYPE_VARIABLE_LITERAL_ID:
1573 // Represents Zero or more (Literal, Id) pairs.
1574 pattern->insert(pattern->begin(),
1575 {SPV_OPERAND_TYPE_OPTIONAL_LITERAL,
1576 SPV_OPERAND_TYPE_ID_IN_OPTIONAL_TUPLE, type});
1577 return true;
1578 case SPV_OPERAND_TYPE_VARIABLE_ID_LITERAL:
1579 // Represents Zero or more (Id, Literal) pairs.
1580 pattern->insert(pattern->begin(),
1581 {SPV_OPERAND_TYPE_OPTIONAL_ID,
1582 SPV_OPERAND_TYPE_LITERAL_IN_OPTIONAL_TUPLE, type});
1583 return true;
David Neto78c3b432015-08-27 13:03:52 -04001584 case SPV_OPERAND_TYPE_VARIABLE_EXECUTION_MODE:
1585 pattern->insert(pattern->begin(), {SPV_OPERAND_TYPE_OPTIONAL_EXECUTION_MODE, type});
1586 return true;
1587 default:
1588 break;
1589 }
1590 return false;
1591}
1592
1593spv_operand_type_t spvTakeFirstMatchableOperand(spv_operand_pattern_t* pattern) {
1594 assert(!pattern->empty());
1595 spv_operand_type_t result;
1596 do {
1597 result = pattern->front();
1598 pattern->pop_front();
1599 } while(spvExpandOperandSequenceOnce(result, pattern));
1600 return result;
1601}