blob: 97a28ebc12427ec6a920d24e0ec657a9d6b5d090 [file] [log] [blame]
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001// Copyright (c) 2015 The Khronos Group Inc.
2//
3// Permission is hereby granted, free of charge, to any person obtaining a
4// copy of this software and/or associated documentation files (the
5// "Materials"), to deal in the Materials without restriction, including
6// without limitation the rights to use, copy, modify, merge, publish,
7// distribute, sublicense, and/or sell copies of the Materials, and to
8// permit persons to whom the Materials are furnished to do so, subject to
9// the following conditions:
10//
11// The above copyright notice and this permission notice shall be included
12// in all copies or substantial portions of the Materials.
13//
14// MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS
15// KHRONOS STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS
16// SPECIFICATIONS AND HEADER INFORMATION ARE LOCATED AT
17// https://www.khronos.org/registry/
18//
19// THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
20// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
22// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
23// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
24// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
25// MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
26
27#include "operand.h"
28
29#include <assert.h>
30#include <string.h>
31
32static const spv_operand_desc_t sourceLanguageEntries[] = {
33 {"Unknown",
34 SourceLanguageUnknown,
35 SPV_OPCODE_FLAGS_NONE,
36 0,
37 {SPV_OPERAND_TYPE_NONE}},
38 {"ESSL",
39 SourceLanguageESSL,
40 SPV_OPCODE_FLAGS_NONE,
41 0,
42 {SPV_OPERAND_TYPE_NONE}},
43 {"GLSL",
44 SourceLanguageGLSL,
45 SPV_OPCODE_FLAGS_NONE,
46 0,
47 {SPV_OPERAND_TYPE_NONE}},
48 {"OpenCL",
49 SourceLanguageOpenCL,
50 SPV_OPCODE_FLAGS_NONE,
51 0,
52 {SPV_OPERAND_TYPE_NONE}},
53};
54
55static const spv_operand_desc_t executionModelEntries[] = {
56 {"Vertex",
57 ExecutionModelVertex,
58 SPV_OPCODE_FLAGS_CAPABILITIES,
59 CapabilityShader,
60 {SPV_OPERAND_TYPE_NONE}},
61 {"TessellationControl",
62 ExecutionModelTessellationControl,
63 SPV_OPCODE_FLAGS_CAPABILITIES,
64 CapabilityTessellation,
65 {SPV_OPERAND_TYPE_NONE}},
66 {"TessellationEvaluation",
67 ExecutionModelTessellationEvaluation,
68 SPV_OPCODE_FLAGS_CAPABILITIES,
69 CapabilityTessellation,
70 {SPV_OPERAND_TYPE_NONE}},
71 {"Geometry",
72 ExecutionModelGeometry,
73 SPV_OPCODE_FLAGS_CAPABILITIES,
74 CapabilityGeometry,
75 {SPV_OPERAND_TYPE_NONE}},
76 {"Fragment",
77 ExecutionModelFragment,
78 SPV_OPCODE_FLAGS_CAPABILITIES,
79 CapabilityShader,
80 {SPV_OPERAND_TYPE_NONE}},
81 {"GLCompute",
82 ExecutionModelGLCompute,
83 SPV_OPCODE_FLAGS_CAPABILITIES,
84 CapabilityShader,
85 {SPV_OPERAND_TYPE_NONE}},
86 {"Kernel",
87 ExecutionModelKernel,
88 SPV_OPCODE_FLAGS_CAPABILITIES,
89 CapabilityKernel,
90 {SPV_OPERAND_TYPE_NONE}},
91};
92
93static const spv_operand_desc_t addressingModelEntries[] = {
94 {"Logical",
95 AddressingModelLogical,
96 SPV_OPCODE_FLAGS_NONE,
97 0,
98 {SPV_OPERAND_TYPE_NONE}},
99 {"Physical32",
100 AddressingModelPhysical32,
101 SPV_OPCODE_FLAGS_CAPABILITIES,
102 CapabilityAddresses,
103 {SPV_OPERAND_TYPE_NONE}},
104 {"Physical64",
105 AddressingModelPhysical64,
106 SPV_OPCODE_FLAGS_CAPABILITIES,
107 CapabilityAddresses,
108 {SPV_OPERAND_TYPE_NONE}},
109};
110
111static const spv_operand_desc_t memoryModelEntries[] = {
112 {"Simple",
113 MemoryModelSimple,
114 SPV_OPCODE_FLAGS_CAPABILITIES,
115 CapabilityShader,
116 {SPV_OPERAND_TYPE_NONE}},
117 {"GLSL450",
118 MemoryModelGLSL450,
119 SPV_OPCODE_FLAGS_CAPABILITIES,
120 CapabilityShader,
121 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400122 {"OpenCL",
123 MemoryModelOpenCL,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100124 SPV_OPCODE_FLAGS_CAPABILITIES,
125 CapabilityKernel,
126 {SPV_OPERAND_TYPE_NONE}},
127};
128
Lei Zhang85c6f792015-09-23 15:42:18 -0400129// Execution mode requiring the given capability and having no operands.
130#define ExecMode0(mode, cap) \
131 #mode, ExecutionMode##mode, SPV_OPCODE_FLAGS_CAPABILITIES, Capability##cap, \
132 { \
133 SPV_OPERAND_TYPE_NONE \
134 }
135// Execution mode requiring the given capability and having one literal number
136// operand.
137#define ExecMode1(mode, cap) \
138 #mode, ExecutionMode##mode, SPV_OPCODE_FLAGS_CAPABILITIES, Capability##cap, \
139 { \
140 SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE \
141 }
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100142static const spv_operand_desc_t executionModeEntries[] = {
Lei Zhang85c6f792015-09-23 15:42:18 -0400143 {ExecMode1(Invocations, Geometry)},
144 {ExecMode0(SpacingEqual, Tessellation)},
145 {ExecMode0(SpacingFractionalEven, Tessellation)},
146 {ExecMode0(SpacingFractionalOdd, Tessellation)},
147 {ExecMode0(VertexOrderCw, Tessellation)},
148 {ExecMode0(VertexOrderCcw, Tessellation)},
149 {ExecMode0(PixelCenterInteger, Shader)},
150 {ExecMode0(OriginUpperLeft, Shader)},
151 {ExecMode0(OriginLowerLeft, Shader)},
152 {ExecMode0(EarlyFragmentTests, Shader)},
153 {ExecMode0(PointMode, Tessellation)},
154 {ExecMode0(Xfb, Shader)},
155 {ExecMode0(DepthReplacing, Shader)},
156 {ExecMode0(DepthAny, Shader)},
157 {ExecMode0(DepthGreater, Shader)},
158 {ExecMode0(DepthLess, Shader)},
159 {ExecMode0(DepthUnchanged, Shader)},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100160 {"LocalSize",
161 ExecutionModeLocalSize,
162 SPV_OPCODE_FLAGS_NONE,
163 0,
164 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_LITERAL_NUMBER,
165 SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
166 {"LocalSizeHint",
167 ExecutionModeLocalSizeHint,
168 SPV_OPCODE_FLAGS_CAPABILITIES,
169 CapabilityKernel,
170 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_LITERAL_NUMBER,
171 SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
Lei Zhang85c6f792015-09-23 15:42:18 -0400172 {ExecMode0(InputPoints, Geometry)},
173 {ExecMode0(InputLines, Geometry)},
174 {ExecMode0(InputLinesAdjacency, Geometry)},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100175 {"InputTriangles",
176 ExecutionModeInputTriangles,
177 SPV_OPCODE_FLAGS_CAPABILITIES,
Lei Zhang85c6f792015-09-23 15:42:18 -0400178 // TODO(dneto): Capabilities are defined as sequential numbers instead of
179 // bit masks. They cannot be meaningfully combined with a bitwise OR.
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100180 CapabilityGeometry | CapabilityTessellation,
181 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang85c6f792015-09-23 15:42:18 -0400182 {ExecMode0(InputTrianglesAdjacency, Geometry)},
183 {ExecMode0(InputQuads, Tessellation)},
184 {ExecMode0(InputIsolines, Tessellation)},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100185 {"OutputVertices",
186 ExecutionModeOutputVertices,
187 SPV_OPCODE_FLAGS_CAPABILITIES,
Lei Zhang85c6f792015-09-23 15:42:18 -0400188 // TODO(dneto): Capabilities are defined as sequential numbers instead of
189 // bit masks. They cannot be meaningfully combined with a bitwise OR.
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100190 CapabilityGeometry | CapabilityTessellation,
191 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
Lei Zhang85c6f792015-09-23 15:42:18 -0400192 {ExecMode0(OutputPoints, Geometry)},
193 {ExecMode0(OutputLineStrip, Geometry)},
194 {ExecMode0(OutputTriangleStrip, Geometry)},
195 {ExecMode1(VecTypeHint, Kernel)},
196 {ExecMode0(ContractionOff, Kernel)},
197 {ExecMode0(IndependentForwardProgress, Kernel)},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100198};
Lei Zhang85c6f792015-09-23 15:42:18 -0400199#undef ExecMode0
200#undef ExecMode1
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100201
202static const spv_operand_desc_t storageClassEntries[] = {
David Neto5494dd42015-09-15 16:41:38 -0400203 // TODO(dneto): There are more storage classes in Rev32 and later.
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100204 {"UniformConstant",
205 StorageClassUniformConstant,
206 SPV_OPCODE_FLAGS_NONE,
207 0,
208 {SPV_OPERAND_TYPE_NONE}},
209 {"Input",
210 StorageClassInput,
211 SPV_OPCODE_FLAGS_CAPABILITIES,
212 CapabilityShader,
213 {SPV_OPERAND_TYPE_NONE}},
214 {"Uniform",
215 StorageClassUniform,
216 SPV_OPCODE_FLAGS_CAPABILITIES,
217 CapabilityShader,
218 {SPV_OPERAND_TYPE_NONE}},
219 {"Output",
220 StorageClassOutput,
221 SPV_OPCODE_FLAGS_CAPABILITIES,
222 CapabilityShader,
223 {SPV_OPERAND_TYPE_NONE}},
224 {"WorkgroupLocal",
225 StorageClassWorkgroupLocal,
226 SPV_OPCODE_FLAGS_NONE,
227 0,
228 {SPV_OPERAND_TYPE_NONE}},
229 {"WorkgroupGlobal",
230 StorageClassWorkgroupGlobal,
231 SPV_OPCODE_FLAGS_NONE,
232 0,
233 {SPV_OPERAND_TYPE_NONE}},
234 {"PrivateGlobal",
235 StorageClassPrivateGlobal,
236 SPV_OPCODE_FLAGS_CAPABILITIES,
237 CapabilityShader,
238 {SPV_OPERAND_TYPE_NONE}},
239 {"Function",
240 StorageClassFunction,
241 SPV_OPCODE_FLAGS_NONE,
242 0,
243 {SPV_OPERAND_TYPE_NONE}},
244 {"Generic",
245 StorageClassGeneric,
246 SPV_OPCODE_FLAGS_CAPABILITIES,
247 CapabilityKernel,
248 {SPV_OPERAND_TYPE_NONE}},
David Neto9819adf2015-09-23 10:19:57 -0400249 {"PushConstant",
250 StorageClassPushConstant,
251 SPV_OPCODE_FLAGS_CAPABILITIES,
252 CapabilityShader,
253 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100254 {"AtomicCounter",
255 StorageClassAtomicCounter,
256 SPV_OPCODE_FLAGS_CAPABILITIES,
257 CapabilityShader,
258 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400259 {"Image",
260 StorageClassImage,
261 SPV_OPCODE_FLAGS_NONE,
262 0,
263 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100264};
265
266static const spv_operand_desc_t dimensionalityEntries[] = {
David Netoaa0c3a52015-09-23 10:30:06 -0400267 // TODO(dneto): Update capability dependencies for Rev32
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100268 {"1D", Dim1D, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_NONE}},
269 {"2D", Dim2D, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_NONE}},
270 {"3D", Dim3D, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_NONE}},
271 {"Cube",
272 DimCube,
273 SPV_OPCODE_FLAGS_CAPABILITIES,
274 CapabilityShader,
275 {SPV_OPERAND_TYPE_NONE}},
276 {"Rect",
277 DimRect,
278 SPV_OPCODE_FLAGS_CAPABILITIES,
279 CapabilityShader,
280 {SPV_OPERAND_TYPE_NONE}},
281 {"Buffer", DimBuffer, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_NONE}},
David Netoaa0c3a52015-09-23 10:30:06 -0400282 {"InputTarget",
283 DimInputTarget,
284 SPV_OPCODE_FLAGS_CAPABILITIES,
285 CapabilityInputTarget,
286 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100287};
288
289static const spv_operand_desc_t samplerAddressingModeEntries[] = {
290 {"None",
291 SamplerAddressingModeNone,
292 SPV_OPCODE_FLAGS_CAPABILITIES,
293 CapabilityKernel,
294 {SPV_OPERAND_TYPE_NONE}},
295 {"ClampToEdge",
296 SamplerAddressingModeClampToEdge,
297 SPV_OPCODE_FLAGS_CAPABILITIES,
298 CapabilityKernel,
299 {SPV_OPERAND_TYPE_NONE}},
300 {"Clamp",
301 SamplerAddressingModeClamp,
302 SPV_OPCODE_FLAGS_CAPABILITIES,
303 CapabilityKernel,
304 {SPV_OPERAND_TYPE_NONE}},
305 {"Repeat",
306 SamplerAddressingModeRepeat,
307 SPV_OPCODE_FLAGS_CAPABILITIES,
308 CapabilityKernel,
309 {SPV_OPERAND_TYPE_NONE}},
310 {"RepeatMirrored",
311 SamplerAddressingModeRepeatMirrored,
312 SPV_OPCODE_FLAGS_CAPABILITIES,
313 CapabilityKernel,
314 {SPV_OPERAND_TYPE_NONE}},
315};
316
317static const spv_operand_desc_t samplerFilterModeEntries[] = {
318 {"Nearest",
319 SamplerFilterModeNearest,
320 SPV_OPCODE_FLAGS_CAPABILITIES,
321 CapabilityKernel,
322 {SPV_OPERAND_TYPE_NONE}},
323 {"Linear",
324 SamplerFilterModeLinear,
325 SPV_OPCODE_FLAGS_CAPABILITIES,
326 CapabilityKernel,
327 {SPV_OPERAND_TYPE_NONE}},
328};
329
David Netob30a0c52015-09-16 15:56:43 -0400330static const spv_operand_desc_t samplerImageFormatEntries[] = {
331// In Rev31, all the cases depend on the Shader capability.
332// TODO(dneto): In Rev32, many of these depend on the AdvancedFormats
333// capability instead.
334#define CASE(NAME) \
335 { \
336 #NAME, ImageFormat##NAME, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityShader, \
337 { \
338 SPV_OPERAND_TYPE_NONE \
339 } \
340 }
341 // clang-format off
342 CASE(Unknown),
343 CASE(Rgba32f),
344 CASE(Rgba16f),
345 CASE(R32f),
346 CASE(Rgba8),
347 CASE(Rgba8Snorm),
348 CASE(Rg32f),
349 CASE(Rg16f),
350 CASE(R11fG11fB10f),
351 CASE(R16f),
352 CASE(Rgba16),
353 CASE(Rgb10A2),
354 CASE(Rg16),
355 CASE(Rg8),
356 CASE(R16),
357 CASE(R8),
358 CASE(Rgba16Snorm),
359 CASE(Rg16Snorm),
360 CASE(Rg8Snorm),
361 CASE(R16Snorm),
362 CASE(R8Snorm),
363 CASE(Rgba32i),
364 CASE(Rgba16i),
365 CASE(Rgba8i),
366 CASE(R32i),
367 CASE(Rg32i),
368 CASE(Rg16i),
369 CASE(Rg8i),
370 CASE(R16i),
371 CASE(R8i),
372 CASE(Rgba32ui),
373 CASE(Rgba16ui),
374 CASE(Rgba8ui),
375 CASE(R32ui),
376 CASE(Rgb10a2ui),
377 CASE(Rg32ui),
378 CASE(Rg16ui),
379 CASE(Rg8ui),
380 CASE(R16ui),
381 CASE(R8ui),
382 // clang-format on
383#undef CASE
384};
385
David Netoee1b3bb2015-09-18 11:19:18 -0400386// Image operand definitions. Each enum value is a mask. When that mask
387// bit is set, the instruction should have further ID operands.
388// Some mask values depend on a capability.
389static const spv_operand_desc_t imageOperandEntries[] = {
390// Rev32 and later adds many more enums.
391#define CASE(NAME) \
392 #NAME, spv::ImageOperands##NAME##Mask, SPV_OPCODE_FLAGS_NONE, 0
393#define CASE_CAP(NAME, CAP) \
394 #NAME, spv::ImageOperands##NAME##Mask, SPV_OPCODE_FLAGS_CAPABILITIES, CAP
395#define ID SPV_OPERAND_TYPE_ID
396#define NONE SPV_OPERAND_TYPE_NONE
397 {"None", spv::ImageOperandsMaskNone, SPV_OPCODE_FLAGS_NONE, 0, {NONE}},
398 {CASE_CAP(Bias, CapabilityShader), {ID, NONE}},
399 {CASE(Lod), {ID, NONE}},
400 {CASE(Grad), {ID, ID, NONE}},
401 {CASE(ConstOffset), {ID, NONE}},
402 {CASE_CAP(Offset, CapabilityImageGatherExtended), {ID, NONE}},
403 {CASE(ConstOffsets), {ID, NONE}},
404 {CASE(Sample), {ID, NONE}},
405#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}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100749};
750
751static const spv_operand_desc_t builtInEntries[] = {
752 {"Position",
753 BuiltInPosition,
754 SPV_OPCODE_FLAGS_CAPABILITIES,
755 CapabilityShader,
756 {SPV_OPERAND_TYPE_NONE}},
757 {"PointSize",
758 BuiltInPointSize,
759 SPV_OPCODE_FLAGS_CAPABILITIES,
760 CapabilityShader,
761 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100762 {"ClipDistance",
763 BuiltInClipDistance,
764 SPV_OPCODE_FLAGS_CAPABILITIES,
765 CapabilityShader,
766 {SPV_OPERAND_TYPE_NONE}},
767 {"CullDistance",
768 BuiltInCullDistance,
769 SPV_OPCODE_FLAGS_CAPABILITIES,
770 CapabilityShader,
771 {SPV_OPERAND_TYPE_NONE}},
772 {"VertexId",
773 BuiltInVertexId,
774 SPV_OPCODE_FLAGS_CAPABILITIES,
775 CapabilityShader,
776 {SPV_OPERAND_TYPE_NONE}},
777 {"InstanceId",
778 BuiltInInstanceId,
779 SPV_OPCODE_FLAGS_CAPABILITIES,
780 CapabilityShader,
781 {SPV_OPERAND_TYPE_NONE}},
782 {"PrimitiveId",
783 BuiltInPrimitiveId,
784 SPV_OPCODE_FLAGS_CAPABILITIES,
785 CapabilityGeometry | CapabilityTessellation,
786 {SPV_OPERAND_TYPE_NONE}},
787 {"InvocationId",
788 BuiltInInvocationId,
789 SPV_OPCODE_FLAGS_CAPABILITIES,
790 CapabilityGeometry | CapabilityTessellation,
791 {SPV_OPERAND_TYPE_NONE}},
792 {"Layer",
793 BuiltInLayer,
794 SPV_OPCODE_FLAGS_CAPABILITIES,
795 CapabilityGeometry,
796 {SPV_OPERAND_TYPE_NONE}},
797 {"ViewportIndex",
798 BuiltInViewportIndex,
799 SPV_OPCODE_FLAGS_CAPABILITIES,
800 CapabilityGeometry,
801 {SPV_OPERAND_TYPE_NONE}},
802 {"TessLevelOuter",
803 BuiltInTessLevelOuter,
804 SPV_OPCODE_FLAGS_CAPABILITIES,
805 CapabilityTessellation,
806 {SPV_OPERAND_TYPE_NONE}},
807 {"TessLevelInner",
808 BuiltInTessLevelInner,
809 SPV_OPCODE_FLAGS_CAPABILITIES,
810 CapabilityTessellation,
811 {SPV_OPERAND_TYPE_NONE}},
812 {"TessCoord",
813 BuiltInTessCoord,
814 SPV_OPCODE_FLAGS_CAPABILITIES,
815 CapabilityTessellation,
816 {SPV_OPERAND_TYPE_NONE}},
817 {"PatchVertices",
818 BuiltInPatchVertices,
819 SPV_OPCODE_FLAGS_CAPABILITIES,
820 CapabilityTessellation,
821 {SPV_OPERAND_TYPE_NONE}},
822 {"FragCoord",
823 BuiltInFragCoord,
824 SPV_OPCODE_FLAGS_CAPABILITIES,
825 CapabilityShader,
826 {SPV_OPERAND_TYPE_NONE}},
827 {"PointCoord",
828 BuiltInPointCoord,
829 SPV_OPCODE_FLAGS_CAPABILITIES,
830 CapabilityShader,
831 {SPV_OPERAND_TYPE_NONE}},
832 {"FrontFacing",
833 BuiltInFrontFacing,
834 SPV_OPCODE_FLAGS_CAPABILITIES,
835 CapabilityShader,
836 {SPV_OPERAND_TYPE_NONE}},
837 {"SampleId",
838 BuiltInSampleId,
839 SPV_OPCODE_FLAGS_CAPABILITIES,
840 CapabilityShader,
841 {SPV_OPERAND_TYPE_NONE}},
842 {"SamplePosition",
843 BuiltInSamplePosition,
844 SPV_OPCODE_FLAGS_CAPABILITIES,
845 CapabilityShader,
846 {SPV_OPERAND_TYPE_NONE}},
847 {"SampleMask",
848 BuiltInSampleMask,
849 SPV_OPCODE_FLAGS_CAPABILITIES,
850 CapabilityShader,
851 {SPV_OPERAND_TYPE_NONE}},
852 {"FragColor",
853 BuiltInFragColor,
854 SPV_OPCODE_FLAGS_CAPABILITIES,
855 CapabilityShader,
856 {SPV_OPERAND_TYPE_NONE}},
857 {"FragDepth",
858 BuiltInFragDepth,
859 SPV_OPCODE_FLAGS_CAPABILITIES,
860 CapabilityShader,
861 {SPV_OPERAND_TYPE_NONE}},
862 {"HelperInvocation",
863 BuiltInHelperInvocation,
864 SPV_OPCODE_FLAGS_CAPABILITIES,
865 CapabilityShader,
866 {SPV_OPERAND_TYPE_NONE}},
867 {"NumWorkgroups",
868 BuiltInNumWorkgroups,
869 SPV_OPCODE_FLAGS_NONE,
870 0,
871 {SPV_OPERAND_TYPE_NONE}},
872 {"WorkgroupSize",
873 BuiltInWorkgroupSize,
874 SPV_OPCODE_FLAGS_NONE,
875 0,
876 {SPV_OPERAND_TYPE_NONE}},
877 {"WorkgroupId",
878 BuiltInWorkgroupId,
879 SPV_OPCODE_FLAGS_NONE,
880 0,
881 {SPV_OPERAND_TYPE_NONE}},
882 {"LocalInvocationId",
883 BuiltInLocalInvocationId,
884 SPV_OPCODE_FLAGS_NONE,
885 0,
886 {SPV_OPERAND_TYPE_NONE}},
887 {"GlobalInvocationId",
888 BuiltInGlobalInvocationId,
889 SPV_OPCODE_FLAGS_NONE,
890 0,
891 {SPV_OPERAND_TYPE_NONE}},
892 {"LocalInvocationIndex",
David Neto37547b22015-09-10 13:23:11 -0400893 BuiltInLocalInvocationIndex,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100894 SPV_OPCODE_FLAGS_CAPABILITIES,
895 CapabilityShader,
896 {SPV_OPERAND_TYPE_NONE}},
897 {"WorkDim",
898 BuiltInWorkDim,
899 SPV_OPCODE_FLAGS_CAPABILITIES,
900 CapabilityKernel,
901 {SPV_OPERAND_TYPE_NONE}},
902 {"GlobalSize",
903 BuiltInGlobalSize,
904 SPV_OPCODE_FLAGS_CAPABILITIES,
905 CapabilityKernel,
906 {SPV_OPERAND_TYPE_NONE}},
907 {"EnqueuedWorkgroupSize",
908 BuiltInEnqueuedWorkgroupSize,
909 SPV_OPCODE_FLAGS_CAPABILITIES,
910 CapabilityKernel,
911 {SPV_OPERAND_TYPE_NONE}},
912 {"GlobalOffset",
913 BuiltInGlobalOffset,
914 SPV_OPCODE_FLAGS_CAPABILITIES,
915 CapabilityKernel,
916 {SPV_OPERAND_TYPE_NONE}},
917 {"GlobalLinearId",
918 BuiltInGlobalLinearId,
919 SPV_OPCODE_FLAGS_CAPABILITIES,
920 CapabilityKernel,
921 {SPV_OPERAND_TYPE_NONE}},
922 {"WorkgroupLinearId",
923 BuiltInWorkgroupLinearId,
924 SPV_OPCODE_FLAGS_CAPABILITIES,
925 CapabilityKernel,
926 {SPV_OPERAND_TYPE_NONE}},
927 {"SubgroupSize",
928 BuiltInSubgroupSize,
929 SPV_OPCODE_FLAGS_CAPABILITIES,
930 CapabilityKernel,
931 {SPV_OPERAND_TYPE_NONE}},
932 {"SubgroupMaxSize",
933 BuiltInSubgroupMaxSize,
934 SPV_OPCODE_FLAGS_CAPABILITIES,
935 CapabilityKernel,
936 {SPV_OPERAND_TYPE_NONE}},
937 {"NumSubgroups",
938 BuiltInNumSubgroups,
939 SPV_OPCODE_FLAGS_CAPABILITIES,
940 CapabilityKernel,
941 {SPV_OPERAND_TYPE_NONE}},
942 {"NumEnqueuedSubgroups",
943 BuiltInNumEnqueuedSubgroups,
944 SPV_OPCODE_FLAGS_CAPABILITIES,
945 CapabilityKernel,
946 {SPV_OPERAND_TYPE_NONE}},
947 {"SubgroupId",
David Neto37547b22015-09-10 13:23:11 -0400948 BuiltInSubgroupId,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100949 SPV_OPCODE_FLAGS_CAPABILITIES,
950 CapabilityKernel,
951 {SPV_OPERAND_TYPE_NONE}},
952 {"SubgroupLocalInvocationId",
953 BuiltInSubgroupLocalInvocationId,
954 SPV_OPCODE_FLAGS_CAPABILITIES,
955 CapabilityKernel,
956 {SPV_OPERAND_TYPE_NONE}},
957};
958
959static const spv_operand_desc_t selectionControlEntries[] = {
960 {"None",
961 SelectionControlMaskNone,
962 SPV_OPCODE_FLAGS_NONE,
963 0,
964 {SPV_OPERAND_TYPE_NONE}},
965 {"Flatten",
966 SelectionControlFlattenMask,
967 SPV_OPCODE_FLAGS_NONE,
968 0,
969 {SPV_OPERAND_TYPE_NONE}},
970 {"DontFlatten",
971 SelectionControlDontFlattenMask,
972 SPV_OPCODE_FLAGS_NONE,
973 0,
974 {SPV_OPERAND_TYPE_NONE}},
975};
976
977static const spv_operand_desc_t loopControlEntries[] = {
978 {"None",
979 LoopControlMaskNone,
980 SPV_OPCODE_FLAGS_NONE,
981 0,
982 {SPV_OPERAND_TYPE_NONE}},
983 {"Unroll",
984 LoopControlUnrollMask,
985 SPV_OPCODE_FLAGS_NONE,
986 0,
987 {SPV_OPERAND_TYPE_NONE}},
988 {"DontUnroll",
989 LoopControlDontUnrollMask,
990 SPV_OPCODE_FLAGS_NONE,
991 0,
992 {SPV_OPERAND_TYPE_NONE}},
993};
994
995static const spv_operand_desc_t functionControlEntries[] = {
996 {"None",
997 FunctionControlMaskNone,
998 SPV_OPCODE_FLAGS_NONE,
999 0,
1000 {SPV_OPERAND_TYPE_NONE}},
David Netof4fde6c2015-09-14 14:50:37 -04001001 {"Inline",
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001002 FunctionControlInlineMask,
1003 SPV_OPCODE_FLAGS_NONE,
1004 0,
1005 {SPV_OPERAND_TYPE_NONE}},
1006 {"DontInline",
1007 FunctionControlDontInlineMask,
1008 SPV_OPCODE_FLAGS_NONE,
1009 0,
1010 {SPV_OPERAND_TYPE_NONE}},
1011 {"Pure",
1012 FunctionControlPureMask,
1013 SPV_OPCODE_FLAGS_NONE,
1014 0,
1015 {SPV_OPERAND_TYPE_NONE}},
1016 {"Const",
1017 FunctionControlConstMask,
1018 SPV_OPCODE_FLAGS_NONE,
1019 0,
1020 {SPV_OPERAND_TYPE_NONE}},
1021};
1022
1023static const spv_operand_desc_t memorySemanticsEntries[] = {
1024 {"None",
1025 MemorySemanticsMaskNone,
1026 SPV_OPCODE_FLAGS_NONE,
1027 0,
1028 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001029 {"SequentiallyConsistent",
1030 MemorySemanticsSequentiallyConsistentMask,
1031 SPV_OPCODE_FLAGS_NONE,
1032 0,
1033 {SPV_OPERAND_TYPE_NONE}},
1034 {"Acquire",
1035 MemorySemanticsAcquireMask,
1036 SPV_OPCODE_FLAGS_NONE,
1037 0,
1038 {SPV_OPERAND_TYPE_NONE}},
1039 {"Release",
1040 MemorySemanticsReleaseMask,
1041 SPV_OPCODE_FLAGS_NONE,
1042 0,
1043 {SPV_OPERAND_TYPE_NONE}},
1044 {"UniformMemory",
1045 MemorySemanticsUniformMemoryMask,
1046 SPV_OPCODE_FLAGS_CAPABILITIES,
1047 CapabilityShader,
1048 {SPV_OPERAND_TYPE_NONE}},
1049 {"SubgroupMemory",
1050 MemorySemanticsSubgroupMemoryMask,
1051 SPV_OPCODE_FLAGS_NONE,
1052 0,
1053 {SPV_OPERAND_TYPE_NONE}},
1054 {"WorkgroupLocalMemory",
1055 MemorySemanticsWorkgroupLocalMemoryMask,
1056 SPV_OPCODE_FLAGS_NONE,
1057 0,
1058 {SPV_OPERAND_TYPE_NONE}},
1059 {"WorkgroupGlobalMemory",
1060 MemorySemanticsWorkgroupGlobalMemoryMask,
1061 SPV_OPCODE_FLAGS_NONE,
1062 0,
1063 {SPV_OPERAND_TYPE_NONE}},
1064 {"AtomicCounterMemory",
1065 MemorySemanticsAtomicCounterMemoryMask,
1066 SPV_OPCODE_FLAGS_CAPABILITIES,
1067 CapabilityShader,
1068 {SPV_OPERAND_TYPE_NONE}},
1069 {
1070 "ImageMemory",
1071 MemorySemanticsImageMemoryMask,
1072 SPV_OPCODE_FLAGS_NONE,
1073 0,
1074 {SPV_OPERAND_TYPE_NONE},
1075 },
1076};
1077
1078static const spv_operand_desc_t memoryAccessEntries[] = {
1079 {"None",
1080 MemoryAccessMaskNone,
1081 SPV_OPCODE_FLAGS_NONE,
1082 0,
1083 {SPV_OPERAND_TYPE_NONE}},
1084 {"Volatile",
1085 MemoryAccessVolatileMask,
1086 SPV_OPCODE_FLAGS_NONE,
1087 0,
1088 {SPV_OPERAND_TYPE_NONE}},
1089 {
1090 "Aligned",
1091 MemoryAccessAlignedMask,
1092 SPV_OPCODE_FLAGS_NONE,
1093 0,
David Neto4a291312015-09-14 15:08:48 -04001094 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001095 },
David Neto49c299b2015-09-23 15:38:59 -04001096 {"Nontemporal",
1097 MemoryAccessNontemporalMask,
1098 SPV_OPCODE_FLAGS_NONE,
1099 0,
1100 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001101};
1102
1103static const spv_operand_desc_t scopeEntries[] = {
1104 {"CrossDevice",
1105 ScopeCrossDevice,
1106 SPV_OPCODE_FLAGS_NONE,
1107 0,
1108 {SPV_OPERAND_TYPE_NONE}},
1109 {"Device", ScopeDevice, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_NONE}},
1110 {"Workgroup",
1111 ScopeWorkgroup,
1112 SPV_OPCODE_FLAGS_NONE,
1113 0,
1114 {SPV_OPERAND_TYPE_NONE}},
1115 {"Subgroup",
1116 ScopeSubgroup,
1117 SPV_OPCODE_FLAGS_NONE,
1118 0,
1119 {SPV_OPERAND_TYPE_NONE}},
1120 {
1121 "Invocation",
1122 ScopeInvocation,
1123 SPV_OPCODE_FLAGS_NONE,
1124 0,
1125 {SPV_OPERAND_TYPE_NONE},
1126 },
1127};
1128
1129static const spv_operand_desc_t groupOperationEntries[] = {
1130 {"Reduce",
1131 GroupOperationReduce,
1132 SPV_OPCODE_FLAGS_CAPABILITIES,
1133 CapabilityKernel,
1134 {SPV_OPERAND_TYPE_NONE}},
1135 {"InclusiveScan",
1136 GroupOperationInclusiveScan,
1137 SPV_OPCODE_FLAGS_CAPABILITIES,
1138 CapabilityKernel,
1139 {SPV_OPERAND_TYPE_NONE}},
1140 {"ExclusiveScan",
1141 GroupOperationExclusiveScan,
1142 SPV_OPCODE_FLAGS_CAPABILITIES,
1143 CapabilityKernel,
1144 {SPV_OPERAND_TYPE_NONE}},
1145};
1146
1147static const spv_operand_desc_t kernelKernelEnqueueFlagssEntries[] = {
1148 {"NoWait",
1149 KernelEnqueueFlagsNoWait,
1150 SPV_OPCODE_FLAGS_CAPABILITIES,
1151 CapabilityKernel,
1152 {SPV_OPERAND_TYPE_NONE}},
1153 {"WaitKernel",
1154 KernelEnqueueFlagsWaitKernel,
1155 SPV_OPCODE_FLAGS_CAPABILITIES,
1156 CapabilityKernel,
1157 {SPV_OPERAND_TYPE_NONE}},
1158 {"WaitWorkGroup",
1159 KernelEnqueueFlagsWaitWorkGroup,
1160 SPV_OPCODE_FLAGS_CAPABILITIES,
1161 CapabilityKernel,
1162 {SPV_OPERAND_TYPE_NONE}},
1163};
1164
1165static const spv_operand_desc_t kernelProfilingInfoEntries[] = {
1166 {"None",
1167 KernelProfilingInfoMaskNone,
1168 SPV_OPCODE_FLAGS_NONE,
1169 0,
1170 {SPV_OPERAND_TYPE_NONE}},
1171 {"CmdExecTime",
1172 KernelProfilingInfoCmdExecTimeMask,
1173 SPV_OPCODE_FLAGS_CAPABILITIES,
1174 CapabilityKernel,
1175 {SPV_OPERAND_TYPE_NONE}},
1176};
1177
1178static const spv_operand_desc_t capabilityInfoEntries[] = {
1179 {"Matrix",
1180 CapabilityMatrix,
1181 SPV_OPCODE_FLAGS_NONE,
1182 0,
1183 {SPV_OPERAND_TYPE_NONE}},
1184 {"Shader",
1185 CapabilityShader,
1186 SPV_OPCODE_FLAGS_CAPABILITIES,
1187 CapabilityMatrix,
1188 {SPV_OPERAND_TYPE_NONE}},
1189 {"Geometry",
1190 CapabilityGeometry,
1191 SPV_OPCODE_FLAGS_CAPABILITIES,
1192 CapabilityShader,
1193 {SPV_OPERAND_TYPE_NONE}},
1194 {"Tessellation",
1195 CapabilityTessellation,
1196 SPV_OPCODE_FLAGS_CAPABILITIES,
1197 CapabilityShader,
1198 {SPV_OPERAND_TYPE_NONE}},
1199 {"Addresses",
1200 CapabilityAddresses,
1201 SPV_OPCODE_FLAGS_NONE,
1202 0,
1203 {SPV_OPERAND_TYPE_NONE}},
1204 {"Linkage",
1205 CapabilityLinkage,
1206 SPV_OPCODE_FLAGS_NONE,
1207 0,
1208 {SPV_OPERAND_TYPE_NONE}},
1209 {"Kernel",
1210 CapabilityKernel,
1211 SPV_OPCODE_FLAGS_NONE,
1212 0,
1213 {SPV_OPERAND_TYPE_NONE}},
1214 {"Vector16",
1215 CapabilityVector16,
1216 SPV_OPCODE_FLAGS_NONE,
1217 0,
1218 {SPV_OPERAND_TYPE_NONE}},
1219 {"Float16Buffer",
1220 CapabilityFloat16Buffer,
1221 SPV_OPCODE_FLAGS_NONE,
1222 0,
1223 {SPV_OPERAND_TYPE_NONE}},
1224 {"Float16",
1225 CapabilityFloat16,
1226 SPV_OPCODE_FLAGS_NONE,
1227 0,
1228 {SPV_OPERAND_TYPE_NONE}},
1229 {"Float64",
1230 CapabilityFloat64,
1231 SPV_OPCODE_FLAGS_NONE,
1232 0,
1233 {SPV_OPERAND_TYPE_NONE}},
1234 {"Int64",
1235 CapabilityInt64,
1236 SPV_OPCODE_FLAGS_NONE,
1237 0,
1238 {SPV_OPERAND_TYPE_NONE}},
1239 {"Int64Atomics",
1240 CapabilityInt64Atomics,
1241 SPV_OPCODE_FLAGS_NONE,
1242 0,
1243 {SPV_OPERAND_TYPE_NONE}},
1244 {"ImageBasic",
1245 CapabilityImageBasic,
1246 SPV_OPCODE_FLAGS_NONE,
1247 0,
1248 {SPV_OPERAND_TYPE_NONE}},
1249 {"ImageReadWrite",
1250 CapabilityImageReadWrite,
1251 SPV_OPCODE_FLAGS_NONE,
1252 0,
1253 {SPV_OPERAND_TYPE_NONE}},
David Netoc6402d62015-09-10 16:39:09 -04001254 {"ImageMipmap",
1255 CapabilityImageMipmap,
1256 SPV_OPCODE_FLAGS_NONE,
1257 0,
1258 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001259 {"ImageSRGBWrite",
1260 CapabilityImageSRGBWrite,
1261 SPV_OPCODE_FLAGS_NONE,
1262 0,
1263 {SPV_OPERAND_TYPE_NONE}},
1264 {"Pipes",
1265 CapabilityPipes,
1266 SPV_OPCODE_FLAGS_NONE,
1267 0,
1268 {SPV_OPERAND_TYPE_NONE}},
1269 {"Groups",
1270 CapabilityGroups,
1271 SPV_OPCODE_FLAGS_NONE,
1272 0,
1273 {SPV_OPERAND_TYPE_NONE}},
1274 {"DeviceEnqueue",
1275 CapabilityDeviceEnqueue,
1276 SPV_OPCODE_FLAGS_NONE,
1277 0,
1278 {SPV_OPERAND_TYPE_NONE}},
David Netoc6402d62015-09-10 16:39:09 -04001279// A macro for defining a capability that doesn't depend on other capabilities.
David Netoe994e2e2015-09-11 12:15:58 -04001280// TODO(dneto): Rev32 adds many dependencies between capbilities.
David Netoc6402d62015-09-10 16:39:09 -04001281#define CASE(NAME) { #NAME, Capability##NAME, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_NONE}}
1282 CASE(LiteralSampler),
1283 CASE(AtomicStorage),
1284 CASE(Int16),
1285 CASE(TessellationPointSize),
1286 CASE(GeometryPointSize),
1287 CASE(ImageGatherExtended),
1288 CASE(StorageImageExtendedFormats),
1289 CASE(StorageImageMultisample),
1290 CASE(UniformBufferArrayDynamicIndexing),
1291 CASE(SampledImageArrayDynamicIndexing),
1292 CASE(StorageBufferArrayDynamicIndexing),
1293 CASE(StorageImageArrayDynamicIndexing),
1294 CASE(ClipDistance),
1295 CASE(CullDistance),
1296 CASE(ImageCubeArray),
1297 CASE(SampleRateShading),
1298#undef CASE
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001299};
1300
1301static const spv_operand_desc_group_t opcodeEntryTypes[] = {
1302 {SPV_OPERAND_TYPE_SOURCE_LANGUAGE,
1303 sizeof(sourceLanguageEntries) / sizeof(spv_operand_desc_t),
1304 sourceLanguageEntries},
1305 {SPV_OPERAND_TYPE_EXECUTION_MODEL,
1306 sizeof(executionModelEntries) / sizeof(spv_operand_desc_t),
1307 executionModelEntries},
1308 {SPV_OPERAND_TYPE_ADDRESSING_MODEL,
1309 sizeof(addressingModelEntries) / sizeof(spv_operand_desc_t),
1310 addressingModelEntries},
1311 {SPV_OPERAND_TYPE_MEMORY_MODEL,
1312 sizeof(memoryModelEntries) / sizeof(spv_operand_desc_t),
1313 memoryModelEntries},
1314 {SPV_OPERAND_TYPE_EXECUTION_MODE,
1315 sizeof(executionModeEntries) / sizeof(spv_operand_desc_t),
1316 executionModeEntries},
1317 {SPV_OPERAND_TYPE_STORAGE_CLASS,
1318 sizeof(storageClassEntries) / sizeof(spv_operand_desc_t),
1319 storageClassEntries},
1320 {SPV_OPERAND_TYPE_DIMENSIONALITY,
1321 sizeof(dimensionalityEntries) / sizeof(spv_operand_desc_t),
1322 dimensionalityEntries},
1323 {SPV_OPERAND_TYPE_SAMPLER_ADDRESSING_MODE,
1324 sizeof(samplerAddressingModeEntries) / sizeof(spv_operand_desc_t),
1325 samplerAddressingModeEntries},
1326 {SPV_OPERAND_TYPE_SAMPLER_FILTER_MODE,
1327 sizeof(samplerFilterModeEntries) / sizeof(spv_operand_desc_t),
1328 samplerFilterModeEntries},
David Netob30a0c52015-09-16 15:56:43 -04001329 {SPV_OPERAND_TYPE_SAMPLER_IMAGE_FORMAT,
1330 sizeof(samplerImageFormatEntries) / sizeof(spv_operand_desc_t),
1331 samplerImageFormatEntries},
David Netoee1b3bb2015-09-18 11:19:18 -04001332 {SPV_OPERAND_TYPE_OPTIONAL_IMAGE,
1333 sizeof(imageOperandEntries) / sizeof(spv_operand_desc_t),
1334 imageOperandEntries},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001335 {SPV_OPERAND_TYPE_FP_FAST_MATH_MODE,
1336 sizeof(fpFastMathModeEntries) / sizeof(spv_operand_desc_t),
1337 fpFastMathModeEntries},
1338 {SPV_OPERAND_TYPE_FP_ROUNDING_MODE,
1339 sizeof(fpRoundingModeEntries) / sizeof(spv_operand_desc_t),
1340 fpRoundingModeEntries},
1341 {SPV_OPERAND_TYPE_LINKAGE_TYPE,
1342 sizeof(linkageTypeEntries) / sizeof(spv_operand_desc_t),
1343 linkageTypeEntries},
1344 {SPV_OPERAND_TYPE_ACCESS_QUALIFIER,
1345 sizeof(accessQualifierEntries) / sizeof(spv_operand_desc_t),
1346 accessQualifierEntries},
1347 {SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE,
1348 sizeof(functionParameterAttributeEntries) / sizeof(spv_operand_desc_t),
1349 functionParameterAttributeEntries},
1350 {SPV_OPERAND_TYPE_DECORATION,
1351 sizeof(decorationEntries) / sizeof(spv_operand_desc_t), decorationEntries},
1352 {SPV_OPERAND_TYPE_BUILT_IN,
1353 sizeof(builtInEntries) / sizeof(spv_operand_desc_t), builtInEntries},
1354 {SPV_OPERAND_TYPE_SELECTION_CONTROL,
1355 sizeof(selectionControlEntries) / sizeof(spv_operand_desc_t),
1356 selectionControlEntries},
1357 {SPV_OPERAND_TYPE_LOOP_CONTROL,
1358 sizeof(loopControlEntries) / sizeof(spv_operand_desc_t),
1359 loopControlEntries},
1360 {SPV_OPERAND_TYPE_FUNCTION_CONTROL,
1361 sizeof(functionControlEntries) / sizeof(spv_operand_desc_t),
1362 functionControlEntries},
1363 {SPV_OPERAND_TYPE_MEMORY_SEMANTICS,
1364 sizeof(memorySemanticsEntries) / sizeof(spv_operand_desc_t),
1365 memorySemanticsEntries},
David Neto78c3b432015-08-27 13:03:52 -04001366 {SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001367 sizeof(memoryAccessEntries) / sizeof(spv_operand_desc_t),
1368 memoryAccessEntries},
1369 {SPV_OPERAND_TYPE_EXECUTION_SCOPE,
1370 sizeof(scopeEntries) / sizeof(spv_operand_desc_t), scopeEntries},
1371 {SPV_OPERAND_TYPE_GROUP_OPERATION,
1372 sizeof(groupOperationEntries) / sizeof(spv_operand_desc_t),
1373 groupOperationEntries},
1374 {SPV_OPERAND_TYPE_KERNEL_ENQ_FLAGS,
1375 sizeof(kernelKernelEnqueueFlagssEntries) / sizeof(spv_operand_desc_t),
1376 kernelKernelEnqueueFlagssEntries},
David Neto47994822015-08-27 13:11:01 -04001377 {SPV_OPERAND_TYPE_KERNEL_PROFILING_INFO,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001378 sizeof(kernelProfilingInfoEntries) / sizeof(spv_operand_desc_t),
1379 kernelProfilingInfoEntries},
1380 {SPV_OPERAND_TYPE_CAPABILITY,
1381 sizeof(capabilityInfoEntries) / sizeof(spv_operand_desc_t),
1382 capabilityInfoEntries},
1383};
1384
1385spv_result_t spvOperandTableGet(spv_operand_table *pOperandTable) {
Lei Zhang40056702015-09-11 14:31:27 -04001386 if (!pOperandTable) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001387
1388 static const spv_operand_table_t table = {
1389 sizeof(opcodeEntryTypes) / sizeof(spv_operand_desc_group_t),
1390 opcodeEntryTypes};
1391
1392 *pOperandTable = &table;
1393
1394 return SPV_SUCCESS;
1395}
1396
1397spv_result_t spvOperandTableNameLookup(const spv_operand_table table,
1398 const spv_operand_type_t type,
David Neto388c40d2015-09-16 16:42:56 -04001399 const char* name,
1400 const size_t nameLength,
1401 spv_operand_desc* pEntry) {
Lei Zhang40056702015-09-11 14:31:27 -04001402 if (!table) return SPV_ERROR_INVALID_TABLE;
1403 if (!name || !pEntry) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001404
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001405 for (uint64_t typeIndex = 0; typeIndex < table->count; ++typeIndex) {
1406 if (type == table->types[typeIndex].type) {
1407 for (uint64_t operandIndex = 0;
1408 operandIndex < table->types[typeIndex].count; ++operandIndex) {
1409 if (nameLength ==
1410 strlen(table->types[typeIndex].entries[operandIndex].name) &&
1411 !strncmp(table->types[typeIndex].entries[operandIndex].name, name,
David Neto388c40d2015-09-16 16:42:56 -04001412 nameLength)) {
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001413 *pEntry = &table->types[typeIndex].entries[operandIndex];
1414 return SPV_SUCCESS;
1415 }
1416 }
1417 }
1418 }
1419
1420 return SPV_ERROR_INVALID_LOOKUP;
1421}
1422
1423spv_result_t spvOperandTableValueLookup(const spv_operand_table table,
1424 const spv_operand_type_t type,
1425 const uint32_t value,
1426 spv_operand_desc *pEntry) {
Lei Zhang40056702015-09-11 14:31:27 -04001427 if (!table) return SPV_ERROR_INVALID_TABLE;
1428 if (!pEntry) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001429
1430 for (uint64_t typeIndex = 0; typeIndex < table->count; ++typeIndex) {
1431 if (type == table->types[typeIndex].type) {
1432 for (uint64_t operandIndex = 0;
1433 operandIndex < table->types[typeIndex].count; ++operandIndex) {
1434 if (value == table->types[typeIndex].entries[operandIndex].value) {
1435 *pEntry = &table->types[typeIndex].entries[operandIndex];
1436 return SPV_SUCCESS;
1437 }
1438 }
1439 }
1440 }
1441
1442 return SPV_ERROR_INVALID_LOOKUP;
1443}
1444
1445const char *spvOperandTypeStr(spv_operand_type_t type) {
1446 switch (type) {
1447 case SPV_OPERAND_TYPE_ID:
David Netofadbf622015-09-14 17:07:11 -04001448 case SPV_OPERAND_TYPE_OPTIONAL_ID:
1449 case SPV_OPERAND_TYPE_ID_IN_OPTIONAL_TUPLE:
1450 return "ID";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001451 case SPV_OPERAND_TYPE_RESULT_ID:
1452 return "result ID";
1453 case SPV_OPERAND_TYPE_LITERAL:
1454 return "literal";
1455 case SPV_OPERAND_TYPE_LITERAL_NUMBER:
1456 return "literal number";
Lei Zhangb41d1502015-09-14 15:22:23 -04001457 case SPV_OPERAND_TYPE_MULTIWORD_LITERAL_NUMBER:
1458 return "multiple word literal number";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001459 case SPV_OPERAND_TYPE_LITERAL_STRING:
1460 return "literal string";
1461 case SPV_OPERAND_TYPE_SOURCE_LANGUAGE:
1462 return "source langauge";
1463 case SPV_OPERAND_TYPE_EXECUTION_MODEL:
1464 return "execution model";
1465 case SPV_OPERAND_TYPE_ADDRESSING_MODEL:
1466 return "addressing model";
1467 case SPV_OPERAND_TYPE_MEMORY_MODEL:
1468 return "memory model";
1469 case SPV_OPERAND_TYPE_EXECUTION_MODE:
1470 return "execution mode";
1471 case SPV_OPERAND_TYPE_STORAGE_CLASS:
1472 return "storage class";
1473 case SPV_OPERAND_TYPE_DIMENSIONALITY:
1474 return "dimensionality";
1475 case SPV_OPERAND_TYPE_SAMPLER_ADDRESSING_MODE:
1476 return "addressing mode";
1477 case SPV_OPERAND_TYPE_SAMPLER_FILTER_MODE:
1478 return "sampler filter mode";
David Netob30a0c52015-09-16 15:56:43 -04001479 case SPV_OPERAND_TYPE_SAMPLER_IMAGE_FORMAT:
1480 return "sampler image format";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001481 case SPV_OPERAND_TYPE_FP_FAST_MATH_MODE:
1482 return "floating pointer fast math mode";
1483 case SPV_OPERAND_TYPE_FP_ROUNDING_MODE:
1484 return "floating point rounding mode";
1485 case SPV_OPERAND_TYPE_LINKAGE_TYPE:
1486 return "linkage type";
1487 case SPV_OPERAND_TYPE_ACCESS_QUALIFIER:
1488 return "access qualifier";
1489 case SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE:
1490 return "function parameter attribute";
1491 case SPV_OPERAND_TYPE_DECORATION:
1492 return "decoration";
1493 case SPV_OPERAND_TYPE_BUILT_IN:
1494 return "built in";
1495 case SPV_OPERAND_TYPE_SELECTION_CONTROL:
1496 return "selection control";
1497 case SPV_OPERAND_TYPE_LOOP_CONTROL:
1498 return "loop control";
1499 case SPV_OPERAND_TYPE_FUNCTION_CONTROL:
1500 return "function control";
1501 case SPV_OPERAND_TYPE_MEMORY_SEMANTICS:
1502 return "memory semantics";
David Neto78c3b432015-08-27 13:03:52 -04001503 case SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001504 return "memory access";
1505 case SPV_OPERAND_TYPE_EXECUTION_SCOPE:
David Netofadbf622015-09-14 17:07:11 -04001506 return "execution scope ID";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001507 case SPV_OPERAND_TYPE_GROUP_OPERATION:
1508 return "group operation";
1509 case SPV_OPERAND_TYPE_KERNEL_ENQ_FLAGS:
1510 return "kernel enqeue flags";
David Neto47994822015-08-27 13:11:01 -04001511 case SPV_OPERAND_TYPE_KERNEL_PROFILING_INFO:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001512 return "kernel profiling info";
1513 case SPV_OPERAND_TYPE_CAPABILITY:
1514 return "capability";
David Netoee1b3bb2015-09-18 11:19:18 -04001515 case SPV_OPERAND_TYPE_OPTIONAL_IMAGE:
1516 return "image operand";
David Neto78c3b432015-08-27 13:03:52 -04001517 case SPV_OPERAND_TYPE_NONE:
1518 return "NONE";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001519 default:
1520 assert(0 && "Unhandled operand type!");
1521 break;
1522 }
1523 return "unknown";
1524}
David Neto78c3b432015-08-27 13:03:52 -04001525
1526void spvPrependOperandTypes(const spv_operand_type_t* types,
1527 spv_operand_pattern_t* pattern) {
1528 const spv_operand_type_t* endTypes;
1529 for (endTypes = types ; *endTypes != SPV_OPERAND_TYPE_NONE ; ++endTypes)
1530 ;
1531 pattern->insert(pattern->begin(), types, endTypes);
1532}
1533
David Neto5bf88fc2015-09-17 17:06:10 -04001534void spvPrependOperandTypesForMask(const spv_operand_table operandTable,
1535 const spv_operand_type_t type,
1536 const uint32_t mask,
1537 spv_operand_pattern_t* pattern) {
1538 // Scan from highest bits to lowest bits because we will prepend in LIFO
1539 // fashion, and we need the operands for lower order bits to appear first.
1540 for (uint32_t candidate_bit = (1 << 31); candidate_bit; candidate_bit >>= 1) {
1541 if (candidate_bit & mask) {
1542 spv_operand_desc entry = nullptr;
1543 if (SPV_SUCCESS == spvOperandTableValueLookup(operandTable, type,
1544 candidate_bit, &entry)) {
1545 spvPrependOperandTypes(entry->operandTypes, pattern);
1546 }
1547 }
1548 }
1549}
1550
David Neto78c3b432015-08-27 13:03:52 -04001551bool spvOperandIsOptional(spv_operand_type_t type) {
1552 // Variable means zero or more times.
1553 if (spvOperandIsVariable(type))
1554 return true;
1555
1556 switch (type) {
1557 case SPV_OPERAND_TYPE_OPTIONAL_ID:
1558 case SPV_OPERAND_TYPE_OPTIONAL_IMAGE:
1559 case SPV_OPERAND_TYPE_OPTIONAL_LITERAL:
1560 case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_STRING:
1561 case SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS:
1562 case SPV_OPERAND_TYPE_OPTIONAL_EXECUTION_MODE:
1563 return true;
1564 default:
1565 break;
1566 }
1567 return false;
1568}
1569
1570bool spvOperandIsVariable(spv_operand_type_t type) {
1571 switch (type) {
1572 case SPV_OPERAND_TYPE_VARIABLE_ID:
1573 case SPV_OPERAND_TYPE_VARIABLE_LITERAL:
1574 case SPV_OPERAND_TYPE_VARIABLE_ID_LITERAL:
1575 case SPV_OPERAND_TYPE_VARIABLE_LITERAL_ID:
David Neto78c3b432015-08-27 13:03:52 -04001576 case SPV_OPERAND_TYPE_VARIABLE_EXECUTION_MODE:
1577 return true;
1578 default:
1579 break;
1580 }
1581 return false;
1582}
1583
1584
1585bool spvExpandOperandSequenceOnce(spv_operand_type_t type,
1586 spv_operand_pattern_t* pattern) {
1587 switch (type) {
1588 case SPV_OPERAND_TYPE_VARIABLE_ID:
1589 pattern->insert(pattern->begin(), {SPV_OPERAND_TYPE_OPTIONAL_ID, type});
1590 return true;
1591 case SPV_OPERAND_TYPE_VARIABLE_LITERAL:
1592 pattern->insert(pattern->begin(),
1593 {SPV_OPERAND_TYPE_OPTIONAL_LITERAL, type});
1594 return true;
1595 case SPV_OPERAND_TYPE_VARIABLE_LITERAL_ID:
1596 // Represents Zero or more (Literal, Id) pairs.
1597 pattern->insert(pattern->begin(),
1598 {SPV_OPERAND_TYPE_OPTIONAL_LITERAL,
1599 SPV_OPERAND_TYPE_ID_IN_OPTIONAL_TUPLE, type});
1600 return true;
1601 case SPV_OPERAND_TYPE_VARIABLE_ID_LITERAL:
1602 // Represents Zero or more (Id, Literal) pairs.
1603 pattern->insert(pattern->begin(),
1604 {SPV_OPERAND_TYPE_OPTIONAL_ID,
1605 SPV_OPERAND_TYPE_LITERAL_IN_OPTIONAL_TUPLE, type});
1606 return true;
David Neto78c3b432015-08-27 13:03:52 -04001607 case SPV_OPERAND_TYPE_VARIABLE_EXECUTION_MODE:
1608 pattern->insert(pattern->begin(), {SPV_OPERAND_TYPE_OPTIONAL_EXECUTION_MODE, type});
1609 return true;
1610 default:
1611 break;
1612 }
1613 return false;
1614}
1615
1616spv_operand_type_t spvTakeFirstMatchableOperand(spv_operand_pattern_t* pattern) {
1617 assert(!pattern->empty());
1618 spv_operand_type_t result;
1619 do {
1620 result = pattern->front();
1621 pattern->pop_front();
1622 } while(spvExpandOperandSequenceOnce(result, pattern));
1623 return result;
1624}