blob: e53c48f89a9c306741b8df40198d3749ea5563e6 [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,
Dejan Mircevski205408b2015-09-30 16:42:34 -040059 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010060 {SPV_OPERAND_TYPE_NONE}},
61 {"TessellationControl",
62 ExecutionModelTessellationControl,
63 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -040064 SPV_CAPABILITY_AS_MASK(CapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010065 {SPV_OPERAND_TYPE_NONE}},
66 {"TessellationEvaluation",
67 ExecutionModelTessellationEvaluation,
68 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -040069 SPV_CAPABILITY_AS_MASK(CapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010070 {SPV_OPERAND_TYPE_NONE}},
71 {"Geometry",
72 ExecutionModelGeometry,
73 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -040074 SPV_CAPABILITY_AS_MASK(CapabilityGeometry),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010075 {SPV_OPERAND_TYPE_NONE}},
76 {"Fragment",
77 ExecutionModelFragment,
78 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -040079 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010080 {SPV_OPERAND_TYPE_NONE}},
81 {"GLCompute",
82 ExecutionModelGLCompute,
83 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -040084 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010085 {SPV_OPERAND_TYPE_NONE}},
86 {"Kernel",
87 ExecutionModelKernel,
88 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -040089 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010090 {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,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400102 SPV_CAPABILITY_AS_MASK(CapabilityAddresses),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100103 {SPV_OPERAND_TYPE_NONE}},
104 {"Physical64",
105 AddressingModelPhysical64,
106 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400107 SPV_CAPABILITY_AS_MASK(CapabilityAddresses),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100108 {SPV_OPERAND_TYPE_NONE}},
109};
110
111static const spv_operand_desc_t memoryModelEntries[] = {
112 {"Simple",
113 MemoryModelSimple,
114 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400115 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100116 {SPV_OPERAND_TYPE_NONE}},
117 {"GLSL450",
118 MemoryModelGLSL450,
119 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400120 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100121 {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,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400125 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100126 {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,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400168 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100169 {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,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400177 SPV_CAPABILITY_AS_MASK(CapabilityGeometry) |
178 SPV_CAPABILITY_AS_MASK(CapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100179 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang85c6f792015-09-23 15:42:18 -0400180 {ExecMode0(InputTrianglesAdjacency, Geometry)},
181 {ExecMode0(InputQuads, Tessellation)},
182 {ExecMode0(InputIsolines, Tessellation)},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100183 {"OutputVertices",
184 ExecutionModeOutputVertices,
185 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400186 SPV_CAPABILITY_AS_MASK(CapabilityGeometry) |
187 SPV_CAPABILITY_AS_MASK(CapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100188 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
Lei Zhang85c6f792015-09-23 15:42:18 -0400189 {ExecMode0(OutputPoints, Geometry)},
190 {ExecMode0(OutputLineStrip, Geometry)},
191 {ExecMode0(OutputTriangleStrip, Geometry)},
192 {ExecMode1(VecTypeHint, Kernel)},
193 {ExecMode0(ContractionOff, Kernel)},
194 {ExecMode0(IndependentForwardProgress, Kernel)},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100195};
Lei Zhang85c6f792015-09-23 15:42:18 -0400196#undef ExecMode0
197#undef ExecMode1
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100198
199static const spv_operand_desc_t storageClassEntries[] = {
Dejan Mircevski50babb22015-09-29 10:56:32 -0400200 // TODO(dneto): There are more storage classes in Rev32 and later.
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100201 {"UniformConstant",
202 StorageClassUniformConstant,
203 SPV_OPCODE_FLAGS_NONE,
204 0,
205 {SPV_OPERAND_TYPE_NONE}},
206 {"Input",
207 StorageClassInput,
208 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400209 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100210 {SPV_OPERAND_TYPE_NONE}},
211 {"Uniform",
212 StorageClassUniform,
213 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400214 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100215 {SPV_OPERAND_TYPE_NONE}},
216 {"Output",
217 StorageClassOutput,
218 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400219 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100220 {SPV_OPERAND_TYPE_NONE}},
221 {"WorkgroupLocal",
222 StorageClassWorkgroupLocal,
223 SPV_OPCODE_FLAGS_NONE,
224 0,
225 {SPV_OPERAND_TYPE_NONE}},
226 {"WorkgroupGlobal",
227 StorageClassWorkgroupGlobal,
228 SPV_OPCODE_FLAGS_NONE,
229 0,
230 {SPV_OPERAND_TYPE_NONE}},
231 {"PrivateGlobal",
232 StorageClassPrivateGlobal,
233 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400234 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100235 {SPV_OPERAND_TYPE_NONE}},
236 {"Function",
237 StorageClassFunction,
238 SPV_OPCODE_FLAGS_NONE,
239 0,
240 {SPV_OPERAND_TYPE_NONE}},
241 {"Generic",
242 StorageClassGeneric,
243 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400244 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100245 {SPV_OPERAND_TYPE_NONE}},
David Neto9819adf2015-09-23 10:19:57 -0400246 {"PushConstant",
247 StorageClassPushConstant,
248 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400249 SPV_CAPABILITY_AS_MASK(CapabilityShader),
David Neto9819adf2015-09-23 10:19:57 -0400250 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100251 {"AtomicCounter",
252 StorageClassAtomicCounter,
253 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400254 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100255 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400256 {"Image",
257 StorageClassImage,
258 SPV_OPCODE_FLAGS_NONE,
259 0,
260 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100261};
262
263static const spv_operand_desc_t dimensionalityEntries[] = {
Dejan Mircevski50babb22015-09-29 10:56:32 -0400264 // TODO(dneto): Update capability dependencies for Rev32
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100265 {"1D", Dim1D, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_NONE}},
266 {"2D", Dim2D, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_NONE}},
267 {"3D", Dim3D, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_NONE}},
268 {"Cube",
269 DimCube,
270 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400271 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100272 {SPV_OPERAND_TYPE_NONE}},
273 {"Rect",
274 DimRect,
275 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400276 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100277 {SPV_OPERAND_TYPE_NONE}},
278 {"Buffer", DimBuffer, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_NONE}},
David Netoaa0c3a52015-09-23 10:30:06 -0400279 {"InputTarget",
280 DimInputTarget,
281 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400282 SPV_CAPABILITY_AS_MASK(CapabilityInputTarget),
David Netoaa0c3a52015-09-23 10:30:06 -0400283 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100284};
285
286static const spv_operand_desc_t samplerAddressingModeEntries[] = {
287 {"None",
288 SamplerAddressingModeNone,
289 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400290 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100291 {SPV_OPERAND_TYPE_NONE}},
292 {"ClampToEdge",
293 SamplerAddressingModeClampToEdge,
294 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400295 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100296 {SPV_OPERAND_TYPE_NONE}},
297 {"Clamp",
298 SamplerAddressingModeClamp,
299 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400300 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100301 {SPV_OPERAND_TYPE_NONE}},
302 {"Repeat",
303 SamplerAddressingModeRepeat,
304 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400305 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100306 {SPV_OPERAND_TYPE_NONE}},
307 {"RepeatMirrored",
308 SamplerAddressingModeRepeatMirrored,
309 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400310 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100311 {SPV_OPERAND_TYPE_NONE}},
312};
313
314static const spv_operand_desc_t samplerFilterModeEntries[] = {
315 {"Nearest",
316 SamplerFilterModeNearest,
317 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400318 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100319 {SPV_OPERAND_TYPE_NONE}},
320 {"Linear",
321 SamplerFilterModeLinear,
322 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400323 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100324 {SPV_OPERAND_TYPE_NONE}},
325};
326
David Netob30a0c52015-09-16 15:56:43 -0400327static const spv_operand_desc_t samplerImageFormatEntries[] = {
328// In Rev31, all the cases depend on the Shader capability.
329// TODO(dneto): In Rev32, many of these depend on the AdvancedFormats
330// capability instead.
Dejan Mircevski205408b2015-09-30 16:42:34 -0400331#define CASE(NAME) \
332 { \
333 #NAME, ImageFormat##NAME, SPV_OPCODE_FLAGS_CAPABILITIES, \
334 SPV_CAPABILITY_AS_MASK(CapabilityShader), { \
335 SPV_OPERAND_TYPE_NONE \
336 } \
David Netob30a0c52015-09-16 15:56:43 -0400337 }
Dejan Mircevski50babb22015-09-29 10:56:32 -0400338 // clang-format off
David Netob30a0c52015-09-16 15:56:43 -0400339 CASE(Unknown),
340 CASE(Rgba32f),
341 CASE(Rgba16f),
342 CASE(R32f),
343 CASE(Rgba8),
344 CASE(Rgba8Snorm),
345 CASE(Rg32f),
346 CASE(Rg16f),
347 CASE(R11fG11fB10f),
348 CASE(R16f),
349 CASE(Rgba16),
350 CASE(Rgb10A2),
351 CASE(Rg16),
352 CASE(Rg8),
353 CASE(R16),
354 CASE(R8),
355 CASE(Rgba16Snorm),
356 CASE(Rg16Snorm),
357 CASE(Rg8Snorm),
358 CASE(R16Snorm),
359 CASE(R8Snorm),
360 CASE(Rgba32i),
361 CASE(Rgba16i),
362 CASE(Rgba8i),
363 CASE(R32i),
364 CASE(Rg32i),
365 CASE(Rg16i),
366 CASE(Rg8i),
367 CASE(R16i),
368 CASE(R8i),
369 CASE(Rgba32ui),
370 CASE(Rgba16ui),
371 CASE(Rgba8ui),
372 CASE(R32ui),
373 CASE(Rgb10a2ui),
374 CASE(Rg32ui),
375 CASE(Rg16ui),
376 CASE(Rg8ui),
377 CASE(R16ui),
378 CASE(R8ui),
Dejan Mircevski50babb22015-09-29 10:56:32 -0400379// clang-format on
David Netob30a0c52015-09-16 15:56:43 -0400380#undef CASE
381};
382
David Netoee1b3bb2015-09-18 11:19:18 -0400383// Image operand definitions. Each enum value is a mask. When that mask
384// bit is set, the instruction should have further ID operands.
385// Some mask values depend on a capability.
386static const spv_operand_desc_t imageOperandEntries[] = {
387// Rev32 and later adds many more enums.
388#define CASE(NAME) \
389 #NAME, spv::ImageOperands##NAME##Mask, SPV_OPCODE_FLAGS_NONE, 0
390#define CASE_CAP(NAME, CAP) \
391 #NAME, spv::ImageOperands##NAME##Mask, SPV_OPCODE_FLAGS_CAPABILITIES, CAP
392#define ID SPV_OPERAND_TYPE_ID
393#define NONE SPV_OPERAND_TYPE_NONE
394 {"None", spv::ImageOperandsMaskNone, SPV_OPCODE_FLAGS_NONE, 0, {NONE}},
Dejan Mircevski205408b2015-09-30 16:42:34 -0400395 {CASE_CAP(Bias, SPV_CAPABILITY_AS_MASK(CapabilityShader)), {ID, NONE}},
David Netoee1b3bb2015-09-18 11:19:18 -0400396 {CASE(Lod), {ID, NONE}},
397 {CASE(Grad), {ID, ID, NONE}},
398 {CASE(ConstOffset), {ID, NONE}},
Dejan Mircevski205408b2015-09-30 16:42:34 -0400399 {CASE_CAP(Offset, SPV_CAPABILITY_AS_MASK(CapabilityImageGatherExtended)),
400 {ID, NONE}},
David Netoee1b3bb2015-09-18 11:19:18 -0400401 {CASE(ConstOffsets), {ID, NONE}},
402 {CASE(Sample), {ID, NONE}},
Dejan Mircevski205408b2015-09-30 16:42:34 -0400403 {CASE_CAP(MinLod, SPV_CAPABILITY_AS_MASK(CapabilityMinLod)), {ID, NONE}},
David Netoee1b3bb2015-09-18 11:19:18 -0400404#undef CASE
405#undef CASE_CAP
406#undef ID
407#undef NONE
408};
409
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100410static const spv_operand_desc_t fpFastMathModeEntries[] = {
411 {"None",
412 FPFastMathModeMaskNone,
413 SPV_OPCODE_FLAGS_NONE,
414 0,
415 {SPV_OPERAND_TYPE_NONE}},
416 {"NotNaN",
417 FPFastMathModeNotNaNMask,
418 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400419 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100420 {SPV_OPERAND_TYPE_NONE}},
421 {"NotInf",
422 FPFastMathModeNotInfMask,
423 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400424 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100425 {SPV_OPERAND_TYPE_NONE}},
426 {"NSZ",
427 FPFastMathModeNSZMask,
428 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400429 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100430 {SPV_OPERAND_TYPE_NONE}},
431 {"AllowRecip",
432 FPFastMathModeAllowRecipMask,
433 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400434 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100435 {SPV_OPERAND_TYPE_NONE}},
436 {"Fast",
437 FPFastMathModeFastMask,
438 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400439 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100440 {SPV_OPERAND_TYPE_NONE}},
441};
442
443static const spv_operand_desc_t fpRoundingModeEntries[] = {
444 {"RTE",
445 FPRoundingModeRTE,
446 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400447 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100448 {SPV_OPERAND_TYPE_NONE}},
449 {"RTZ",
450 FPRoundingModeRTZ,
451 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400452 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100453 {SPV_OPERAND_TYPE_NONE}},
454 {"RTP",
455 FPRoundingModeRTP,
456 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400457 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100458 {SPV_OPERAND_TYPE_NONE}},
459 {"RTN",
460 FPRoundingModeRTN,
461 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400462 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100463 {SPV_OPERAND_TYPE_NONE}},
464};
465
466static const spv_operand_desc_t linkageTypeEntries[] = {
467 {"Export",
468 LinkageTypeExport,
469 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400470 SPV_CAPABILITY_AS_MASK(CapabilityLinkage),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100471 {SPV_OPERAND_TYPE_NONE}},
472 {"Import",
473 LinkageTypeImport,
474 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400475 SPV_CAPABILITY_AS_MASK(CapabilityLinkage),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100476 {SPV_OPERAND_TYPE_NONE}},
477};
478
479static const spv_operand_desc_t accessQualifierEntries[] = {
480 {"ReadOnly",
481 AccessQualifierReadOnly,
482 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400483 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100484 {SPV_OPERAND_TYPE_NONE}},
485 {"WriteOnly",
486 AccessQualifierWriteOnly,
487 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400488 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100489 {SPV_OPERAND_TYPE_NONE}},
490 {"ReadWrite",
491 AccessQualifierReadWrite,
492 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400493 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100494 {SPV_OPERAND_TYPE_NONE}},
495};
496
497static const spv_operand_desc_t functionParameterAttributeEntries[] = {
498 {"Zext",
499 FunctionParameterAttributeZext,
500 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400501 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100502 {SPV_OPERAND_TYPE_NONE}},
503 {"Sext",
504 FunctionParameterAttributeSext,
505 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400506 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100507 {SPV_OPERAND_TYPE_NONE}},
508 {"ByVal",
509 FunctionParameterAttributeByVal,
510 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400511 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100512 {SPV_OPERAND_TYPE_NONE}},
513 {"Sret",
514 FunctionParameterAttributeSret,
515 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400516 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100517 {SPV_OPERAND_TYPE_NONE}},
518 {"NoAlias",
519 FunctionParameterAttributeNoAlias,
520 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400521 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100522 {SPV_OPERAND_TYPE_NONE}},
David Neto37547b22015-09-10 13:23:11 -0400523 {"NoCapture",
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100524 FunctionParameterAttributeNoCapture,
525 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400526 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100527 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100528 {"NoWrite",
529 FunctionParameterAttributeNoWrite,
530 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400531 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100532 {SPV_OPERAND_TYPE_NONE}},
533 {"NoReadWrite",
534 FunctionParameterAttributeNoReadWrite,
535 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400536 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100537 {SPV_OPERAND_TYPE_NONE}},
538};
539
540static const spv_operand_desc_t decorationEntries[] = {
Lei Zhang604e5ce2015-08-14 14:46:43 -0400541 {"RelaxedPrecision",
542 DecorationRelaxedPrecision,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100543 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400544 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100545 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400546 {
Dejan Mircevski50babb22015-09-29 10:56:32 -0400547 "SpecId",
548 DecorationSpecId,
549 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400550 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Dejan Mircevski50babb22015-09-29 10:56:32 -0400551 {SPV_OPERAND_TYPE_LITERAL_NUMBER},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400552 },
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100553 {"Block",
554 DecorationBlock,
555 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400556 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100557 {SPV_OPERAND_TYPE_NONE}},
558 {"BufferBlock",
559 DecorationBufferBlock,
560 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400561 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100562 {SPV_OPERAND_TYPE_NONE}},
563 {"RowMajor",
564 DecorationRowMajor,
565 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400566 SPV_CAPABILITY_AS_MASK(CapabilityMatrix),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100567 {SPV_OPERAND_TYPE_NONE}},
568 {"ColMajor",
569 DecorationColMajor,
570 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400571 SPV_CAPABILITY_AS_MASK(CapabilityMatrix),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100572 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400573 {"ArrayStride",
574 DecorationArrayStride,
575 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400576 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Lei Zhang604e5ce2015-08-14 14:46:43 -0400577 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
578 {"MatrixStride",
579 DecorationMatrixStride,
580 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400581 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Lei Zhang604e5ce2015-08-14 14:46:43 -0400582 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100583 {"GLSLShared",
584 DecorationGLSLShared,
585 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400586 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100587 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100588 {"GLSLPacked",
589 DecorationGLSLPacked,
590 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400591 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100592 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400593 {"CPacked",
594 DecorationCPacked,
595 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400596 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Lei Zhang604e5ce2015-08-14 14:46:43 -0400597 {SPV_OPERAND_TYPE_NONE}},
598 {"BuiltIn",
599 DecorationBuiltIn,
600 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400601 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Lei Zhang604e5ce2015-08-14 14:46:43 -0400602 {SPV_OPERAND_TYPE_BUILT_IN, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100603 {"Smooth",
604 DecorationSmooth,
605 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400606 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100607 {SPV_OPERAND_TYPE_NONE}},
David Netodbaf4072015-09-22 16:23:06 -0400608 {"NoPerspective",
609 DecorationNoPerspective,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100610 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400611 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100612 {SPV_OPERAND_TYPE_NONE}},
613 {"Flat",
614 DecorationFlat,
615 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400616 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100617 {SPV_OPERAND_TYPE_NONE}},
618 {"Patch",
619 DecorationPatch,
620 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400621 SPV_CAPABILITY_AS_MASK(CapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100622 {SPV_OPERAND_TYPE_NONE}},
623 {"Centroid",
624 DecorationCentroid,
625 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400626 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100627 {SPV_OPERAND_TYPE_NONE}},
628 {"Sample",
629 DecorationSample,
630 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400631 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100632 {SPV_OPERAND_TYPE_NONE}},
633 {"Invariant",
634 DecorationInvariant,
635 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400636 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100637 {SPV_OPERAND_TYPE_NONE}},
638 {"Restrict",
639 DecorationRestrict,
640 SPV_OPCODE_FLAGS_NONE,
641 0,
642 {SPV_OPERAND_TYPE_NONE}},
643 {"Aliased",
644 DecorationAliased,
645 SPV_OPCODE_FLAGS_NONE,
646 0,
647 {SPV_OPERAND_TYPE_NONE}},
648 {"Volatile",
649 DecorationVolatile,
650 SPV_OPCODE_FLAGS_NONE,
651 0,
652 {SPV_OPERAND_TYPE_NONE}},
653 {"Constant",
654 DecorationConstant,
655 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400656 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100657 {SPV_OPERAND_TYPE_NONE}},
658 {"Coherent",
659 DecorationCoherent,
660 SPV_OPCODE_FLAGS_NONE,
661 0,
662 {SPV_OPERAND_TYPE_NONE}},
David Netodbaf4072015-09-22 16:23:06 -0400663 {"NonWritable",
664 DecorationNonWritable,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100665 SPV_OPCODE_FLAGS_NONE,
666 0,
667 {SPV_OPERAND_TYPE_NONE}},
David Netodbaf4072015-09-22 16:23:06 -0400668 {"NonReadable",
669 DecorationNonReadable,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100670 SPV_OPCODE_FLAGS_NONE,
671 0,
672 {SPV_OPERAND_TYPE_NONE}},
673 {"Uniform",
674 DecorationUniform,
675 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400676 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100677 {SPV_OPERAND_TYPE_NONE}},
David Neto37547b22015-09-10 13:23:11 -0400678 {"SaturatedConversion",
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100679 DecorationSaturatedConversion,
680 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400681 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100682 {SPV_OPERAND_TYPE_NONE}},
683 {"Stream",
684 DecorationStream,
685 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400686 SPV_CAPABILITY_AS_MASK(CapabilityGeometry),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100687 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
688 {"Location",
689 DecorationLocation,
690 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400691 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100692 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
693 {"Component",
694 DecorationComponent,
695 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400696 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100697 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
698 {"Index",
699 DecorationIndex,
700 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400701 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100702 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
703 {"Binding",
704 DecorationBinding,
705 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400706 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100707 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
708 {"DescriptorSet",
709 DecorationDescriptorSet,
710 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400711 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100712 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
713 {"Offset",
714 DecorationOffset,
715 SPV_OPCODE_FLAGS_NONE,
716 0,
717 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100718 {"XfbBuffer",
719 DecorationXfbBuffer,
720 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400721 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100722 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400723 {"XfbStride",
724 DecorationXfbStride,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100725 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400726 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100727 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100728 {"FuncParamAttr",
729 DecorationFuncParamAttr,
730 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400731 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100732 {SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE, SPV_OPERAND_TYPE_NONE}},
733 {"FPRoundingMode",
734 DecorationFPRoundingMode,
735 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400736 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100737 {SPV_OPERAND_TYPE_FP_ROUNDING_MODE, SPV_OPERAND_TYPE_NONE}},
738 {"FPFastMathMode",
David Neto37547b22015-09-10 13:23:11 -0400739 DecorationFPFastMathMode,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100740 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400741 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100742 {SPV_OPERAND_TYPE_FP_FAST_MATH_MODE, SPV_OPERAND_TYPE_NONE}},
743 {"LinkageAttributes",
744 DecorationLinkageAttributes,
745 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400746 SPV_CAPABILITY_AS_MASK(CapabilityLinkage),
Dejan Mircevski50babb22015-09-29 10:56:32 -0400747 {SPV_OPERAND_TYPE_LITERAL_STRING, SPV_OPERAND_TYPE_LINKAGE_TYPE,
748 SPV_OPERAND_TYPE_NONE}},
David Netod7687982015-09-23 14:59:27 -0400749 {"NoContraction",
750 DecorationNoContraction,
751 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400752 SPV_CAPABILITY_AS_MASK(CapabilityShader),
David Netod7687982015-09-23 14:59:27 -0400753 {SPV_OPERAND_TYPE_NONE}},
754 {"InputTargetIndex",
755 DecorationInputTargetIndex,
756 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400757 SPV_CAPABILITY_AS_MASK(CapabilityShader), // TODO(dneto): Should this be
758 // CapabilityInputTarget?
Dejan Mircevski50babb22015-09-29 10:56:32 -0400759 {SPV_OPERAND_TYPE_NONE}}, // TODO(dneto): Should this have a literal
760 // number argument?
David Netod7687982015-09-23 14:59:27 -0400761 {"Alignment",
762 DecorationAlignment,
763 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400764 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
David Netod7687982015-09-23 14:59:27 -0400765 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100766};
767
768static const spv_operand_desc_t builtInEntries[] = {
769 {"Position",
770 BuiltInPosition,
771 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400772 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100773 {SPV_OPERAND_TYPE_NONE}},
774 {"PointSize",
775 BuiltInPointSize,
776 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400777 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100778 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100779 {"ClipDistance",
780 BuiltInClipDistance,
781 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400782 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100783 {SPV_OPERAND_TYPE_NONE}},
784 {"CullDistance",
785 BuiltInCullDistance,
786 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400787 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100788 {SPV_OPERAND_TYPE_NONE}},
789 {"VertexId",
790 BuiltInVertexId,
791 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400792 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100793 {SPV_OPERAND_TYPE_NONE}},
794 {"InstanceId",
795 BuiltInInstanceId,
796 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400797 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100798 {SPV_OPERAND_TYPE_NONE}},
799 {"PrimitiveId",
800 BuiltInPrimitiveId,
801 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400802 SPV_CAPABILITY_AS_MASK(CapabilityGeometry) |
803 SPV_CAPABILITY_AS_MASK(CapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100804 {SPV_OPERAND_TYPE_NONE}},
805 {"InvocationId",
806 BuiltInInvocationId,
807 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400808 SPV_CAPABILITY_AS_MASK(CapabilityGeometry) |
809 SPV_CAPABILITY_AS_MASK(CapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100810 {SPV_OPERAND_TYPE_NONE}},
811 {"Layer",
812 BuiltInLayer,
813 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400814 SPV_CAPABILITY_AS_MASK(CapabilityGeometry),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100815 {SPV_OPERAND_TYPE_NONE}},
816 {"ViewportIndex",
817 BuiltInViewportIndex,
818 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400819 SPV_CAPABILITY_AS_MASK(CapabilityGeometry),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100820 {SPV_OPERAND_TYPE_NONE}},
821 {"TessLevelOuter",
822 BuiltInTessLevelOuter,
823 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400824 SPV_CAPABILITY_AS_MASK(CapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100825 {SPV_OPERAND_TYPE_NONE}},
826 {"TessLevelInner",
827 BuiltInTessLevelInner,
828 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400829 SPV_CAPABILITY_AS_MASK(CapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100830 {SPV_OPERAND_TYPE_NONE}},
831 {"TessCoord",
832 BuiltInTessCoord,
833 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400834 SPV_CAPABILITY_AS_MASK(CapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100835 {SPV_OPERAND_TYPE_NONE}},
836 {"PatchVertices",
837 BuiltInPatchVertices,
838 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400839 SPV_CAPABILITY_AS_MASK(CapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100840 {SPV_OPERAND_TYPE_NONE}},
841 {"FragCoord",
842 BuiltInFragCoord,
843 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400844 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100845 {SPV_OPERAND_TYPE_NONE}},
846 {"PointCoord",
847 BuiltInPointCoord,
848 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400849 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100850 {SPV_OPERAND_TYPE_NONE}},
851 {"FrontFacing",
852 BuiltInFrontFacing,
853 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400854 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100855 {SPV_OPERAND_TYPE_NONE}},
856 {"SampleId",
857 BuiltInSampleId,
858 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400859 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100860 {SPV_OPERAND_TYPE_NONE}},
861 {"SamplePosition",
862 BuiltInSamplePosition,
863 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400864 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100865 {SPV_OPERAND_TYPE_NONE}},
866 {"SampleMask",
867 BuiltInSampleMask,
868 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400869 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100870 {SPV_OPERAND_TYPE_NONE}},
871 {"FragColor",
872 BuiltInFragColor,
873 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400874 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100875 {SPV_OPERAND_TYPE_NONE}},
876 {"FragDepth",
877 BuiltInFragDepth,
878 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400879 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100880 {SPV_OPERAND_TYPE_NONE}},
881 {"HelperInvocation",
882 BuiltInHelperInvocation,
883 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400884 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100885 {SPV_OPERAND_TYPE_NONE}},
886 {"NumWorkgroups",
887 BuiltInNumWorkgroups,
888 SPV_OPCODE_FLAGS_NONE,
889 0,
890 {SPV_OPERAND_TYPE_NONE}},
891 {"WorkgroupSize",
892 BuiltInWorkgroupSize,
893 SPV_OPCODE_FLAGS_NONE,
894 0,
895 {SPV_OPERAND_TYPE_NONE}},
896 {"WorkgroupId",
897 BuiltInWorkgroupId,
898 SPV_OPCODE_FLAGS_NONE,
899 0,
900 {SPV_OPERAND_TYPE_NONE}},
901 {"LocalInvocationId",
902 BuiltInLocalInvocationId,
903 SPV_OPCODE_FLAGS_NONE,
904 0,
905 {SPV_OPERAND_TYPE_NONE}},
906 {"GlobalInvocationId",
907 BuiltInGlobalInvocationId,
908 SPV_OPCODE_FLAGS_NONE,
909 0,
910 {SPV_OPERAND_TYPE_NONE}},
911 {"LocalInvocationIndex",
David Neto37547b22015-09-10 13:23:11 -0400912 BuiltInLocalInvocationIndex,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100913 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400914 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100915 {SPV_OPERAND_TYPE_NONE}},
916 {"WorkDim",
917 BuiltInWorkDim,
918 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400919 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100920 {SPV_OPERAND_TYPE_NONE}},
921 {"GlobalSize",
922 BuiltInGlobalSize,
923 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400924 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100925 {SPV_OPERAND_TYPE_NONE}},
926 {"EnqueuedWorkgroupSize",
927 BuiltInEnqueuedWorkgroupSize,
928 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400929 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100930 {SPV_OPERAND_TYPE_NONE}},
931 {"GlobalOffset",
932 BuiltInGlobalOffset,
933 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400934 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100935 {SPV_OPERAND_TYPE_NONE}},
936 {"GlobalLinearId",
937 BuiltInGlobalLinearId,
938 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400939 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100940 {SPV_OPERAND_TYPE_NONE}},
941 {"WorkgroupLinearId",
942 BuiltInWorkgroupLinearId,
943 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400944 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100945 {SPV_OPERAND_TYPE_NONE}},
946 {"SubgroupSize",
947 BuiltInSubgroupSize,
948 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400949 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100950 {SPV_OPERAND_TYPE_NONE}},
951 {"SubgroupMaxSize",
952 BuiltInSubgroupMaxSize,
953 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400954 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100955 {SPV_OPERAND_TYPE_NONE}},
956 {"NumSubgroups",
957 BuiltInNumSubgroups,
958 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400959 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100960 {SPV_OPERAND_TYPE_NONE}},
961 {"NumEnqueuedSubgroups",
962 BuiltInNumEnqueuedSubgroups,
963 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400964 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100965 {SPV_OPERAND_TYPE_NONE}},
966 {"SubgroupId",
David Neto37547b22015-09-10 13:23:11 -0400967 BuiltInSubgroupId,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100968 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400969 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100970 {SPV_OPERAND_TYPE_NONE}},
971 {"SubgroupLocalInvocationId",
972 BuiltInSubgroupLocalInvocationId,
973 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400974 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100975 {SPV_OPERAND_TYPE_NONE}},
David Neto2d1b5e52015-09-23 15:35:27 -0400976 {"VertexIndex",
977 BuiltInVertexIndex,
978 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400979 SPV_CAPABILITY_AS_MASK(CapabilityShader),
David Neto2d1b5e52015-09-23 15:35:27 -0400980 {SPV_OPERAND_TYPE_NONE}},
981 {"InstanceIndex",
982 BuiltInInstanceIndex,
983 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400984 SPV_CAPABILITY_AS_MASK(CapabilityShader),
David Neto2d1b5e52015-09-23 15:35:27 -0400985 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100986};
987
988static const spv_operand_desc_t selectionControlEntries[] = {
989 {"None",
990 SelectionControlMaskNone,
991 SPV_OPCODE_FLAGS_NONE,
992 0,
993 {SPV_OPERAND_TYPE_NONE}},
994 {"Flatten",
995 SelectionControlFlattenMask,
996 SPV_OPCODE_FLAGS_NONE,
997 0,
998 {SPV_OPERAND_TYPE_NONE}},
999 {"DontFlatten",
1000 SelectionControlDontFlattenMask,
1001 SPV_OPCODE_FLAGS_NONE,
1002 0,
1003 {SPV_OPERAND_TYPE_NONE}},
1004};
1005
1006static const spv_operand_desc_t loopControlEntries[] = {
1007 {"None",
1008 LoopControlMaskNone,
1009 SPV_OPCODE_FLAGS_NONE,
1010 0,
1011 {SPV_OPERAND_TYPE_NONE}},
1012 {"Unroll",
1013 LoopControlUnrollMask,
1014 SPV_OPCODE_FLAGS_NONE,
1015 0,
1016 {SPV_OPERAND_TYPE_NONE}},
1017 {"DontUnroll",
1018 LoopControlDontUnrollMask,
1019 SPV_OPCODE_FLAGS_NONE,
1020 0,
1021 {SPV_OPERAND_TYPE_NONE}},
1022};
1023
1024static const spv_operand_desc_t functionControlEntries[] = {
1025 {"None",
1026 FunctionControlMaskNone,
1027 SPV_OPCODE_FLAGS_NONE,
1028 0,
1029 {SPV_OPERAND_TYPE_NONE}},
David Netof4fde6c2015-09-14 14:50:37 -04001030 {"Inline",
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001031 FunctionControlInlineMask,
1032 SPV_OPCODE_FLAGS_NONE,
1033 0,
1034 {SPV_OPERAND_TYPE_NONE}},
1035 {"DontInline",
1036 FunctionControlDontInlineMask,
1037 SPV_OPCODE_FLAGS_NONE,
1038 0,
1039 {SPV_OPERAND_TYPE_NONE}},
1040 {"Pure",
1041 FunctionControlPureMask,
1042 SPV_OPCODE_FLAGS_NONE,
1043 0,
1044 {SPV_OPERAND_TYPE_NONE}},
1045 {"Const",
1046 FunctionControlConstMask,
1047 SPV_OPCODE_FLAGS_NONE,
1048 0,
1049 {SPV_OPERAND_TYPE_NONE}},
1050};
1051
1052static const spv_operand_desc_t memorySemanticsEntries[] = {
David Netobfa3d862015-09-25 10:30:27 -04001053 // "Relaxed" should be a synonym for "None".
1054 // Put the Relaxed entry first so that the disassembler
1055 // will prefer to emit "Relaxed".
1056 {"Relaxed",
1057 MemorySemanticsMaskNone,
1058 SPV_OPCODE_FLAGS_NONE,
1059 0,
1060 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001061 {"None",
1062 MemorySemanticsMaskNone,
1063 SPV_OPCODE_FLAGS_NONE,
1064 0,
1065 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001066 {"SequentiallyConsistent",
1067 MemorySemanticsSequentiallyConsistentMask,
1068 SPV_OPCODE_FLAGS_NONE,
1069 0,
1070 {SPV_OPERAND_TYPE_NONE}},
1071 {"Acquire",
1072 MemorySemanticsAcquireMask,
1073 SPV_OPCODE_FLAGS_NONE,
1074 0,
1075 {SPV_OPERAND_TYPE_NONE}},
1076 {"Release",
1077 MemorySemanticsReleaseMask,
1078 SPV_OPCODE_FLAGS_NONE,
1079 0,
1080 {SPV_OPERAND_TYPE_NONE}},
1081 {"UniformMemory",
1082 MemorySemanticsUniformMemoryMask,
1083 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -04001084 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001085 {SPV_OPERAND_TYPE_NONE}},
1086 {"SubgroupMemory",
1087 MemorySemanticsSubgroupMemoryMask,
1088 SPV_OPCODE_FLAGS_NONE,
1089 0,
1090 {SPV_OPERAND_TYPE_NONE}},
1091 {"WorkgroupLocalMemory",
1092 MemorySemanticsWorkgroupLocalMemoryMask,
1093 SPV_OPCODE_FLAGS_NONE,
1094 0,
1095 {SPV_OPERAND_TYPE_NONE}},
1096 {"WorkgroupGlobalMemory",
1097 MemorySemanticsWorkgroupGlobalMemoryMask,
1098 SPV_OPCODE_FLAGS_NONE,
1099 0,
1100 {SPV_OPERAND_TYPE_NONE}},
1101 {"AtomicCounterMemory",
1102 MemorySemanticsAtomicCounterMemoryMask,
1103 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -04001104 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001105 {SPV_OPERAND_TYPE_NONE}},
1106 {
Dejan Mircevski50babb22015-09-29 10:56:32 -04001107 "ImageMemory",
1108 MemorySemanticsImageMemoryMask,
1109 SPV_OPCODE_FLAGS_NONE,
1110 0,
1111 {SPV_OPERAND_TYPE_NONE},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001112 },
1113};
1114
1115static const spv_operand_desc_t memoryAccessEntries[] = {
1116 {"None",
1117 MemoryAccessMaskNone,
1118 SPV_OPCODE_FLAGS_NONE,
1119 0,
1120 {SPV_OPERAND_TYPE_NONE}},
1121 {"Volatile",
1122 MemoryAccessVolatileMask,
1123 SPV_OPCODE_FLAGS_NONE,
1124 0,
1125 {SPV_OPERAND_TYPE_NONE}},
1126 {
Dejan Mircevski50babb22015-09-29 10:56:32 -04001127 "Aligned",
1128 MemoryAccessAlignedMask,
1129 SPV_OPCODE_FLAGS_NONE,
1130 0,
1131 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001132 },
David Neto49c299b2015-09-23 15:38:59 -04001133 {"Nontemporal",
1134 MemoryAccessNontemporalMask,
1135 SPV_OPCODE_FLAGS_NONE,
1136 0,
1137 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001138};
1139
1140static const spv_operand_desc_t scopeEntries[] = {
1141 {"CrossDevice",
1142 ScopeCrossDevice,
1143 SPV_OPCODE_FLAGS_NONE,
1144 0,
1145 {SPV_OPERAND_TYPE_NONE}},
1146 {"Device", ScopeDevice, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_NONE}},
1147 {"Workgroup",
1148 ScopeWorkgroup,
1149 SPV_OPCODE_FLAGS_NONE,
1150 0,
1151 {SPV_OPERAND_TYPE_NONE}},
1152 {"Subgroup",
1153 ScopeSubgroup,
1154 SPV_OPCODE_FLAGS_NONE,
1155 0,
1156 {SPV_OPERAND_TYPE_NONE}},
1157 {
Dejan Mircevski50babb22015-09-29 10:56:32 -04001158 "Invocation",
1159 ScopeInvocation,
1160 SPV_OPCODE_FLAGS_NONE,
1161 0,
1162 {SPV_OPERAND_TYPE_NONE},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001163 },
1164};
1165
1166static const spv_operand_desc_t groupOperationEntries[] = {
1167 {"Reduce",
1168 GroupOperationReduce,
1169 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -04001170 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001171 {SPV_OPERAND_TYPE_NONE}},
1172 {"InclusiveScan",
1173 GroupOperationInclusiveScan,
1174 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -04001175 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001176 {SPV_OPERAND_TYPE_NONE}},
1177 {"ExclusiveScan",
1178 GroupOperationExclusiveScan,
1179 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -04001180 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001181 {SPV_OPERAND_TYPE_NONE}},
1182};
1183
1184static const spv_operand_desc_t kernelKernelEnqueueFlagssEntries[] = {
1185 {"NoWait",
1186 KernelEnqueueFlagsNoWait,
1187 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -04001188 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001189 {SPV_OPERAND_TYPE_NONE}},
1190 {"WaitKernel",
1191 KernelEnqueueFlagsWaitKernel,
1192 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -04001193 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001194 {SPV_OPERAND_TYPE_NONE}},
1195 {"WaitWorkGroup",
1196 KernelEnqueueFlagsWaitWorkGroup,
1197 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -04001198 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001199 {SPV_OPERAND_TYPE_NONE}},
1200};
1201
1202static const spv_operand_desc_t kernelProfilingInfoEntries[] = {
1203 {"None",
1204 KernelProfilingInfoMaskNone,
1205 SPV_OPCODE_FLAGS_NONE,
1206 0,
1207 {SPV_OPERAND_TYPE_NONE}},
1208 {"CmdExecTime",
1209 KernelProfilingInfoCmdExecTimeMask,
1210 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -04001211 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001212 {SPV_OPERAND_TYPE_NONE}},
1213};
1214
David Netod30b2332015-09-23 16:04:24 -04001215// A macro for defining a capability that doesn't depend on another capability.
1216#define CASE(NAME) \
1217 { \
1218 #NAME, Capability##NAME, SPV_OPCODE_FLAGS_NONE, 0, { \
1219 SPV_OPERAND_TYPE_NONE \
1220 } \
1221 }
1222
1223// A macro for defining a capability that depends on another.
1224#define CASE_CAP(NAME, CAP) \
1225 { \
1226 #NAME, Capability##NAME, SPV_OPCODE_FLAGS_CAPABILITIES, Capability##CAP, { \
1227 SPV_OPERAND_TYPE_NONE \
1228 } \
1229 }
1230
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001231static const spv_operand_desc_t capabilityInfoEntries[] = {
David Netod30b2332015-09-23 16:04:24 -04001232 CASE(Matrix),
1233 CASE_CAP(Shader, Matrix),
1234 CASE_CAP(Geometry, Shader),
1235 CASE_CAP(Tessellation, Shader),
1236 CASE(Addresses),
1237 CASE(Linkage),
1238 CASE(Kernel),
1239 CASE_CAP(Vector16, Kernel),
1240 CASE_CAP(Float16Buffer, Kernel),
1241 CASE_CAP(Float16, Float16Buffer),
1242 CASE(Float64),
1243 CASE(Int64),
1244 CASE_CAP(Int64Atomics, Int64),
1245 CASE_CAP(ImageBasic, Kernel),
1246 CASE_CAP(ImageReadWrite, Kernel),
1247 CASE_CAP(ImageMipmap, Kernel),
1248 CASE_CAP(ImageSRGBWrite, Kernel),
1249 CASE_CAP(Pipes, Kernel),
1250 CASE(Groups),
1251 CASE_CAP(DeviceEnqueue, Kernel),
1252 CASE_CAP(LiteralSampler, Kernel),
1253 CASE_CAP(AtomicStorage, Shader),
1254 CASE(Int16),
1255 CASE_CAP(TessellationPointSize, Tessellation),
1256 CASE_CAP(GeometryPointSize, Geometry),
1257 CASE_CAP(ImageGatherExtended, Shader),
1258 CASE_CAP(StorageImageExtendedFormats, Shader),
1259 CASE_CAP(StorageImageMultisample, Shader),
1260 CASE_CAP(UniformBufferArrayDynamicIndexing, Shader),
1261 CASE_CAP(SampledImageArrayDynamicIndexing, Shader),
1262 CASE_CAP(StorageBufferArrayDynamicIndexing, Shader),
1263 CASE_CAP(StorageImageArrayDynamicIndexing, Shader),
1264 CASE_CAP(ClipDistance, Shader),
1265 CASE_CAP(CullDistance, Shader),
1266 CASE_CAP(ImageCubeArray, SampledCubeArray),
1267 CASE_CAP(SampleRateShading, Shader),
1268 CASE_CAP(ImageRect, SampledRect),
1269 CASE_CAP(SampledRect, Shader),
1270 CASE_CAP(GenericPointer, Addresses),
1271 CASE_CAP(Int8, Kernel),
1272 CASE_CAP(InputTarget, Shader),
1273 CASE_CAP(SparseResidency, Shader),
1274 CASE_CAP(MinLod, Shader),
1275 CASE_CAP(Sampled1D, Shader),
1276 CASE_CAP(Image1D, Sampled1D),
1277 CASE_CAP(SampledCubeArray, Shader),
1278 CASE_CAP(SampledBuffer, Shader),
1279 CASE_CAP(ImageBuffer, SampledBuffer),
1280 CASE_CAP(ImageMSArray, Shader),
1281 CASE_CAP(AdvancedFormats, Shader),
1282 CASE_CAP(ImageQuery, Shader),
1283 CASE_CAP(DerivativeControl, Shader),
1284 CASE_CAP(InterpolationFunction, Shader),
1285 CASE_CAP(TransformFeedback, Shader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001286};
David Netod30b2332015-09-23 16:04:24 -04001287#undef CASE
1288#undef CASE_CAP
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001289
1290static const spv_operand_desc_group_t opcodeEntryTypes[] = {
1291 {SPV_OPERAND_TYPE_SOURCE_LANGUAGE,
1292 sizeof(sourceLanguageEntries) / sizeof(spv_operand_desc_t),
1293 sourceLanguageEntries},
1294 {SPV_OPERAND_TYPE_EXECUTION_MODEL,
1295 sizeof(executionModelEntries) / sizeof(spv_operand_desc_t),
1296 executionModelEntries},
1297 {SPV_OPERAND_TYPE_ADDRESSING_MODEL,
1298 sizeof(addressingModelEntries) / sizeof(spv_operand_desc_t),
1299 addressingModelEntries},
1300 {SPV_OPERAND_TYPE_MEMORY_MODEL,
1301 sizeof(memoryModelEntries) / sizeof(spv_operand_desc_t),
1302 memoryModelEntries},
1303 {SPV_OPERAND_TYPE_EXECUTION_MODE,
1304 sizeof(executionModeEntries) / sizeof(spv_operand_desc_t),
1305 executionModeEntries},
1306 {SPV_OPERAND_TYPE_STORAGE_CLASS,
1307 sizeof(storageClassEntries) / sizeof(spv_operand_desc_t),
1308 storageClassEntries},
1309 {SPV_OPERAND_TYPE_DIMENSIONALITY,
1310 sizeof(dimensionalityEntries) / sizeof(spv_operand_desc_t),
1311 dimensionalityEntries},
1312 {SPV_OPERAND_TYPE_SAMPLER_ADDRESSING_MODE,
1313 sizeof(samplerAddressingModeEntries) / sizeof(spv_operand_desc_t),
1314 samplerAddressingModeEntries},
1315 {SPV_OPERAND_TYPE_SAMPLER_FILTER_MODE,
1316 sizeof(samplerFilterModeEntries) / sizeof(spv_operand_desc_t),
1317 samplerFilterModeEntries},
David Netob30a0c52015-09-16 15:56:43 -04001318 {SPV_OPERAND_TYPE_SAMPLER_IMAGE_FORMAT,
1319 sizeof(samplerImageFormatEntries) / sizeof(spv_operand_desc_t),
1320 samplerImageFormatEntries},
David Netoee1b3bb2015-09-18 11:19:18 -04001321 {SPV_OPERAND_TYPE_OPTIONAL_IMAGE,
1322 sizeof(imageOperandEntries) / sizeof(spv_operand_desc_t),
1323 imageOperandEntries},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001324 {SPV_OPERAND_TYPE_FP_FAST_MATH_MODE,
1325 sizeof(fpFastMathModeEntries) / sizeof(spv_operand_desc_t),
1326 fpFastMathModeEntries},
1327 {SPV_OPERAND_TYPE_FP_ROUNDING_MODE,
1328 sizeof(fpRoundingModeEntries) / sizeof(spv_operand_desc_t),
1329 fpRoundingModeEntries},
1330 {SPV_OPERAND_TYPE_LINKAGE_TYPE,
1331 sizeof(linkageTypeEntries) / sizeof(spv_operand_desc_t),
1332 linkageTypeEntries},
1333 {SPV_OPERAND_TYPE_ACCESS_QUALIFIER,
1334 sizeof(accessQualifierEntries) / sizeof(spv_operand_desc_t),
1335 accessQualifierEntries},
1336 {SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE,
1337 sizeof(functionParameterAttributeEntries) / sizeof(spv_operand_desc_t),
1338 functionParameterAttributeEntries},
1339 {SPV_OPERAND_TYPE_DECORATION,
1340 sizeof(decorationEntries) / sizeof(spv_operand_desc_t), decorationEntries},
1341 {SPV_OPERAND_TYPE_BUILT_IN,
1342 sizeof(builtInEntries) / sizeof(spv_operand_desc_t), builtInEntries},
1343 {SPV_OPERAND_TYPE_SELECTION_CONTROL,
1344 sizeof(selectionControlEntries) / sizeof(spv_operand_desc_t),
1345 selectionControlEntries},
1346 {SPV_OPERAND_TYPE_LOOP_CONTROL,
1347 sizeof(loopControlEntries) / sizeof(spv_operand_desc_t),
1348 loopControlEntries},
1349 {SPV_OPERAND_TYPE_FUNCTION_CONTROL,
1350 sizeof(functionControlEntries) / sizeof(spv_operand_desc_t),
1351 functionControlEntries},
1352 {SPV_OPERAND_TYPE_MEMORY_SEMANTICS,
1353 sizeof(memorySemanticsEntries) / sizeof(spv_operand_desc_t),
1354 memorySemanticsEntries},
David Neto78c3b432015-08-27 13:03:52 -04001355 {SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001356 sizeof(memoryAccessEntries) / sizeof(spv_operand_desc_t),
1357 memoryAccessEntries},
1358 {SPV_OPERAND_TYPE_EXECUTION_SCOPE,
1359 sizeof(scopeEntries) / sizeof(spv_operand_desc_t), scopeEntries},
1360 {SPV_OPERAND_TYPE_GROUP_OPERATION,
1361 sizeof(groupOperationEntries) / sizeof(spv_operand_desc_t),
1362 groupOperationEntries},
1363 {SPV_OPERAND_TYPE_KERNEL_ENQ_FLAGS,
1364 sizeof(kernelKernelEnqueueFlagssEntries) / sizeof(spv_operand_desc_t),
1365 kernelKernelEnqueueFlagssEntries},
David Neto47994822015-08-27 13:11:01 -04001366 {SPV_OPERAND_TYPE_KERNEL_PROFILING_INFO,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001367 sizeof(kernelProfilingInfoEntries) / sizeof(spv_operand_desc_t),
1368 kernelProfilingInfoEntries},
1369 {SPV_OPERAND_TYPE_CAPABILITY,
1370 sizeof(capabilityInfoEntries) / sizeof(spv_operand_desc_t),
1371 capabilityInfoEntries},
1372};
1373
Dejan Mircevski50babb22015-09-29 10:56:32 -04001374spv_result_t spvOperandTableGet(spv_operand_table* pOperandTable) {
Lei Zhang40056702015-09-11 14:31:27 -04001375 if (!pOperandTable) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001376
1377 static const spv_operand_table_t table = {
1378 sizeof(opcodeEntryTypes) / sizeof(spv_operand_desc_group_t),
1379 opcodeEntryTypes};
1380
1381 *pOperandTable = &table;
1382
1383 return SPV_SUCCESS;
1384}
1385
1386spv_result_t spvOperandTableNameLookup(const spv_operand_table table,
1387 const spv_operand_type_t type,
David Neto388c40d2015-09-16 16:42:56 -04001388 const char* name,
1389 const size_t nameLength,
1390 spv_operand_desc* pEntry) {
Lei Zhang40056702015-09-11 14:31:27 -04001391 if (!table) return SPV_ERROR_INVALID_TABLE;
1392 if (!name || !pEntry) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001393
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001394 for (uint64_t typeIndex = 0; typeIndex < table->count; ++typeIndex) {
1395 if (type == table->types[typeIndex].type) {
1396 for (uint64_t operandIndex = 0;
1397 operandIndex < table->types[typeIndex].count; ++operandIndex) {
1398 if (nameLength ==
1399 strlen(table->types[typeIndex].entries[operandIndex].name) &&
1400 !strncmp(table->types[typeIndex].entries[operandIndex].name, name,
David Neto388c40d2015-09-16 16:42:56 -04001401 nameLength)) {
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001402 *pEntry = &table->types[typeIndex].entries[operandIndex];
1403 return SPV_SUCCESS;
1404 }
1405 }
1406 }
1407 }
1408
1409 return SPV_ERROR_INVALID_LOOKUP;
1410}
1411
1412spv_result_t spvOperandTableValueLookup(const spv_operand_table table,
1413 const spv_operand_type_t type,
1414 const uint32_t value,
Dejan Mircevski50babb22015-09-29 10:56:32 -04001415 spv_operand_desc* pEntry) {
Lei Zhang40056702015-09-11 14:31:27 -04001416 if (!table) return SPV_ERROR_INVALID_TABLE;
1417 if (!pEntry) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001418
1419 for (uint64_t typeIndex = 0; typeIndex < table->count; ++typeIndex) {
1420 if (type == table->types[typeIndex].type) {
1421 for (uint64_t operandIndex = 0;
1422 operandIndex < table->types[typeIndex].count; ++operandIndex) {
1423 if (value == table->types[typeIndex].entries[operandIndex].value) {
1424 *pEntry = &table->types[typeIndex].entries[operandIndex];
1425 return SPV_SUCCESS;
1426 }
1427 }
1428 }
1429 }
1430
1431 return SPV_ERROR_INVALID_LOOKUP;
1432}
1433
Dejan Mircevski50babb22015-09-29 10:56:32 -04001434const char* spvOperandTypeStr(spv_operand_type_t type) {
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001435 switch (type) {
1436 case SPV_OPERAND_TYPE_ID:
David Netofadbf622015-09-14 17:07:11 -04001437 case SPV_OPERAND_TYPE_OPTIONAL_ID:
1438 case SPV_OPERAND_TYPE_ID_IN_OPTIONAL_TUPLE:
1439 return "ID";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001440 case SPV_OPERAND_TYPE_RESULT_ID:
1441 return "result ID";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001442 case SPV_OPERAND_TYPE_LITERAL_NUMBER:
1443 return "literal number";
Lei Zhangb41d1502015-09-14 15:22:23 -04001444 case SPV_OPERAND_TYPE_MULTIWORD_LITERAL_NUMBER:
1445 return "multiple word literal number";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001446 case SPV_OPERAND_TYPE_LITERAL_STRING:
1447 return "literal string";
1448 case SPV_OPERAND_TYPE_SOURCE_LANGUAGE:
1449 return "source langauge";
1450 case SPV_OPERAND_TYPE_EXECUTION_MODEL:
1451 return "execution model";
1452 case SPV_OPERAND_TYPE_ADDRESSING_MODEL:
1453 return "addressing model";
1454 case SPV_OPERAND_TYPE_MEMORY_MODEL:
1455 return "memory model";
1456 case SPV_OPERAND_TYPE_EXECUTION_MODE:
1457 return "execution mode";
1458 case SPV_OPERAND_TYPE_STORAGE_CLASS:
1459 return "storage class";
1460 case SPV_OPERAND_TYPE_DIMENSIONALITY:
1461 return "dimensionality";
1462 case SPV_OPERAND_TYPE_SAMPLER_ADDRESSING_MODE:
1463 return "addressing mode";
1464 case SPV_OPERAND_TYPE_SAMPLER_FILTER_MODE:
1465 return "sampler filter mode";
David Netob30a0c52015-09-16 15:56:43 -04001466 case SPV_OPERAND_TYPE_SAMPLER_IMAGE_FORMAT:
1467 return "sampler image format";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001468 case SPV_OPERAND_TYPE_FP_FAST_MATH_MODE:
1469 return "floating pointer fast math mode";
1470 case SPV_OPERAND_TYPE_FP_ROUNDING_MODE:
1471 return "floating point rounding mode";
1472 case SPV_OPERAND_TYPE_LINKAGE_TYPE:
1473 return "linkage type";
1474 case SPV_OPERAND_TYPE_ACCESS_QUALIFIER:
1475 return "access qualifier";
1476 case SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE:
1477 return "function parameter attribute";
1478 case SPV_OPERAND_TYPE_DECORATION:
1479 return "decoration";
1480 case SPV_OPERAND_TYPE_BUILT_IN:
1481 return "built in";
1482 case SPV_OPERAND_TYPE_SELECTION_CONTROL:
1483 return "selection control";
1484 case SPV_OPERAND_TYPE_LOOP_CONTROL:
1485 return "loop control";
1486 case SPV_OPERAND_TYPE_FUNCTION_CONTROL:
1487 return "function control";
1488 case SPV_OPERAND_TYPE_MEMORY_SEMANTICS:
1489 return "memory semantics";
David Neto78c3b432015-08-27 13:03:52 -04001490 case SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001491 return "memory access";
1492 case SPV_OPERAND_TYPE_EXECUTION_SCOPE:
David Netofadbf622015-09-14 17:07:11 -04001493 return "execution scope ID";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001494 case SPV_OPERAND_TYPE_GROUP_OPERATION:
1495 return "group operation";
1496 case SPV_OPERAND_TYPE_KERNEL_ENQ_FLAGS:
1497 return "kernel enqeue flags";
David Neto47994822015-08-27 13:11:01 -04001498 case SPV_OPERAND_TYPE_KERNEL_PROFILING_INFO:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001499 return "kernel profiling info";
1500 case SPV_OPERAND_TYPE_CAPABILITY:
1501 return "capability";
David Netoee1b3bb2015-09-18 11:19:18 -04001502 case SPV_OPERAND_TYPE_OPTIONAL_IMAGE:
1503 return "image operand";
David Neto78c3b432015-08-27 13:03:52 -04001504 case SPV_OPERAND_TYPE_NONE:
1505 return "NONE";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001506 default:
1507 assert(0 && "Unhandled operand type!");
1508 break;
1509 }
1510 return "unknown";
1511}
David Neto78c3b432015-08-27 13:03:52 -04001512
1513void spvPrependOperandTypes(const spv_operand_type_t* types,
1514 spv_operand_pattern_t* pattern) {
1515 const spv_operand_type_t* endTypes;
Dejan Mircevski50babb22015-09-29 10:56:32 -04001516 for (endTypes = types; *endTypes != SPV_OPERAND_TYPE_NONE; ++endTypes)
David Neto78c3b432015-08-27 13:03:52 -04001517 ;
1518 pattern->insert(pattern->begin(), types, endTypes);
1519}
1520
David Neto5bf88fc2015-09-17 17:06:10 -04001521void spvPrependOperandTypesForMask(const spv_operand_table operandTable,
1522 const spv_operand_type_t type,
1523 const uint32_t mask,
1524 spv_operand_pattern_t* pattern) {
1525 // Scan from highest bits to lowest bits because we will prepend in LIFO
1526 // fashion, and we need the operands for lower order bits to appear first.
1527 for (uint32_t candidate_bit = (1 << 31); candidate_bit; candidate_bit >>= 1) {
1528 if (candidate_bit & mask) {
1529 spv_operand_desc entry = nullptr;
1530 if (SPV_SUCCESS == spvOperandTableValueLookup(operandTable, type,
1531 candidate_bit, &entry)) {
1532 spvPrependOperandTypes(entry->operandTypes, pattern);
1533 }
1534 }
1535 }
1536}
1537
David Neto78c3b432015-08-27 13:03:52 -04001538bool spvOperandIsOptional(spv_operand_type_t type) {
1539 // Variable means zero or more times.
Dejan Mircevski50babb22015-09-29 10:56:32 -04001540 if (spvOperandIsVariable(type)) return true;
David Neto78c3b432015-08-27 13:03:52 -04001541
1542 switch (type) {
1543 case SPV_OPERAND_TYPE_OPTIONAL_ID:
1544 case SPV_OPERAND_TYPE_OPTIONAL_IMAGE:
David Neto561dc4e2015-09-25 14:23:29 -04001545 case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_NUMBER:
David Neto78c3b432015-08-27 13:03:52 -04001546 case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_STRING:
1547 case SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS:
1548 case SPV_OPERAND_TYPE_OPTIONAL_EXECUTION_MODE:
Dejan Mircevski903f9d62015-09-28 17:04:39 -04001549 case SPV_OPERAND_TYPE_OPTIONAL_CIV:
David Neto78c3b432015-08-27 13:03:52 -04001550 return true;
1551 default:
1552 break;
1553 }
1554 return false;
1555}
1556
1557bool spvOperandIsVariable(spv_operand_type_t type) {
1558 switch (type) {
1559 case SPV_OPERAND_TYPE_VARIABLE_ID:
David Neto561dc4e2015-09-25 14:23:29 -04001560 case SPV_OPERAND_TYPE_VARIABLE_LITERAL_NUMBER:
1561 case SPV_OPERAND_TYPE_VARIABLE_ID_LITERAL_NUMBER:
1562 case SPV_OPERAND_TYPE_VARIABLE_LITERAL_NUMBER_ID:
David Neto78c3b432015-08-27 13:03:52 -04001563 case SPV_OPERAND_TYPE_VARIABLE_EXECUTION_MODE:
1564 return true;
1565 default:
1566 break;
1567 }
1568 return false;
1569}
1570
David Neto78c3b432015-08-27 13:03:52 -04001571bool spvExpandOperandSequenceOnce(spv_operand_type_t type,
1572 spv_operand_pattern_t* pattern) {
1573 switch (type) {
1574 case SPV_OPERAND_TYPE_VARIABLE_ID:
1575 pattern->insert(pattern->begin(), {SPV_OPERAND_TYPE_OPTIONAL_ID, type});
1576 return true;
David Neto561dc4e2015-09-25 14:23:29 -04001577 case SPV_OPERAND_TYPE_VARIABLE_LITERAL_NUMBER:
David Neto78c3b432015-08-27 13:03:52 -04001578 pattern->insert(pattern->begin(),
David Neto561dc4e2015-09-25 14:23:29 -04001579 {SPV_OPERAND_TYPE_OPTIONAL_LITERAL_NUMBER, type});
David Neto78c3b432015-08-27 13:03:52 -04001580 return true;
David Neto561dc4e2015-09-25 14:23:29 -04001581 case SPV_OPERAND_TYPE_VARIABLE_LITERAL_NUMBER_ID:
1582 // Represents Zero or more (Literal number, Id) pairs.
David Neto78c3b432015-08-27 13:03:52 -04001583 pattern->insert(pattern->begin(),
David Neto561dc4e2015-09-25 14:23:29 -04001584 {SPV_OPERAND_TYPE_OPTIONAL_LITERAL_NUMBER,
David Neto78c3b432015-08-27 13:03:52 -04001585 SPV_OPERAND_TYPE_ID_IN_OPTIONAL_TUPLE, type});
1586 return true;
David Neto561dc4e2015-09-25 14:23:29 -04001587 case SPV_OPERAND_TYPE_VARIABLE_ID_LITERAL_NUMBER:
1588 // Represents Zero or more (Id, Literal number) pairs.
Dejan Mircevski50babb22015-09-29 10:56:32 -04001589 pattern->insert(
1590 pattern->begin(),
1591 {SPV_OPERAND_TYPE_OPTIONAL_ID,
1592 SPV_OPERAND_TYPE_LITERAL_NUMBER_IN_OPTIONAL_TUPLE, type});
David Neto78c3b432015-08-27 13:03:52 -04001593 return true;
David Neto78c3b432015-08-27 13:03:52 -04001594 case SPV_OPERAND_TYPE_VARIABLE_EXECUTION_MODE:
Dejan Mircevski50babb22015-09-29 10:56:32 -04001595 pattern->insert(pattern->begin(),
1596 {SPV_OPERAND_TYPE_OPTIONAL_EXECUTION_MODE, type});
David Neto78c3b432015-08-27 13:03:52 -04001597 return true;
1598 default:
1599 break;
1600 }
1601 return false;
1602}
1603
Dejan Mircevski50babb22015-09-29 10:56:32 -04001604spv_operand_type_t spvTakeFirstMatchableOperand(
1605 spv_operand_pattern_t* pattern) {
David Neto78c3b432015-08-27 13:03:52 -04001606 assert(!pattern->empty());
1607 spv_operand_type_t result;
1608 do {
1609 result = pattern->front();
1610 pattern->pop_front();
Dejan Mircevski50babb22015-09-29 10:56:32 -04001611 } while (spvExpandOperandSequenceOnce(result, pattern));
David Neto78c3b432015-08-27 13:03:52 -04001612 return result;
1613}
Dejan Mircevski903f9d62015-09-28 17:04:39 -04001614
Dejan Mircevski897bff92015-09-29 10:38:18 -04001615spv_operand_pattern_t spvAlternatePatternFollowingImmediate(
1616 const spv_operand_pattern_t& pattern) {
1617 spv_operand_pattern_t alternatePattern;
1618 for (const auto& operand : pattern) {
1619 if (operand == SPV_OPERAND_TYPE_RESULT_ID) {
1620 alternatePattern.push_back(operand);
1621 alternatePattern.push_back(SPV_OPERAND_TYPE_OPTIONAL_CIV);
1622 return alternatePattern;
Dejan Mircevski903f9d62015-09-28 17:04:39 -04001623 }
Dejan Mircevski897bff92015-09-29 10:38:18 -04001624 alternatePattern.push_back(SPV_OPERAND_TYPE_OPTIONAL_CIV);
Dejan Mircevski903f9d62015-09-28 17:04:39 -04001625 }
Dejan Mircevski897bff92015-09-29 10:38:18 -04001626 // No result-id found, so just expect CIVs.
1627 return {SPV_OPERAND_TYPE_OPTIONAL_CIV};
Dejan Mircevski903f9d62015-09-28 17:04:39 -04001628}