blob: e7b39a3081164fda4ddce09665ccee314d540385 [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.
David Netoddda85a2015-10-02 17:10:10 -0400130#define ExecMode0(mode, cap) \
131 #mode, ExecutionMode##mode, SPV_OPCODE_FLAGS_CAPABILITIES, \
132 SPV_CAPABILITY_AS_MASK(Capability##cap), { \
133 SPV_OPERAND_TYPE_NONE \
Lei Zhang85c6f792015-09-23 15:42:18 -0400134 }
135// Execution mode requiring the given capability and having one literal number
136// operand.
David Netoddda85a2015-10-02 17:10:10 -0400137#define ExecMode1(mode, cap) \
138 #mode, ExecutionMode##mode, SPV_OPCODE_FLAGS_CAPABILITIES, \
139 SPV_CAPABILITY_AS_MASK(Capability##cap), { \
140 SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE \
Lei Zhang85c6f792015-09-23 15:42:18 -0400141 }
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,
David Netoddda85a2015-10-02 17:10:10 -0400254 SPV_CAPABILITY_AS_MASK(CapabilityAtomicStorage),
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[] = {
David Netoddda85a2015-10-02 17:10:10 -0400264 {"1D",
265 Dim1D,
266 SPV_OPCODE_FLAGS_CAPABILITIES,
267 SPV_CAPABILITY_AS_MASK(CapabilitySampled1D),
268 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100269 {"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,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400274 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100275 {SPV_OPERAND_TYPE_NONE}},
276 {"Rect",
277 DimRect,
278 SPV_OPCODE_FLAGS_CAPABILITIES,
David Netoddda85a2015-10-02 17:10:10 -0400279 SPV_CAPABILITY_AS_MASK(CapabilitySampledRect),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100280 {SPV_OPERAND_TYPE_NONE}},
David Netoddda85a2015-10-02 17:10:10 -0400281 {"Buffer",
282 DimBuffer,
283 SPV_OPCODE_FLAGS_CAPABILITIES,
284 SPV_CAPABILITY_AS_MASK(CapabilitySampledBuffer),
285 {SPV_OPERAND_TYPE_NONE}},
David Netoaa0c3a52015-09-23 10:30:06 -0400286 {"InputTarget",
287 DimInputTarget,
288 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400289 SPV_CAPABILITY_AS_MASK(CapabilityInputTarget),
David Netoaa0c3a52015-09-23 10:30:06 -0400290 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100291};
292
293static const spv_operand_desc_t samplerAddressingModeEntries[] = {
294 {"None",
295 SamplerAddressingModeNone,
296 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400297 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100298 {SPV_OPERAND_TYPE_NONE}},
299 {"ClampToEdge",
300 SamplerAddressingModeClampToEdge,
301 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400302 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100303 {SPV_OPERAND_TYPE_NONE}},
304 {"Clamp",
305 SamplerAddressingModeClamp,
306 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400307 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100308 {SPV_OPERAND_TYPE_NONE}},
309 {"Repeat",
310 SamplerAddressingModeRepeat,
311 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400312 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100313 {SPV_OPERAND_TYPE_NONE}},
314 {"RepeatMirrored",
315 SamplerAddressingModeRepeatMirrored,
316 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400317 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100318 {SPV_OPERAND_TYPE_NONE}},
319};
320
321static const spv_operand_desc_t samplerFilterModeEntries[] = {
322 {"Nearest",
323 SamplerFilterModeNearest,
324 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400325 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100326 {SPV_OPERAND_TYPE_NONE}},
327 {"Linear",
328 SamplerFilterModeLinear,
329 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400330 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100331 {SPV_OPERAND_TYPE_NONE}},
332};
333
David Netob30a0c52015-09-16 15:56:43 -0400334static const spv_operand_desc_t samplerImageFormatEntries[] = {
David Netoddda85a2015-10-02 17:10:10 -0400335#define CASE0(NAME) \
336 { \
337 #NAME, ImageFormat##NAME, 0, 0, { SPV_OPERAND_TYPE_NONE } \
338 }
339#define CASE(NAME, CAP) \
Dejan Mircevski205408b2015-09-30 16:42:34 -0400340 { \
341 #NAME, ImageFormat##NAME, SPV_OPCODE_FLAGS_CAPABILITIES, \
David Netoddda85a2015-10-02 17:10:10 -0400342 SPV_CAPABILITY_AS_MASK(Capability##CAP), { \
Dejan Mircevski205408b2015-09-30 16:42:34 -0400343 SPV_OPERAND_TYPE_NONE \
344 } \
David Netob30a0c52015-09-16 15:56:43 -0400345 }
Dejan Mircevski50babb22015-09-29 10:56:32 -0400346 // clang-format off
David Netoddda85a2015-10-02 17:10:10 -0400347 CASE0(Unknown),
348 CASE(Rgba32f, Shader),
349 CASE(Rgba16f, Shader),
350 CASE(R32f, Shader),
351 CASE(Rgba8, Shader),
352 CASE(Rgba8Snorm, Shader),
353 CASE(Rg32f, AdvancedFormats),
354 CASE(Rg16f, AdvancedFormats),
355 CASE(R11fG11fB10f, AdvancedFormats),
356 CASE(R16f, AdvancedFormats),
357 CASE(Rgba16, AdvancedFormats),
358 CASE(Rgb10A2, AdvancedFormats),
359 CASE(Rg16, AdvancedFormats),
360 CASE(Rg8, AdvancedFormats),
361 CASE(R16, AdvancedFormats),
362 CASE(R8, AdvancedFormats),
363 CASE(Rgba16Snorm, AdvancedFormats),
364 CASE(Rg16Snorm, AdvancedFormats),
365 CASE(Rg8Snorm, AdvancedFormats),
366 CASE(R16Snorm, AdvancedFormats),
367 CASE(R8Snorm, AdvancedFormats),
368 CASE(Rgba32i, Shader),
369 CASE(Rgba16i, Shader),
370 CASE(Rgba8i, Shader),
371 CASE(R32i, Shader),
372 CASE(Rg32i, AdvancedFormats),
373 CASE(Rg16i, AdvancedFormats),
374 CASE(Rg8i, AdvancedFormats),
375 CASE(R16i, AdvancedFormats),
376 CASE(R8i, AdvancedFormats),
377 CASE(Rgba32ui, Shader),
378 CASE(Rgba16ui, Shader),
379 CASE(Rgba8ui, Shader),
380 CASE(R32ui, Shader),
381 CASE(Rgb10a2ui, AdvancedFormats),
382 CASE(Rg32ui, AdvancedFormats),
383 CASE(Rg16ui, AdvancedFormats),
384 CASE(Rg8ui, AdvancedFormats),
385 CASE(R16ui, AdvancedFormats),
386 CASE(R8ui, AdvancedFormats),
Dejan Mircevski50babb22015-09-29 10:56:32 -0400387// clang-format on
David Netob30a0c52015-09-16 15:56:43 -0400388#undef CASE
389};
390
David Netoddda85a2015-10-02 17:10:10 -0400391// All image channel orders depend on the Kernel capability.
392#define CASE(NAME) \
393 { \
394 #NAME, ImageChannelOrder##NAME, SPV_OPCODE_FLAGS_CAPABILITIES, \
395 SPV_CAPABILITY_AS_MASK(CapabilityKernel), { \
396 SPV_OPERAND_TYPE_NONE \
397 } \
398 }
399static const spv_operand_desc_t imageChannelOrderEntries[] = {
400 CASE(R),
401 CASE(A),
402 CASE(RG),
403 CASE(RA),
404 CASE(RGB),
405 CASE(RGBA),
406 CASE(BGRA),
407 CASE(ARGB),
408 CASE(Intensity),
409 CASE(Luminance),
410 CASE(Rx),
411 CASE(RGx),
412 CASE(RGBx),
413 CASE(Depth),
414 CASE(DepthStencil),
415 CASE(sRGB),
416 CASE(sRGBx),
417 CASE(sRGBA),
418 CASE(sBGRA),
419};
420#undef CASE
421
422// All image channel data types depend on the Kernel capability.
423#define CASE(NAME) \
424 { \
425 #NAME, ImageChannelDataType##NAME, SPV_OPCODE_FLAGS_CAPABILITIES, \
426 SPV_CAPABILITY_AS_MASK(CapabilityKernel), { \
427 SPV_OPERAND_TYPE_NONE \
428 } \
429 }
430static const spv_operand_desc_t imageChannelDataTypeEntries[] = {
431 CASE(SnormInt8),
432 CASE(SnormInt16),
433 CASE(UnormInt8),
434 CASE(UnormInt16),
435 CASE(UnormShort565),
436 CASE(UnormShort555),
437 CASE(UnormInt101010),
438 CASE(SignedInt8),
439 CASE(SignedInt16),
440 CASE(SignedInt32),
441 CASE(UnsignedInt8),
442 CASE(UnsignedInt16),
443 CASE(UnsignedInt32),
444 CASE(HalfFloat),
445 CASE(Float),
446 CASE(UnormInt24),
447};
448#undef CASE
449
David Netoee1b3bb2015-09-18 11:19:18 -0400450// Image operand definitions. Each enum value is a mask. When that mask
451// bit is set, the instruction should have further ID operands.
452// Some mask values depend on a capability.
453static const spv_operand_desc_t imageOperandEntries[] = {
454// Rev32 and later adds many more enums.
455#define CASE(NAME) \
456 #NAME, spv::ImageOperands##NAME##Mask, SPV_OPCODE_FLAGS_NONE, 0
457#define CASE_CAP(NAME, CAP) \
458 #NAME, spv::ImageOperands##NAME##Mask, SPV_OPCODE_FLAGS_CAPABILITIES, CAP
459#define ID SPV_OPERAND_TYPE_ID
460#define NONE SPV_OPERAND_TYPE_NONE
461 {"None", spv::ImageOperandsMaskNone, SPV_OPCODE_FLAGS_NONE, 0, {NONE}},
Dejan Mircevski205408b2015-09-30 16:42:34 -0400462 {CASE_CAP(Bias, SPV_CAPABILITY_AS_MASK(CapabilityShader)), {ID, NONE}},
David Netoee1b3bb2015-09-18 11:19:18 -0400463 {CASE(Lod), {ID, NONE}},
464 {CASE(Grad), {ID, ID, NONE}},
465 {CASE(ConstOffset), {ID, NONE}},
Dejan Mircevski205408b2015-09-30 16:42:34 -0400466 {CASE_CAP(Offset, SPV_CAPABILITY_AS_MASK(CapabilityImageGatherExtended)),
467 {ID, NONE}},
David Netoee1b3bb2015-09-18 11:19:18 -0400468 {CASE(ConstOffsets), {ID, NONE}},
469 {CASE(Sample), {ID, NONE}},
Dejan Mircevski205408b2015-09-30 16:42:34 -0400470 {CASE_CAP(MinLod, SPV_CAPABILITY_AS_MASK(CapabilityMinLod)), {ID, NONE}},
David Netoee1b3bb2015-09-18 11:19:18 -0400471#undef CASE
472#undef CASE_CAP
473#undef ID
474#undef NONE
475};
476
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100477static const spv_operand_desc_t fpFastMathModeEntries[] = {
478 {"None",
479 FPFastMathModeMaskNone,
480 SPV_OPCODE_FLAGS_NONE,
481 0,
482 {SPV_OPERAND_TYPE_NONE}},
483 {"NotNaN",
484 FPFastMathModeNotNaNMask,
485 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400486 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100487 {SPV_OPERAND_TYPE_NONE}},
488 {"NotInf",
489 FPFastMathModeNotInfMask,
490 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400491 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100492 {SPV_OPERAND_TYPE_NONE}},
493 {"NSZ",
494 FPFastMathModeNSZMask,
495 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400496 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100497 {SPV_OPERAND_TYPE_NONE}},
498 {"AllowRecip",
499 FPFastMathModeAllowRecipMask,
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 {"Fast",
504 FPFastMathModeFastMask,
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};
509
510static const spv_operand_desc_t fpRoundingModeEntries[] = {
511 {"RTE",
512 FPRoundingModeRTE,
513 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400514 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100515 {SPV_OPERAND_TYPE_NONE}},
516 {"RTZ",
517 FPRoundingModeRTZ,
518 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400519 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100520 {SPV_OPERAND_TYPE_NONE}},
521 {"RTP",
522 FPRoundingModeRTP,
523 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400524 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100525 {SPV_OPERAND_TYPE_NONE}},
526 {"RTN",
527 FPRoundingModeRTN,
528 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400529 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100530 {SPV_OPERAND_TYPE_NONE}},
531};
532
533static const spv_operand_desc_t linkageTypeEntries[] = {
534 {"Export",
535 LinkageTypeExport,
536 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400537 SPV_CAPABILITY_AS_MASK(CapabilityLinkage),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100538 {SPV_OPERAND_TYPE_NONE}},
539 {"Import",
540 LinkageTypeImport,
541 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400542 SPV_CAPABILITY_AS_MASK(CapabilityLinkage),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100543 {SPV_OPERAND_TYPE_NONE}},
544};
545
546static const spv_operand_desc_t accessQualifierEntries[] = {
547 {"ReadOnly",
548 AccessQualifierReadOnly,
549 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400550 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100551 {SPV_OPERAND_TYPE_NONE}},
552 {"WriteOnly",
553 AccessQualifierWriteOnly,
554 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400555 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100556 {SPV_OPERAND_TYPE_NONE}},
557 {"ReadWrite",
558 AccessQualifierReadWrite,
559 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400560 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100561 {SPV_OPERAND_TYPE_NONE}},
562};
563
564static const spv_operand_desc_t functionParameterAttributeEntries[] = {
565 {"Zext",
566 FunctionParameterAttributeZext,
567 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400568 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100569 {SPV_OPERAND_TYPE_NONE}},
570 {"Sext",
571 FunctionParameterAttributeSext,
572 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400573 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100574 {SPV_OPERAND_TYPE_NONE}},
575 {"ByVal",
576 FunctionParameterAttributeByVal,
577 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400578 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100579 {SPV_OPERAND_TYPE_NONE}},
580 {"Sret",
581 FunctionParameterAttributeSret,
582 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400583 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100584 {SPV_OPERAND_TYPE_NONE}},
585 {"NoAlias",
586 FunctionParameterAttributeNoAlias,
587 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400588 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100589 {SPV_OPERAND_TYPE_NONE}},
David Neto37547b22015-09-10 13:23:11 -0400590 {"NoCapture",
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100591 FunctionParameterAttributeNoCapture,
592 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400593 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100594 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100595 {"NoWrite",
596 FunctionParameterAttributeNoWrite,
597 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400598 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100599 {SPV_OPERAND_TYPE_NONE}},
600 {"NoReadWrite",
601 FunctionParameterAttributeNoReadWrite,
602 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400603 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100604 {SPV_OPERAND_TYPE_NONE}},
605};
606
607static const spv_operand_desc_t decorationEntries[] = {
Lei Zhang604e5ce2015-08-14 14:46:43 -0400608 {"RelaxedPrecision",
609 DecorationRelaxedPrecision,
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}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400613 {
Dejan Mircevski50babb22015-09-29 10:56:32 -0400614 "SpecId",
615 DecorationSpecId,
616 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400617 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Dejan Mircevski50babb22015-09-29 10:56:32 -0400618 {SPV_OPERAND_TYPE_LITERAL_NUMBER},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400619 },
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100620 {"Block",
621 DecorationBlock,
622 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400623 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100624 {SPV_OPERAND_TYPE_NONE}},
625 {"BufferBlock",
626 DecorationBufferBlock,
627 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400628 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100629 {SPV_OPERAND_TYPE_NONE}},
630 {"RowMajor",
631 DecorationRowMajor,
632 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400633 SPV_CAPABILITY_AS_MASK(CapabilityMatrix),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100634 {SPV_OPERAND_TYPE_NONE}},
635 {"ColMajor",
636 DecorationColMajor,
637 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400638 SPV_CAPABILITY_AS_MASK(CapabilityMatrix),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100639 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400640 {"ArrayStride",
641 DecorationArrayStride,
642 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400643 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Lei Zhang604e5ce2015-08-14 14:46:43 -0400644 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
645 {"MatrixStride",
646 DecorationMatrixStride,
647 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400648 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Lei Zhang604e5ce2015-08-14 14:46:43 -0400649 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100650 {"GLSLShared",
651 DecorationGLSLShared,
652 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400653 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100654 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100655 {"GLSLPacked",
656 DecorationGLSLPacked,
657 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400658 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100659 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400660 {"CPacked",
661 DecorationCPacked,
662 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400663 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Lei Zhang604e5ce2015-08-14 14:46:43 -0400664 {SPV_OPERAND_TYPE_NONE}},
665 {"BuiltIn",
666 DecorationBuiltIn,
667 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400668 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Lei Zhang604e5ce2015-08-14 14:46:43 -0400669 {SPV_OPERAND_TYPE_BUILT_IN, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100670 {"Smooth",
671 DecorationSmooth,
672 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400673 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100674 {SPV_OPERAND_TYPE_NONE}},
David Netodbaf4072015-09-22 16:23:06 -0400675 {"NoPerspective",
676 DecorationNoPerspective,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100677 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400678 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100679 {SPV_OPERAND_TYPE_NONE}},
680 {"Flat",
681 DecorationFlat,
682 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400683 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100684 {SPV_OPERAND_TYPE_NONE}},
685 {"Patch",
686 DecorationPatch,
687 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400688 SPV_CAPABILITY_AS_MASK(CapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100689 {SPV_OPERAND_TYPE_NONE}},
690 {"Centroid",
691 DecorationCentroid,
692 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400693 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100694 {SPV_OPERAND_TYPE_NONE}},
695 {"Sample",
696 DecorationSample,
697 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400698 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100699 {SPV_OPERAND_TYPE_NONE}},
700 {"Invariant",
701 DecorationInvariant,
702 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400703 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100704 {SPV_OPERAND_TYPE_NONE}},
705 {"Restrict",
706 DecorationRestrict,
707 SPV_OPCODE_FLAGS_NONE,
708 0,
709 {SPV_OPERAND_TYPE_NONE}},
710 {"Aliased",
711 DecorationAliased,
712 SPV_OPCODE_FLAGS_NONE,
713 0,
714 {SPV_OPERAND_TYPE_NONE}},
715 {"Volatile",
716 DecorationVolatile,
717 SPV_OPCODE_FLAGS_NONE,
718 0,
719 {SPV_OPERAND_TYPE_NONE}},
720 {"Constant",
721 DecorationConstant,
722 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400723 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100724 {SPV_OPERAND_TYPE_NONE}},
725 {"Coherent",
726 DecorationCoherent,
727 SPV_OPCODE_FLAGS_NONE,
728 0,
729 {SPV_OPERAND_TYPE_NONE}},
David Netodbaf4072015-09-22 16:23:06 -0400730 {"NonWritable",
731 DecorationNonWritable,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100732 SPV_OPCODE_FLAGS_NONE,
733 0,
734 {SPV_OPERAND_TYPE_NONE}},
David Netodbaf4072015-09-22 16:23:06 -0400735 {"NonReadable",
736 DecorationNonReadable,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100737 SPV_OPCODE_FLAGS_NONE,
738 0,
739 {SPV_OPERAND_TYPE_NONE}},
740 {"Uniform",
741 DecorationUniform,
742 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400743 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100744 {SPV_OPERAND_TYPE_NONE}},
David Neto37547b22015-09-10 13:23:11 -0400745 {"SaturatedConversion",
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100746 DecorationSaturatedConversion,
747 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400748 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100749 {SPV_OPERAND_TYPE_NONE}},
750 {"Stream",
751 DecorationStream,
752 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400753 SPV_CAPABILITY_AS_MASK(CapabilityGeometry),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100754 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
755 {"Location",
756 DecorationLocation,
757 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400758 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100759 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
760 {"Component",
761 DecorationComponent,
762 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400763 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100764 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
765 {"Index",
766 DecorationIndex,
767 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400768 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100769 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
770 {"Binding",
771 DecorationBinding,
772 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400773 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100774 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
775 {"DescriptorSet",
776 DecorationDescriptorSet,
777 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400778 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100779 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
780 {"Offset",
781 DecorationOffset,
782 SPV_OPCODE_FLAGS_NONE,
783 0,
784 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100785 {"XfbBuffer",
786 DecorationXfbBuffer,
787 SPV_OPCODE_FLAGS_CAPABILITIES,
David Netoddda85a2015-10-02 17:10:10 -0400788 SPV_CAPABILITY_AS_MASK(CapabilityTransformFeedback),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100789 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400790 {"XfbStride",
791 DecorationXfbStride,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100792 SPV_OPCODE_FLAGS_CAPABILITIES,
David Netoddda85a2015-10-02 17:10:10 -0400793 SPV_CAPABILITY_AS_MASK(CapabilityTransformFeedback),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100794 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100795 {"FuncParamAttr",
796 DecorationFuncParamAttr,
797 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400798 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100799 {SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE, SPV_OPERAND_TYPE_NONE}},
800 {"FPRoundingMode",
801 DecorationFPRoundingMode,
802 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400803 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100804 {SPV_OPERAND_TYPE_FP_ROUNDING_MODE, SPV_OPERAND_TYPE_NONE}},
805 {"FPFastMathMode",
David Neto37547b22015-09-10 13:23:11 -0400806 DecorationFPFastMathMode,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100807 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400808 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100809 {SPV_OPERAND_TYPE_FP_FAST_MATH_MODE, SPV_OPERAND_TYPE_NONE}},
810 {"LinkageAttributes",
811 DecorationLinkageAttributes,
812 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400813 SPV_CAPABILITY_AS_MASK(CapabilityLinkage),
Dejan Mircevski50babb22015-09-29 10:56:32 -0400814 {SPV_OPERAND_TYPE_LITERAL_STRING, SPV_OPERAND_TYPE_LINKAGE_TYPE,
815 SPV_OPERAND_TYPE_NONE}},
David Netod7687982015-09-23 14:59:27 -0400816 {"NoContraction",
817 DecorationNoContraction,
818 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400819 SPV_CAPABILITY_AS_MASK(CapabilityShader),
David Netod7687982015-09-23 14:59:27 -0400820 {SPV_OPERAND_TYPE_NONE}},
821 {"InputTargetIndex",
822 DecorationInputTargetIndex,
823 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400824 SPV_CAPABILITY_AS_MASK(CapabilityShader), // TODO(dneto): Should this be
825 // CapabilityInputTarget?
Dejan Mircevski50babb22015-09-29 10:56:32 -0400826 {SPV_OPERAND_TYPE_NONE}}, // TODO(dneto): Should this have a literal
827 // number argument?
David Netod7687982015-09-23 14:59:27 -0400828 {"Alignment",
829 DecorationAlignment,
830 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400831 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
David Netod7687982015-09-23 14:59:27 -0400832 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100833};
834
835static const spv_operand_desc_t builtInEntries[] = {
836 {"Position",
837 BuiltInPosition,
838 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400839 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100840 {SPV_OPERAND_TYPE_NONE}},
841 {"PointSize",
842 BuiltInPointSize,
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}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100846 {"ClipDistance",
847 BuiltInClipDistance,
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 {"CullDistance",
852 BuiltInCullDistance,
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 {"VertexId",
857 BuiltInVertexId,
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 {"InstanceId",
862 BuiltInInstanceId,
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 {"PrimitiveId",
867 BuiltInPrimitiveId,
868 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400869 SPV_CAPABILITY_AS_MASK(CapabilityGeometry) |
870 SPV_CAPABILITY_AS_MASK(CapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100871 {SPV_OPERAND_TYPE_NONE}},
872 {"InvocationId",
873 BuiltInInvocationId,
874 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400875 SPV_CAPABILITY_AS_MASK(CapabilityGeometry) |
876 SPV_CAPABILITY_AS_MASK(CapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100877 {SPV_OPERAND_TYPE_NONE}},
878 {"Layer",
879 BuiltInLayer,
880 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400881 SPV_CAPABILITY_AS_MASK(CapabilityGeometry),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100882 {SPV_OPERAND_TYPE_NONE}},
883 {"ViewportIndex",
884 BuiltInViewportIndex,
885 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400886 SPV_CAPABILITY_AS_MASK(CapabilityGeometry),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100887 {SPV_OPERAND_TYPE_NONE}},
888 {"TessLevelOuter",
889 BuiltInTessLevelOuter,
890 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400891 SPV_CAPABILITY_AS_MASK(CapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100892 {SPV_OPERAND_TYPE_NONE}},
893 {"TessLevelInner",
894 BuiltInTessLevelInner,
895 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400896 SPV_CAPABILITY_AS_MASK(CapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100897 {SPV_OPERAND_TYPE_NONE}},
898 {"TessCoord",
899 BuiltInTessCoord,
900 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400901 SPV_CAPABILITY_AS_MASK(CapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100902 {SPV_OPERAND_TYPE_NONE}},
903 {"PatchVertices",
904 BuiltInPatchVertices,
905 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400906 SPV_CAPABILITY_AS_MASK(CapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100907 {SPV_OPERAND_TYPE_NONE}},
908 {"FragCoord",
909 BuiltInFragCoord,
910 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400911 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100912 {SPV_OPERAND_TYPE_NONE}},
913 {"PointCoord",
914 BuiltInPointCoord,
915 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400916 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100917 {SPV_OPERAND_TYPE_NONE}},
918 {"FrontFacing",
919 BuiltInFrontFacing,
920 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400921 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100922 {SPV_OPERAND_TYPE_NONE}},
923 {"SampleId",
924 BuiltInSampleId,
925 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400926 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100927 {SPV_OPERAND_TYPE_NONE}},
928 {"SamplePosition",
929 BuiltInSamplePosition,
930 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400931 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100932 {SPV_OPERAND_TYPE_NONE}},
933 {"SampleMask",
934 BuiltInSampleMask,
935 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400936 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100937 {SPV_OPERAND_TYPE_NONE}},
938 {"FragColor",
939 BuiltInFragColor,
940 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400941 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100942 {SPV_OPERAND_TYPE_NONE}},
943 {"FragDepth",
944 BuiltInFragDepth,
945 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400946 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100947 {SPV_OPERAND_TYPE_NONE}},
948 {"HelperInvocation",
949 BuiltInHelperInvocation,
950 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400951 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100952 {SPV_OPERAND_TYPE_NONE}},
953 {"NumWorkgroups",
954 BuiltInNumWorkgroups,
955 SPV_OPCODE_FLAGS_NONE,
956 0,
957 {SPV_OPERAND_TYPE_NONE}},
958 {"WorkgroupSize",
959 BuiltInWorkgroupSize,
960 SPV_OPCODE_FLAGS_NONE,
961 0,
962 {SPV_OPERAND_TYPE_NONE}},
963 {"WorkgroupId",
964 BuiltInWorkgroupId,
965 SPV_OPCODE_FLAGS_NONE,
966 0,
967 {SPV_OPERAND_TYPE_NONE}},
968 {"LocalInvocationId",
969 BuiltInLocalInvocationId,
970 SPV_OPCODE_FLAGS_NONE,
971 0,
972 {SPV_OPERAND_TYPE_NONE}},
973 {"GlobalInvocationId",
974 BuiltInGlobalInvocationId,
975 SPV_OPCODE_FLAGS_NONE,
976 0,
977 {SPV_OPERAND_TYPE_NONE}},
978 {"LocalInvocationIndex",
David Neto37547b22015-09-10 13:23:11 -0400979 BuiltInLocalInvocationIndex,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100980 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400981 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100982 {SPV_OPERAND_TYPE_NONE}},
983 {"WorkDim",
984 BuiltInWorkDim,
985 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400986 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100987 {SPV_OPERAND_TYPE_NONE}},
988 {"GlobalSize",
989 BuiltInGlobalSize,
990 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400991 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100992 {SPV_OPERAND_TYPE_NONE}},
993 {"EnqueuedWorkgroupSize",
994 BuiltInEnqueuedWorkgroupSize,
995 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400996 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100997 {SPV_OPERAND_TYPE_NONE}},
998 {"GlobalOffset",
999 BuiltInGlobalOffset,
1000 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -04001001 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001002 {SPV_OPERAND_TYPE_NONE}},
1003 {"GlobalLinearId",
1004 BuiltInGlobalLinearId,
1005 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -04001006 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001007 {SPV_OPERAND_TYPE_NONE}},
1008 {"WorkgroupLinearId",
1009 BuiltInWorkgroupLinearId,
1010 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -04001011 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001012 {SPV_OPERAND_TYPE_NONE}},
1013 {"SubgroupSize",
1014 BuiltInSubgroupSize,
1015 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -04001016 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001017 {SPV_OPERAND_TYPE_NONE}},
1018 {"SubgroupMaxSize",
1019 BuiltInSubgroupMaxSize,
1020 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -04001021 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001022 {SPV_OPERAND_TYPE_NONE}},
1023 {"NumSubgroups",
1024 BuiltInNumSubgroups,
1025 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -04001026 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001027 {SPV_OPERAND_TYPE_NONE}},
1028 {"NumEnqueuedSubgroups",
1029 BuiltInNumEnqueuedSubgroups,
1030 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -04001031 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001032 {SPV_OPERAND_TYPE_NONE}},
1033 {"SubgroupId",
David Neto37547b22015-09-10 13:23:11 -04001034 BuiltInSubgroupId,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001035 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -04001036 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001037 {SPV_OPERAND_TYPE_NONE}},
1038 {"SubgroupLocalInvocationId",
1039 BuiltInSubgroupLocalInvocationId,
1040 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -04001041 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001042 {SPV_OPERAND_TYPE_NONE}},
David Neto2d1b5e52015-09-23 15:35:27 -04001043 {"VertexIndex",
1044 BuiltInVertexIndex,
1045 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -04001046 SPV_CAPABILITY_AS_MASK(CapabilityShader),
David Neto2d1b5e52015-09-23 15:35:27 -04001047 {SPV_OPERAND_TYPE_NONE}},
1048 {"InstanceIndex",
1049 BuiltInInstanceIndex,
1050 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -04001051 SPV_CAPABILITY_AS_MASK(CapabilityShader),
David Neto2d1b5e52015-09-23 15:35:27 -04001052 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001053};
1054
1055static const spv_operand_desc_t selectionControlEntries[] = {
1056 {"None",
1057 SelectionControlMaskNone,
1058 SPV_OPCODE_FLAGS_NONE,
1059 0,
1060 {SPV_OPERAND_TYPE_NONE}},
1061 {"Flatten",
1062 SelectionControlFlattenMask,
1063 SPV_OPCODE_FLAGS_NONE,
1064 0,
1065 {SPV_OPERAND_TYPE_NONE}},
1066 {"DontFlatten",
1067 SelectionControlDontFlattenMask,
1068 SPV_OPCODE_FLAGS_NONE,
1069 0,
1070 {SPV_OPERAND_TYPE_NONE}},
1071};
1072
1073static const spv_operand_desc_t loopControlEntries[] = {
1074 {"None",
1075 LoopControlMaskNone,
1076 SPV_OPCODE_FLAGS_NONE,
1077 0,
1078 {SPV_OPERAND_TYPE_NONE}},
1079 {"Unroll",
1080 LoopControlUnrollMask,
1081 SPV_OPCODE_FLAGS_NONE,
1082 0,
1083 {SPV_OPERAND_TYPE_NONE}},
1084 {"DontUnroll",
1085 LoopControlDontUnrollMask,
1086 SPV_OPCODE_FLAGS_NONE,
1087 0,
1088 {SPV_OPERAND_TYPE_NONE}},
1089};
1090
1091static const spv_operand_desc_t functionControlEntries[] = {
1092 {"None",
1093 FunctionControlMaskNone,
1094 SPV_OPCODE_FLAGS_NONE,
1095 0,
1096 {SPV_OPERAND_TYPE_NONE}},
David Netof4fde6c2015-09-14 14:50:37 -04001097 {"Inline",
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001098 FunctionControlInlineMask,
1099 SPV_OPCODE_FLAGS_NONE,
1100 0,
1101 {SPV_OPERAND_TYPE_NONE}},
1102 {"DontInline",
1103 FunctionControlDontInlineMask,
1104 SPV_OPCODE_FLAGS_NONE,
1105 0,
1106 {SPV_OPERAND_TYPE_NONE}},
1107 {"Pure",
1108 FunctionControlPureMask,
1109 SPV_OPCODE_FLAGS_NONE,
1110 0,
1111 {SPV_OPERAND_TYPE_NONE}},
1112 {"Const",
1113 FunctionControlConstMask,
1114 SPV_OPCODE_FLAGS_NONE,
1115 0,
1116 {SPV_OPERAND_TYPE_NONE}},
1117};
1118
1119static const spv_operand_desc_t memorySemanticsEntries[] = {
David Netobfa3d862015-09-25 10:30:27 -04001120 // "Relaxed" should be a synonym for "None".
1121 // Put the Relaxed entry first so that the disassembler
1122 // will prefer to emit "Relaxed".
1123 {"Relaxed",
1124 MemorySemanticsMaskNone,
1125 SPV_OPCODE_FLAGS_NONE,
1126 0,
1127 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001128 {"None",
1129 MemorySemanticsMaskNone,
1130 SPV_OPCODE_FLAGS_NONE,
1131 0,
1132 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001133 {"SequentiallyConsistent",
1134 MemorySemanticsSequentiallyConsistentMask,
1135 SPV_OPCODE_FLAGS_NONE,
1136 0,
1137 {SPV_OPERAND_TYPE_NONE}},
1138 {"Acquire",
1139 MemorySemanticsAcquireMask,
1140 SPV_OPCODE_FLAGS_NONE,
1141 0,
1142 {SPV_OPERAND_TYPE_NONE}},
1143 {"Release",
1144 MemorySemanticsReleaseMask,
1145 SPV_OPCODE_FLAGS_NONE,
1146 0,
1147 {SPV_OPERAND_TYPE_NONE}},
1148 {"UniformMemory",
1149 MemorySemanticsUniformMemoryMask,
1150 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -04001151 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001152 {SPV_OPERAND_TYPE_NONE}},
1153 {"SubgroupMemory",
1154 MemorySemanticsSubgroupMemoryMask,
1155 SPV_OPCODE_FLAGS_NONE,
1156 0,
1157 {SPV_OPERAND_TYPE_NONE}},
1158 {"WorkgroupLocalMemory",
1159 MemorySemanticsWorkgroupLocalMemoryMask,
1160 SPV_OPCODE_FLAGS_NONE,
1161 0,
1162 {SPV_OPERAND_TYPE_NONE}},
1163 {"WorkgroupGlobalMemory",
1164 MemorySemanticsWorkgroupGlobalMemoryMask,
1165 SPV_OPCODE_FLAGS_NONE,
1166 0,
1167 {SPV_OPERAND_TYPE_NONE}},
1168 {"AtomicCounterMemory",
1169 MemorySemanticsAtomicCounterMemoryMask,
1170 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -04001171 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001172 {SPV_OPERAND_TYPE_NONE}},
1173 {
Dejan Mircevski50babb22015-09-29 10:56:32 -04001174 "ImageMemory",
1175 MemorySemanticsImageMemoryMask,
1176 SPV_OPCODE_FLAGS_NONE,
1177 0,
1178 {SPV_OPERAND_TYPE_NONE},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001179 },
1180};
1181
1182static const spv_operand_desc_t memoryAccessEntries[] = {
1183 {"None",
1184 MemoryAccessMaskNone,
1185 SPV_OPCODE_FLAGS_NONE,
1186 0,
1187 {SPV_OPERAND_TYPE_NONE}},
1188 {"Volatile",
1189 MemoryAccessVolatileMask,
1190 SPV_OPCODE_FLAGS_NONE,
1191 0,
1192 {SPV_OPERAND_TYPE_NONE}},
1193 {
Dejan Mircevski50babb22015-09-29 10:56:32 -04001194 "Aligned",
1195 MemoryAccessAlignedMask,
1196 SPV_OPCODE_FLAGS_NONE,
1197 0,
1198 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001199 },
David Neto49c299b2015-09-23 15:38:59 -04001200 {"Nontemporal",
1201 MemoryAccessNontemporalMask,
1202 SPV_OPCODE_FLAGS_NONE,
1203 0,
1204 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001205};
1206
1207static const spv_operand_desc_t scopeEntries[] = {
1208 {"CrossDevice",
1209 ScopeCrossDevice,
1210 SPV_OPCODE_FLAGS_NONE,
1211 0,
1212 {SPV_OPERAND_TYPE_NONE}},
1213 {"Device", ScopeDevice, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_NONE}},
1214 {"Workgroup",
1215 ScopeWorkgroup,
1216 SPV_OPCODE_FLAGS_NONE,
1217 0,
1218 {SPV_OPERAND_TYPE_NONE}},
1219 {"Subgroup",
1220 ScopeSubgroup,
1221 SPV_OPCODE_FLAGS_NONE,
1222 0,
1223 {SPV_OPERAND_TYPE_NONE}},
1224 {
Dejan Mircevski50babb22015-09-29 10:56:32 -04001225 "Invocation",
1226 ScopeInvocation,
1227 SPV_OPCODE_FLAGS_NONE,
1228 0,
1229 {SPV_OPERAND_TYPE_NONE},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001230 },
1231};
1232
1233static const spv_operand_desc_t groupOperationEntries[] = {
1234 {"Reduce",
1235 GroupOperationReduce,
1236 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -04001237 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001238 {SPV_OPERAND_TYPE_NONE}},
1239 {"InclusiveScan",
1240 GroupOperationInclusiveScan,
1241 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -04001242 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001243 {SPV_OPERAND_TYPE_NONE}},
1244 {"ExclusiveScan",
1245 GroupOperationExclusiveScan,
1246 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -04001247 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001248 {SPV_OPERAND_TYPE_NONE}},
1249};
1250
1251static const spv_operand_desc_t kernelKernelEnqueueFlagssEntries[] = {
1252 {"NoWait",
1253 KernelEnqueueFlagsNoWait,
1254 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -04001255 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001256 {SPV_OPERAND_TYPE_NONE}},
1257 {"WaitKernel",
1258 KernelEnqueueFlagsWaitKernel,
1259 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -04001260 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001261 {SPV_OPERAND_TYPE_NONE}},
1262 {"WaitWorkGroup",
1263 KernelEnqueueFlagsWaitWorkGroup,
1264 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -04001265 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001266 {SPV_OPERAND_TYPE_NONE}},
1267};
1268
1269static const spv_operand_desc_t kernelProfilingInfoEntries[] = {
1270 {"None",
1271 KernelProfilingInfoMaskNone,
1272 SPV_OPCODE_FLAGS_NONE,
1273 0,
1274 {SPV_OPERAND_TYPE_NONE}},
1275 {"CmdExecTime",
1276 KernelProfilingInfoCmdExecTimeMask,
1277 SPV_OPCODE_FLAGS_CAPABILITIES,
Dejan Mircevski205408b2015-09-30 16:42:34 -04001278 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001279 {SPV_OPERAND_TYPE_NONE}},
1280};
1281
David Netod30b2332015-09-23 16:04:24 -04001282// A macro for defining a capability that doesn't depend on another capability.
1283#define CASE(NAME) \
1284 { \
1285 #NAME, Capability##NAME, SPV_OPCODE_FLAGS_NONE, 0, { \
1286 SPV_OPERAND_TYPE_NONE \
1287 } \
1288 }
1289
1290// A macro for defining a capability that depends on another.
David Neto1b9d70a2015-10-05 09:55:23 -04001291#define CASE_CAP(NAME, CAP) \
1292 { \
1293 #NAME, Capability##NAME, SPV_OPCODE_FLAGS_CAPABILITIES, \
1294 SPV_CAPABILITY_AS_MASK(Capability##CAP), { \
1295 SPV_OPERAND_TYPE_NONE \
1296 } \
David Netod30b2332015-09-23 16:04:24 -04001297 }
1298
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001299static const spv_operand_desc_t capabilityInfoEntries[] = {
David Netod30b2332015-09-23 16:04:24 -04001300 CASE(Matrix),
1301 CASE_CAP(Shader, Matrix),
1302 CASE_CAP(Geometry, Shader),
1303 CASE_CAP(Tessellation, Shader),
1304 CASE(Addresses),
1305 CASE(Linkage),
1306 CASE(Kernel),
1307 CASE_CAP(Vector16, Kernel),
1308 CASE_CAP(Float16Buffer, Kernel),
1309 CASE_CAP(Float16, Float16Buffer),
1310 CASE(Float64),
1311 CASE(Int64),
1312 CASE_CAP(Int64Atomics, Int64),
1313 CASE_CAP(ImageBasic, Kernel),
1314 CASE_CAP(ImageReadWrite, Kernel),
1315 CASE_CAP(ImageMipmap, Kernel),
1316 CASE_CAP(ImageSRGBWrite, Kernel),
1317 CASE_CAP(Pipes, Kernel),
1318 CASE(Groups),
1319 CASE_CAP(DeviceEnqueue, Kernel),
1320 CASE_CAP(LiteralSampler, Kernel),
1321 CASE_CAP(AtomicStorage, Shader),
1322 CASE(Int16),
1323 CASE_CAP(TessellationPointSize, Tessellation),
1324 CASE_CAP(GeometryPointSize, Geometry),
1325 CASE_CAP(ImageGatherExtended, Shader),
1326 CASE_CAP(StorageImageExtendedFormats, Shader),
1327 CASE_CAP(StorageImageMultisample, Shader),
1328 CASE_CAP(UniformBufferArrayDynamicIndexing, Shader),
1329 CASE_CAP(SampledImageArrayDynamicIndexing, Shader),
1330 CASE_CAP(StorageBufferArrayDynamicIndexing, Shader),
1331 CASE_CAP(StorageImageArrayDynamicIndexing, Shader),
1332 CASE_CAP(ClipDistance, Shader),
1333 CASE_CAP(CullDistance, Shader),
1334 CASE_CAP(ImageCubeArray, SampledCubeArray),
1335 CASE_CAP(SampleRateShading, Shader),
1336 CASE_CAP(ImageRect, SampledRect),
1337 CASE_CAP(SampledRect, Shader),
1338 CASE_CAP(GenericPointer, Addresses),
1339 CASE_CAP(Int8, Kernel),
1340 CASE_CAP(InputTarget, Shader),
1341 CASE_CAP(SparseResidency, Shader),
1342 CASE_CAP(MinLod, Shader),
1343 CASE_CAP(Sampled1D, Shader),
1344 CASE_CAP(Image1D, Sampled1D),
1345 CASE_CAP(SampledCubeArray, Shader),
1346 CASE_CAP(SampledBuffer, Shader),
1347 CASE_CAP(ImageBuffer, SampledBuffer),
1348 CASE_CAP(ImageMSArray, Shader),
1349 CASE_CAP(AdvancedFormats, Shader),
1350 CASE_CAP(ImageQuery, Shader),
1351 CASE_CAP(DerivativeControl, Shader),
1352 CASE_CAP(InterpolationFunction, Shader),
1353 CASE_CAP(TransformFeedback, Shader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001354};
David Netod30b2332015-09-23 16:04:24 -04001355#undef CASE
1356#undef CASE_CAP
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001357
1358static const spv_operand_desc_group_t opcodeEntryTypes[] = {
1359 {SPV_OPERAND_TYPE_SOURCE_LANGUAGE,
1360 sizeof(sourceLanguageEntries) / sizeof(spv_operand_desc_t),
1361 sourceLanguageEntries},
1362 {SPV_OPERAND_TYPE_EXECUTION_MODEL,
1363 sizeof(executionModelEntries) / sizeof(spv_operand_desc_t),
1364 executionModelEntries},
1365 {SPV_OPERAND_TYPE_ADDRESSING_MODEL,
1366 sizeof(addressingModelEntries) / sizeof(spv_operand_desc_t),
1367 addressingModelEntries},
1368 {SPV_OPERAND_TYPE_MEMORY_MODEL,
1369 sizeof(memoryModelEntries) / sizeof(spv_operand_desc_t),
1370 memoryModelEntries},
1371 {SPV_OPERAND_TYPE_EXECUTION_MODE,
1372 sizeof(executionModeEntries) / sizeof(spv_operand_desc_t),
1373 executionModeEntries},
1374 {SPV_OPERAND_TYPE_STORAGE_CLASS,
1375 sizeof(storageClassEntries) / sizeof(spv_operand_desc_t),
1376 storageClassEntries},
1377 {SPV_OPERAND_TYPE_DIMENSIONALITY,
1378 sizeof(dimensionalityEntries) / sizeof(spv_operand_desc_t),
1379 dimensionalityEntries},
1380 {SPV_OPERAND_TYPE_SAMPLER_ADDRESSING_MODE,
1381 sizeof(samplerAddressingModeEntries) / sizeof(spv_operand_desc_t),
1382 samplerAddressingModeEntries},
1383 {SPV_OPERAND_TYPE_SAMPLER_FILTER_MODE,
1384 sizeof(samplerFilterModeEntries) / sizeof(spv_operand_desc_t),
1385 samplerFilterModeEntries},
David Netob30a0c52015-09-16 15:56:43 -04001386 {SPV_OPERAND_TYPE_SAMPLER_IMAGE_FORMAT,
1387 sizeof(samplerImageFormatEntries) / sizeof(spv_operand_desc_t),
1388 samplerImageFormatEntries},
David Netoddda85a2015-10-02 17:10:10 -04001389 {SPV_OPERAND_TYPE_IMAGE_CHANNEL_ORDER,
1390 sizeof(imageChannelOrderEntries) / sizeof(spv_operand_desc_t),
1391 imageChannelOrderEntries},
1392 {SPV_OPERAND_TYPE_IMAGE_CHANNEL_DATA_TYPE,
1393 sizeof(imageChannelDataTypeEntries) / sizeof(spv_operand_desc_t),
1394 imageChannelDataTypeEntries},
David Netoee1b3bb2015-09-18 11:19:18 -04001395 {SPV_OPERAND_TYPE_OPTIONAL_IMAGE,
1396 sizeof(imageOperandEntries) / sizeof(spv_operand_desc_t),
1397 imageOperandEntries},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001398 {SPV_OPERAND_TYPE_FP_FAST_MATH_MODE,
1399 sizeof(fpFastMathModeEntries) / sizeof(spv_operand_desc_t),
1400 fpFastMathModeEntries},
1401 {SPV_OPERAND_TYPE_FP_ROUNDING_MODE,
1402 sizeof(fpRoundingModeEntries) / sizeof(spv_operand_desc_t),
1403 fpRoundingModeEntries},
1404 {SPV_OPERAND_TYPE_LINKAGE_TYPE,
1405 sizeof(linkageTypeEntries) / sizeof(spv_operand_desc_t),
1406 linkageTypeEntries},
1407 {SPV_OPERAND_TYPE_ACCESS_QUALIFIER,
1408 sizeof(accessQualifierEntries) / sizeof(spv_operand_desc_t),
1409 accessQualifierEntries},
1410 {SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE,
1411 sizeof(functionParameterAttributeEntries) / sizeof(spv_operand_desc_t),
1412 functionParameterAttributeEntries},
1413 {SPV_OPERAND_TYPE_DECORATION,
1414 sizeof(decorationEntries) / sizeof(spv_operand_desc_t), decorationEntries},
1415 {SPV_OPERAND_TYPE_BUILT_IN,
1416 sizeof(builtInEntries) / sizeof(spv_operand_desc_t), builtInEntries},
1417 {SPV_OPERAND_TYPE_SELECTION_CONTROL,
1418 sizeof(selectionControlEntries) / sizeof(spv_operand_desc_t),
1419 selectionControlEntries},
1420 {SPV_OPERAND_TYPE_LOOP_CONTROL,
1421 sizeof(loopControlEntries) / sizeof(spv_operand_desc_t),
1422 loopControlEntries},
1423 {SPV_OPERAND_TYPE_FUNCTION_CONTROL,
1424 sizeof(functionControlEntries) / sizeof(spv_operand_desc_t),
1425 functionControlEntries},
1426 {SPV_OPERAND_TYPE_MEMORY_SEMANTICS,
1427 sizeof(memorySemanticsEntries) / sizeof(spv_operand_desc_t),
1428 memorySemanticsEntries},
David Neto78c3b432015-08-27 13:03:52 -04001429 {SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001430 sizeof(memoryAccessEntries) / sizeof(spv_operand_desc_t),
1431 memoryAccessEntries},
1432 {SPV_OPERAND_TYPE_EXECUTION_SCOPE,
1433 sizeof(scopeEntries) / sizeof(spv_operand_desc_t), scopeEntries},
1434 {SPV_OPERAND_TYPE_GROUP_OPERATION,
1435 sizeof(groupOperationEntries) / sizeof(spv_operand_desc_t),
1436 groupOperationEntries},
1437 {SPV_OPERAND_TYPE_KERNEL_ENQ_FLAGS,
1438 sizeof(kernelKernelEnqueueFlagssEntries) / sizeof(spv_operand_desc_t),
1439 kernelKernelEnqueueFlagssEntries},
David Neto47994822015-08-27 13:11:01 -04001440 {SPV_OPERAND_TYPE_KERNEL_PROFILING_INFO,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001441 sizeof(kernelProfilingInfoEntries) / sizeof(spv_operand_desc_t),
1442 kernelProfilingInfoEntries},
1443 {SPV_OPERAND_TYPE_CAPABILITY,
1444 sizeof(capabilityInfoEntries) / sizeof(spv_operand_desc_t),
1445 capabilityInfoEntries},
1446};
1447
Dejan Mircevski50babb22015-09-29 10:56:32 -04001448spv_result_t spvOperandTableGet(spv_operand_table* pOperandTable) {
Lei Zhang40056702015-09-11 14:31:27 -04001449 if (!pOperandTable) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001450
1451 static const spv_operand_table_t table = {
1452 sizeof(opcodeEntryTypes) / sizeof(spv_operand_desc_group_t),
1453 opcodeEntryTypes};
1454
1455 *pOperandTable = &table;
1456
1457 return SPV_SUCCESS;
1458}
1459
1460spv_result_t spvOperandTableNameLookup(const spv_operand_table table,
1461 const spv_operand_type_t type,
David Neto388c40d2015-09-16 16:42:56 -04001462 const char* name,
1463 const size_t nameLength,
1464 spv_operand_desc* pEntry) {
Lei Zhang40056702015-09-11 14:31:27 -04001465 if (!table) return SPV_ERROR_INVALID_TABLE;
1466 if (!name || !pEntry) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001467
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001468 for (uint64_t typeIndex = 0; typeIndex < table->count; ++typeIndex) {
1469 if (type == table->types[typeIndex].type) {
1470 for (uint64_t operandIndex = 0;
1471 operandIndex < table->types[typeIndex].count; ++operandIndex) {
1472 if (nameLength ==
1473 strlen(table->types[typeIndex].entries[operandIndex].name) &&
1474 !strncmp(table->types[typeIndex].entries[operandIndex].name, name,
David Neto388c40d2015-09-16 16:42:56 -04001475 nameLength)) {
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001476 *pEntry = &table->types[typeIndex].entries[operandIndex];
1477 return SPV_SUCCESS;
1478 }
1479 }
1480 }
1481 }
1482
1483 return SPV_ERROR_INVALID_LOOKUP;
1484}
1485
1486spv_result_t spvOperandTableValueLookup(const spv_operand_table table,
1487 const spv_operand_type_t type,
1488 const uint32_t value,
Dejan Mircevski50babb22015-09-29 10:56:32 -04001489 spv_operand_desc* pEntry) {
Lei Zhang40056702015-09-11 14:31:27 -04001490 if (!table) return SPV_ERROR_INVALID_TABLE;
1491 if (!pEntry) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001492
1493 for (uint64_t typeIndex = 0; typeIndex < table->count; ++typeIndex) {
1494 if (type == table->types[typeIndex].type) {
1495 for (uint64_t operandIndex = 0;
1496 operandIndex < table->types[typeIndex].count; ++operandIndex) {
1497 if (value == table->types[typeIndex].entries[operandIndex].value) {
1498 *pEntry = &table->types[typeIndex].entries[operandIndex];
1499 return SPV_SUCCESS;
1500 }
1501 }
1502 }
1503 }
1504
1505 return SPV_ERROR_INVALID_LOOKUP;
1506}
1507
Dejan Mircevski50babb22015-09-29 10:56:32 -04001508const char* spvOperandTypeStr(spv_operand_type_t type) {
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001509 switch (type) {
1510 case SPV_OPERAND_TYPE_ID:
David Netofadbf622015-09-14 17:07:11 -04001511 case SPV_OPERAND_TYPE_OPTIONAL_ID:
1512 case SPV_OPERAND_TYPE_ID_IN_OPTIONAL_TUPLE:
1513 return "ID";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001514 case SPV_OPERAND_TYPE_RESULT_ID:
1515 return "result ID";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001516 case SPV_OPERAND_TYPE_LITERAL_NUMBER:
1517 return "literal number";
Lei Zhangb41d1502015-09-14 15:22:23 -04001518 case SPV_OPERAND_TYPE_MULTIWORD_LITERAL_NUMBER:
1519 return "multiple word literal number";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001520 case SPV_OPERAND_TYPE_LITERAL_STRING:
1521 return "literal string";
1522 case SPV_OPERAND_TYPE_SOURCE_LANGUAGE:
1523 return "source langauge";
1524 case SPV_OPERAND_TYPE_EXECUTION_MODEL:
1525 return "execution model";
1526 case SPV_OPERAND_TYPE_ADDRESSING_MODEL:
1527 return "addressing model";
1528 case SPV_OPERAND_TYPE_MEMORY_MODEL:
1529 return "memory model";
1530 case SPV_OPERAND_TYPE_EXECUTION_MODE:
1531 return "execution mode";
1532 case SPV_OPERAND_TYPE_STORAGE_CLASS:
1533 return "storage class";
1534 case SPV_OPERAND_TYPE_DIMENSIONALITY:
1535 return "dimensionality";
1536 case SPV_OPERAND_TYPE_SAMPLER_ADDRESSING_MODE:
1537 return "addressing mode";
1538 case SPV_OPERAND_TYPE_SAMPLER_FILTER_MODE:
1539 return "sampler filter mode";
David Netob30a0c52015-09-16 15:56:43 -04001540 case SPV_OPERAND_TYPE_SAMPLER_IMAGE_FORMAT:
1541 return "sampler image format";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001542 case SPV_OPERAND_TYPE_FP_FAST_MATH_MODE:
1543 return "floating pointer fast math mode";
1544 case SPV_OPERAND_TYPE_FP_ROUNDING_MODE:
1545 return "floating point rounding mode";
1546 case SPV_OPERAND_TYPE_LINKAGE_TYPE:
1547 return "linkage type";
1548 case SPV_OPERAND_TYPE_ACCESS_QUALIFIER:
1549 return "access qualifier";
1550 case SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE:
1551 return "function parameter attribute";
1552 case SPV_OPERAND_TYPE_DECORATION:
1553 return "decoration";
1554 case SPV_OPERAND_TYPE_BUILT_IN:
1555 return "built in";
1556 case SPV_OPERAND_TYPE_SELECTION_CONTROL:
1557 return "selection control";
1558 case SPV_OPERAND_TYPE_LOOP_CONTROL:
1559 return "loop control";
1560 case SPV_OPERAND_TYPE_FUNCTION_CONTROL:
1561 return "function control";
1562 case SPV_OPERAND_TYPE_MEMORY_SEMANTICS:
1563 return "memory semantics";
David Neto78c3b432015-08-27 13:03:52 -04001564 case SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001565 return "memory access";
1566 case SPV_OPERAND_TYPE_EXECUTION_SCOPE:
David Netofadbf622015-09-14 17:07:11 -04001567 return "execution scope ID";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001568 case SPV_OPERAND_TYPE_GROUP_OPERATION:
1569 return "group operation";
1570 case SPV_OPERAND_TYPE_KERNEL_ENQ_FLAGS:
1571 return "kernel enqeue flags";
David Neto47994822015-08-27 13:11:01 -04001572 case SPV_OPERAND_TYPE_KERNEL_PROFILING_INFO:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001573 return "kernel profiling info";
1574 case SPV_OPERAND_TYPE_CAPABILITY:
1575 return "capability";
David Netoee1b3bb2015-09-18 11:19:18 -04001576 case SPV_OPERAND_TYPE_OPTIONAL_IMAGE:
1577 return "image operand";
David Neto78c3b432015-08-27 13:03:52 -04001578 case SPV_OPERAND_TYPE_NONE:
1579 return "NONE";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001580 default:
1581 assert(0 && "Unhandled operand type!");
1582 break;
1583 }
1584 return "unknown";
1585}
David Neto78c3b432015-08-27 13:03:52 -04001586
1587void spvPrependOperandTypes(const spv_operand_type_t* types,
1588 spv_operand_pattern_t* pattern) {
1589 const spv_operand_type_t* endTypes;
Dejan Mircevski50babb22015-09-29 10:56:32 -04001590 for (endTypes = types; *endTypes != SPV_OPERAND_TYPE_NONE; ++endTypes)
David Neto78c3b432015-08-27 13:03:52 -04001591 ;
1592 pattern->insert(pattern->begin(), types, endTypes);
1593}
1594
David Neto5bf88fc2015-09-17 17:06:10 -04001595void spvPrependOperandTypesForMask(const spv_operand_table operandTable,
1596 const spv_operand_type_t type,
1597 const uint32_t mask,
1598 spv_operand_pattern_t* pattern) {
1599 // Scan from highest bits to lowest bits because we will prepend in LIFO
1600 // fashion, and we need the operands for lower order bits to appear first.
1601 for (uint32_t candidate_bit = (1 << 31); candidate_bit; candidate_bit >>= 1) {
1602 if (candidate_bit & mask) {
1603 spv_operand_desc entry = nullptr;
1604 if (SPV_SUCCESS == spvOperandTableValueLookup(operandTable, type,
1605 candidate_bit, &entry)) {
1606 spvPrependOperandTypes(entry->operandTypes, pattern);
1607 }
1608 }
1609 }
1610}
1611
David Neto78c3b432015-08-27 13:03:52 -04001612bool spvOperandIsOptional(spv_operand_type_t type) {
1613 // Variable means zero or more times.
Dejan Mircevski50babb22015-09-29 10:56:32 -04001614 if (spvOperandIsVariable(type)) return true;
David Neto78c3b432015-08-27 13:03:52 -04001615
1616 switch (type) {
1617 case SPV_OPERAND_TYPE_OPTIONAL_ID:
1618 case SPV_OPERAND_TYPE_OPTIONAL_IMAGE:
David Neto561dc4e2015-09-25 14:23:29 -04001619 case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_NUMBER:
David Neto78c3b432015-08-27 13:03:52 -04001620 case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_STRING:
1621 case SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS:
1622 case SPV_OPERAND_TYPE_OPTIONAL_EXECUTION_MODE:
Dejan Mircevski903f9d62015-09-28 17:04:39 -04001623 case SPV_OPERAND_TYPE_OPTIONAL_CIV:
David Neto78c3b432015-08-27 13:03:52 -04001624 return true;
1625 default:
1626 break;
1627 }
1628 return false;
1629}
1630
1631bool spvOperandIsVariable(spv_operand_type_t type) {
1632 switch (type) {
1633 case SPV_OPERAND_TYPE_VARIABLE_ID:
David Neto561dc4e2015-09-25 14:23:29 -04001634 case SPV_OPERAND_TYPE_VARIABLE_LITERAL_NUMBER:
1635 case SPV_OPERAND_TYPE_VARIABLE_ID_LITERAL_NUMBER:
1636 case SPV_OPERAND_TYPE_VARIABLE_LITERAL_NUMBER_ID:
David Neto78c3b432015-08-27 13:03:52 -04001637 case SPV_OPERAND_TYPE_VARIABLE_EXECUTION_MODE:
1638 return true;
1639 default:
1640 break;
1641 }
1642 return false;
1643}
1644
David Neto78c3b432015-08-27 13:03:52 -04001645bool spvExpandOperandSequenceOnce(spv_operand_type_t type,
1646 spv_operand_pattern_t* pattern) {
1647 switch (type) {
1648 case SPV_OPERAND_TYPE_VARIABLE_ID:
1649 pattern->insert(pattern->begin(), {SPV_OPERAND_TYPE_OPTIONAL_ID, type});
1650 return true;
David Neto561dc4e2015-09-25 14:23:29 -04001651 case SPV_OPERAND_TYPE_VARIABLE_LITERAL_NUMBER:
David Neto78c3b432015-08-27 13:03:52 -04001652 pattern->insert(pattern->begin(),
David Neto561dc4e2015-09-25 14:23:29 -04001653 {SPV_OPERAND_TYPE_OPTIONAL_LITERAL_NUMBER, type});
David Neto78c3b432015-08-27 13:03:52 -04001654 return true;
David Neto561dc4e2015-09-25 14:23:29 -04001655 case SPV_OPERAND_TYPE_VARIABLE_LITERAL_NUMBER_ID:
1656 // Represents Zero or more (Literal number, Id) pairs.
David Neto78c3b432015-08-27 13:03:52 -04001657 pattern->insert(pattern->begin(),
David Neto561dc4e2015-09-25 14:23:29 -04001658 {SPV_OPERAND_TYPE_OPTIONAL_LITERAL_NUMBER,
David Neto78c3b432015-08-27 13:03:52 -04001659 SPV_OPERAND_TYPE_ID_IN_OPTIONAL_TUPLE, type});
1660 return true;
David Neto561dc4e2015-09-25 14:23:29 -04001661 case SPV_OPERAND_TYPE_VARIABLE_ID_LITERAL_NUMBER:
1662 // Represents Zero or more (Id, Literal number) pairs.
Dejan Mircevski50babb22015-09-29 10:56:32 -04001663 pattern->insert(
1664 pattern->begin(),
1665 {SPV_OPERAND_TYPE_OPTIONAL_ID,
1666 SPV_OPERAND_TYPE_LITERAL_NUMBER_IN_OPTIONAL_TUPLE, type});
David Neto78c3b432015-08-27 13:03:52 -04001667 return true;
David Neto78c3b432015-08-27 13:03:52 -04001668 case SPV_OPERAND_TYPE_VARIABLE_EXECUTION_MODE:
Dejan Mircevski50babb22015-09-29 10:56:32 -04001669 pattern->insert(pattern->begin(),
1670 {SPV_OPERAND_TYPE_OPTIONAL_EXECUTION_MODE, type});
David Neto78c3b432015-08-27 13:03:52 -04001671 return true;
1672 default:
1673 break;
1674 }
1675 return false;
1676}
1677
Dejan Mircevski50babb22015-09-29 10:56:32 -04001678spv_operand_type_t spvTakeFirstMatchableOperand(
1679 spv_operand_pattern_t* pattern) {
David Neto78c3b432015-08-27 13:03:52 -04001680 assert(!pattern->empty());
1681 spv_operand_type_t result;
1682 do {
1683 result = pattern->front();
1684 pattern->pop_front();
Dejan Mircevski50babb22015-09-29 10:56:32 -04001685 } while (spvExpandOperandSequenceOnce(result, pattern));
David Neto78c3b432015-08-27 13:03:52 -04001686 return result;
1687}
Dejan Mircevski903f9d62015-09-28 17:04:39 -04001688
Dejan Mircevski897bff92015-09-29 10:38:18 -04001689spv_operand_pattern_t spvAlternatePatternFollowingImmediate(
1690 const spv_operand_pattern_t& pattern) {
1691 spv_operand_pattern_t alternatePattern;
1692 for (const auto& operand : pattern) {
1693 if (operand == SPV_OPERAND_TYPE_RESULT_ID) {
1694 alternatePattern.push_back(operand);
1695 alternatePattern.push_back(SPV_OPERAND_TYPE_OPTIONAL_CIV);
1696 return alternatePattern;
Dejan Mircevski903f9d62015-09-28 17:04:39 -04001697 }
Dejan Mircevski897bff92015-09-29 10:38:18 -04001698 alternatePattern.push_back(SPV_OPERAND_TYPE_OPTIONAL_CIV);
Dejan Mircevski903f9d62015-09-28 17:04:39 -04001699 }
Dejan Mircevski897bff92015-09-29 10:38:18 -04001700 // No result-id found, so just expect CIVs.
1701 return {SPV_OPERAND_TYPE_OPTIONAL_CIV};
Dejan Mircevski903f9d62015-09-28 17:04:39 -04001702}