blob: c76d8c39b7f126209e3054bda66dcdb98907cb4c [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,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010035 0,
36 {SPV_OPERAND_TYPE_NONE}},
37 {"ESSL",
38 SourceLanguageESSL,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010039 0,
40 {SPV_OPERAND_TYPE_NONE}},
41 {"GLSL",
42 SourceLanguageGLSL,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010043 0,
44 {SPV_OPERAND_TYPE_NONE}},
45 {"OpenCL",
46 SourceLanguageOpenCL,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010047 0,
48 {SPV_OPERAND_TYPE_NONE}},
49};
50
51static const spv_operand_desc_t executionModelEntries[] = {
52 {"Vertex",
53 ExecutionModelVertex,
Dejan Mircevski205408b2015-09-30 16:42:34 -040054 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010055 {SPV_OPERAND_TYPE_NONE}},
56 {"TessellationControl",
57 ExecutionModelTessellationControl,
Dejan Mircevski205408b2015-09-30 16:42:34 -040058 SPV_CAPABILITY_AS_MASK(CapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010059 {SPV_OPERAND_TYPE_NONE}},
60 {"TessellationEvaluation",
61 ExecutionModelTessellationEvaluation,
Dejan Mircevski205408b2015-09-30 16:42:34 -040062 SPV_CAPABILITY_AS_MASK(CapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010063 {SPV_OPERAND_TYPE_NONE}},
64 {"Geometry",
65 ExecutionModelGeometry,
Dejan Mircevski205408b2015-09-30 16:42:34 -040066 SPV_CAPABILITY_AS_MASK(CapabilityGeometry),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010067 {SPV_OPERAND_TYPE_NONE}},
68 {"Fragment",
69 ExecutionModelFragment,
Dejan Mircevski205408b2015-09-30 16:42:34 -040070 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010071 {SPV_OPERAND_TYPE_NONE}},
72 {"GLCompute",
73 ExecutionModelGLCompute,
Dejan Mircevski205408b2015-09-30 16:42:34 -040074 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010075 {SPV_OPERAND_TYPE_NONE}},
76 {"Kernel",
77 ExecutionModelKernel,
Dejan Mircevski205408b2015-09-30 16:42:34 -040078 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010079 {SPV_OPERAND_TYPE_NONE}},
80};
81
82static const spv_operand_desc_t addressingModelEntries[] = {
83 {"Logical",
84 AddressingModelLogical,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010085 0,
86 {SPV_OPERAND_TYPE_NONE}},
87 {"Physical32",
88 AddressingModelPhysical32,
Dejan Mircevski205408b2015-09-30 16:42:34 -040089 SPV_CAPABILITY_AS_MASK(CapabilityAddresses),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010090 {SPV_OPERAND_TYPE_NONE}},
91 {"Physical64",
92 AddressingModelPhysical64,
Dejan Mircevski205408b2015-09-30 16:42:34 -040093 SPV_CAPABILITY_AS_MASK(CapabilityAddresses),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010094 {SPV_OPERAND_TYPE_NONE}},
95};
96
97static const spv_operand_desc_t memoryModelEntries[] = {
98 {"Simple",
99 MemoryModelSimple,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400100 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100101 {SPV_OPERAND_TYPE_NONE}},
102 {"GLSL450",
103 MemoryModelGLSL450,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400104 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100105 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400106 {"OpenCL",
107 MemoryModelOpenCL,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400108 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100109 {SPV_OPERAND_TYPE_NONE}},
110};
111
Lei Zhang85c6f792015-09-23 15:42:18 -0400112// Execution mode requiring the given capability and having no operands.
David Neto9db3a532015-10-07 16:58:38 -0400113#define ExecMode0(mode, cap) \
114 #mode, ExecutionMode##mode, SPV_CAPABILITY_AS_MASK(Capability##cap), { \
115 SPV_OPERAND_TYPE_NONE \
Lei Zhang85c6f792015-09-23 15:42:18 -0400116 }
117// Execution mode requiring the given capability and having one literal number
118// operand.
David Neto9db3a532015-10-07 16:58:38 -0400119#define ExecMode1(mode, cap) \
120 #mode, ExecutionMode##mode, SPV_CAPABILITY_AS_MASK(Capability##cap), { \
121 SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE \
Lei Zhang85c6f792015-09-23 15:42:18 -0400122 }
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100123static const spv_operand_desc_t executionModeEntries[] = {
Lei Zhang85c6f792015-09-23 15:42:18 -0400124 {ExecMode1(Invocations, Geometry)},
125 {ExecMode0(SpacingEqual, Tessellation)},
126 {ExecMode0(SpacingFractionalEven, Tessellation)},
127 {ExecMode0(SpacingFractionalOdd, Tessellation)},
128 {ExecMode0(VertexOrderCw, Tessellation)},
129 {ExecMode0(VertexOrderCcw, Tessellation)},
130 {ExecMode0(PixelCenterInteger, Shader)},
131 {ExecMode0(OriginUpperLeft, Shader)},
132 {ExecMode0(OriginLowerLeft, Shader)},
133 {ExecMode0(EarlyFragmentTests, Shader)},
134 {ExecMode0(PointMode, Tessellation)},
Lei Zhang863ddbe2015-09-23 17:09:01 -0400135 {ExecMode0(Xfb, TransformFeedback)},
Lei Zhang85c6f792015-09-23 15:42:18 -0400136 {ExecMode0(DepthReplacing, Shader)},
Lei Zhang85c6f792015-09-23 15:42:18 -0400137 {ExecMode0(DepthGreater, Shader)},
138 {ExecMode0(DepthLess, Shader)},
139 {ExecMode0(DepthUnchanged, Shader)},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100140 {"LocalSize",
141 ExecutionModeLocalSize,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100142 0,
143 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_LITERAL_NUMBER,
144 SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
145 {"LocalSizeHint",
146 ExecutionModeLocalSizeHint,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400147 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100148 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_LITERAL_NUMBER,
149 SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
Lei Zhang85c6f792015-09-23 15:42:18 -0400150 {ExecMode0(InputPoints, Geometry)},
151 {ExecMode0(InputLines, Geometry)},
152 {ExecMode0(InputLinesAdjacency, Geometry)},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100153 {"InputTriangles",
154 ExecutionModeInputTriangles,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400155 SPV_CAPABILITY_AS_MASK(CapabilityGeometry) |
156 SPV_CAPABILITY_AS_MASK(CapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100157 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang85c6f792015-09-23 15:42:18 -0400158 {ExecMode0(InputTrianglesAdjacency, Geometry)},
159 {ExecMode0(InputQuads, Tessellation)},
160 {ExecMode0(InputIsolines, Tessellation)},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100161 {"OutputVertices",
162 ExecutionModeOutputVertices,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400163 SPV_CAPABILITY_AS_MASK(CapabilityGeometry) |
164 SPV_CAPABILITY_AS_MASK(CapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100165 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
Lei Zhang85c6f792015-09-23 15:42:18 -0400166 {ExecMode0(OutputPoints, Geometry)},
167 {ExecMode0(OutputLineStrip, Geometry)},
168 {ExecMode0(OutputTriangleStrip, Geometry)},
169 {ExecMode1(VecTypeHint, Kernel)},
170 {ExecMode0(ContractionOff, Kernel)},
171 {ExecMode0(IndependentForwardProgress, Kernel)},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100172};
Lei Zhang85c6f792015-09-23 15:42:18 -0400173#undef ExecMode0
174#undef ExecMode1
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100175
176static const spv_operand_desc_t storageClassEntries[] = {
Dejan Mircevski50babb22015-09-29 10:56:32 -0400177 // TODO(dneto): There are more storage classes in Rev32 and later.
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100178 {"UniformConstant",
179 StorageClassUniformConstant,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100180 0,
181 {SPV_OPERAND_TYPE_NONE}},
182 {"Input",
183 StorageClassInput,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400184 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100185 {SPV_OPERAND_TYPE_NONE}},
186 {"Uniform",
187 StorageClassUniform,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400188 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100189 {SPV_OPERAND_TYPE_NONE}},
190 {"Output",
191 StorageClassOutput,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400192 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100193 {SPV_OPERAND_TYPE_NONE}},
194 {"WorkgroupLocal",
195 StorageClassWorkgroupLocal,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100196 0,
197 {SPV_OPERAND_TYPE_NONE}},
198 {"WorkgroupGlobal",
199 StorageClassWorkgroupGlobal,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100200 0,
201 {SPV_OPERAND_TYPE_NONE}},
202 {"PrivateGlobal",
203 StorageClassPrivateGlobal,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400204 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100205 {SPV_OPERAND_TYPE_NONE}},
206 {"Function",
207 StorageClassFunction,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100208 0,
209 {SPV_OPERAND_TYPE_NONE}},
210 {"Generic",
211 StorageClassGeneric,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400212 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100213 {SPV_OPERAND_TYPE_NONE}},
David Neto9819adf2015-09-23 10:19:57 -0400214 {"PushConstant",
215 StorageClassPushConstant,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400216 SPV_CAPABILITY_AS_MASK(CapabilityShader),
David Neto9819adf2015-09-23 10:19:57 -0400217 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100218 {"AtomicCounter",
219 StorageClassAtomicCounter,
David Netoddda85a2015-10-02 17:10:10 -0400220 SPV_CAPABILITY_AS_MASK(CapabilityAtomicStorage),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100221 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400222 {"Image",
223 StorageClassImage,
Lei Zhang604e5ce2015-08-14 14:46:43 -0400224 0,
225 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100226};
227
228static const spv_operand_desc_t dimensionalityEntries[] = {
David Netoddda85a2015-10-02 17:10:10 -0400229 {"1D",
230 Dim1D,
David Netoddda85a2015-10-02 17:10:10 -0400231 SPV_CAPABILITY_AS_MASK(CapabilitySampled1D),
232 {SPV_OPERAND_TYPE_NONE}},
David Neto9db3a532015-10-07 16:58:38 -0400233 {"2D", Dim2D, 0, {SPV_OPERAND_TYPE_NONE}},
234 {"3D", Dim3D, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100235 {"Cube",
236 DimCube,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400237 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100238 {SPV_OPERAND_TYPE_NONE}},
239 {"Rect",
240 DimRect,
David Netoddda85a2015-10-02 17:10:10 -0400241 SPV_CAPABILITY_AS_MASK(CapabilitySampledRect),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100242 {SPV_OPERAND_TYPE_NONE}},
David Netoddda85a2015-10-02 17:10:10 -0400243 {"Buffer",
244 DimBuffer,
David Netoddda85a2015-10-02 17:10:10 -0400245 SPV_CAPABILITY_AS_MASK(CapabilitySampledBuffer),
246 {SPV_OPERAND_TYPE_NONE}},
David Netoaa0c3a52015-09-23 10:30:06 -0400247 {"InputTarget",
248 DimInputTarget,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400249 SPV_CAPABILITY_AS_MASK(CapabilityInputTarget),
David Netoaa0c3a52015-09-23 10:30:06 -0400250 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100251};
252
253static const spv_operand_desc_t samplerAddressingModeEntries[] = {
254 {"None",
255 SamplerAddressingModeNone,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400256 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100257 {SPV_OPERAND_TYPE_NONE}},
258 {"ClampToEdge",
259 SamplerAddressingModeClampToEdge,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400260 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100261 {SPV_OPERAND_TYPE_NONE}},
262 {"Clamp",
263 SamplerAddressingModeClamp,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400264 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100265 {SPV_OPERAND_TYPE_NONE}},
266 {"Repeat",
267 SamplerAddressingModeRepeat,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400268 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100269 {SPV_OPERAND_TYPE_NONE}},
270 {"RepeatMirrored",
271 SamplerAddressingModeRepeatMirrored,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400272 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100273 {SPV_OPERAND_TYPE_NONE}},
274};
275
276static const spv_operand_desc_t samplerFilterModeEntries[] = {
277 {"Nearest",
278 SamplerFilterModeNearest,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400279 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100280 {SPV_OPERAND_TYPE_NONE}},
281 {"Linear",
282 SamplerFilterModeLinear,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400283 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100284 {SPV_OPERAND_TYPE_NONE}},
285};
286
David Netob30a0c52015-09-16 15:56:43 -0400287static const spv_operand_desc_t samplerImageFormatEntries[] = {
David Neto9db3a532015-10-07 16:58:38 -0400288#define CASE0(NAME) \
289 { \
290 #NAME, ImageFormat##NAME, 0, { SPV_OPERAND_TYPE_NONE } \
David Netoddda85a2015-10-02 17:10:10 -0400291 }
David Neto9db3a532015-10-07 16:58:38 -0400292#define CASE(NAME, CAP) \
293 { \
294 #NAME, ImageFormat##NAME, SPV_CAPABILITY_AS_MASK(Capability##CAP), { \
295 SPV_OPERAND_TYPE_NONE \
296 } \
David Netob30a0c52015-09-16 15:56:43 -0400297 }
Dejan Mircevski50babb22015-09-29 10:56:32 -0400298 // clang-format off
David Netoddda85a2015-10-02 17:10:10 -0400299 CASE0(Unknown),
300 CASE(Rgba32f, Shader),
301 CASE(Rgba16f, Shader),
302 CASE(R32f, Shader),
303 CASE(Rgba8, Shader),
304 CASE(Rgba8Snorm, Shader),
305 CASE(Rg32f, AdvancedFormats),
306 CASE(Rg16f, AdvancedFormats),
307 CASE(R11fG11fB10f, AdvancedFormats),
308 CASE(R16f, AdvancedFormats),
309 CASE(Rgba16, AdvancedFormats),
310 CASE(Rgb10A2, AdvancedFormats),
311 CASE(Rg16, AdvancedFormats),
312 CASE(Rg8, AdvancedFormats),
313 CASE(R16, AdvancedFormats),
314 CASE(R8, AdvancedFormats),
315 CASE(Rgba16Snorm, AdvancedFormats),
316 CASE(Rg16Snorm, AdvancedFormats),
317 CASE(Rg8Snorm, AdvancedFormats),
318 CASE(R16Snorm, AdvancedFormats),
319 CASE(R8Snorm, AdvancedFormats),
320 CASE(Rgba32i, Shader),
321 CASE(Rgba16i, Shader),
322 CASE(Rgba8i, Shader),
323 CASE(R32i, Shader),
324 CASE(Rg32i, AdvancedFormats),
325 CASE(Rg16i, AdvancedFormats),
326 CASE(Rg8i, AdvancedFormats),
327 CASE(R16i, AdvancedFormats),
328 CASE(R8i, AdvancedFormats),
329 CASE(Rgba32ui, Shader),
330 CASE(Rgba16ui, Shader),
331 CASE(Rgba8ui, Shader),
332 CASE(R32ui, Shader),
333 CASE(Rgb10a2ui, AdvancedFormats),
334 CASE(Rg32ui, AdvancedFormats),
335 CASE(Rg16ui, AdvancedFormats),
336 CASE(Rg8ui, AdvancedFormats),
337 CASE(R16ui, AdvancedFormats),
338 CASE(R8ui, AdvancedFormats),
Dejan Mircevski50babb22015-09-29 10:56:32 -0400339// clang-format on
David Netob30a0c52015-09-16 15:56:43 -0400340#undef CASE
341};
342
David Netoddda85a2015-10-02 17:10:10 -0400343// All image channel orders depend on the Kernel capability.
David Neto9db3a532015-10-07 16:58:38 -0400344#define CASE(NAME) \
345 { \
346 #NAME, ImageChannelOrder##NAME, SPV_CAPABILITY_AS_MASK(CapabilityKernel), \
347 { \
348 SPV_OPERAND_TYPE_NONE \
349 } \
David Netoddda85a2015-10-02 17:10:10 -0400350 }
351static const spv_operand_desc_t imageChannelOrderEntries[] = {
352 CASE(R),
353 CASE(A),
354 CASE(RG),
355 CASE(RA),
356 CASE(RGB),
357 CASE(RGBA),
358 CASE(BGRA),
359 CASE(ARGB),
360 CASE(Intensity),
361 CASE(Luminance),
362 CASE(Rx),
363 CASE(RGx),
364 CASE(RGBx),
365 CASE(Depth),
366 CASE(DepthStencil),
367 CASE(sRGB),
368 CASE(sRGBx),
369 CASE(sRGBA),
370 CASE(sBGRA),
371};
372#undef CASE
373
374// All image channel data types depend on the Kernel capability.
David Neto9db3a532015-10-07 16:58:38 -0400375#define CASE(NAME) \
376 { \
377 #NAME, ImageChannelDataType##NAME, \
378 SPV_CAPABILITY_AS_MASK(CapabilityKernel), { \
379 SPV_OPERAND_TYPE_NONE \
380 } \
David Netoddda85a2015-10-02 17:10:10 -0400381 }
382static const spv_operand_desc_t imageChannelDataTypeEntries[] = {
383 CASE(SnormInt8),
384 CASE(SnormInt16),
385 CASE(UnormInt8),
386 CASE(UnormInt16),
387 CASE(UnormShort565),
388 CASE(UnormShort555),
389 CASE(UnormInt101010),
390 CASE(SignedInt8),
391 CASE(SignedInt16),
392 CASE(SignedInt32),
393 CASE(UnsignedInt8),
394 CASE(UnsignedInt16),
395 CASE(UnsignedInt32),
396 CASE(HalfFloat),
397 CASE(Float),
398 CASE(UnormInt24),
399};
400#undef CASE
401
David Netoee1b3bb2015-09-18 11:19:18 -0400402// Image operand definitions. Each enum value is a mask. When that mask
403// bit is set, the instruction should have further ID operands.
404// Some mask values depend on a capability.
405static const spv_operand_desc_t imageOperandEntries[] = {
406// Rev32 and later adds many more enums.
407#define CASE(NAME) \
David Neto9db3a532015-10-07 16:58:38 -0400408 #NAME, spv::ImageOperands##NAME##Mask, 0
David Netoee1b3bb2015-09-18 11:19:18 -0400409#define CASE_CAP(NAME, CAP) \
David Neto9db3a532015-10-07 16:58:38 -0400410 #NAME, spv::ImageOperands##NAME##Mask, CAP
David Netoee1b3bb2015-09-18 11:19:18 -0400411#define ID SPV_OPERAND_TYPE_ID
412#define NONE SPV_OPERAND_TYPE_NONE
David Neto9db3a532015-10-07 16:58:38 -0400413 {"None", spv::ImageOperandsMaskNone, 0, {NONE}},
Dejan Mircevski205408b2015-09-30 16:42:34 -0400414 {CASE_CAP(Bias, SPV_CAPABILITY_AS_MASK(CapabilityShader)), {ID, NONE}},
David Netoee1b3bb2015-09-18 11:19:18 -0400415 {CASE(Lod), {ID, NONE}},
416 {CASE(Grad), {ID, ID, NONE}},
417 {CASE(ConstOffset), {ID, NONE}},
Dejan Mircevski205408b2015-09-30 16:42:34 -0400418 {CASE_CAP(Offset, SPV_CAPABILITY_AS_MASK(CapabilityImageGatherExtended)),
419 {ID, NONE}},
David Netoee1b3bb2015-09-18 11:19:18 -0400420 {CASE(ConstOffsets), {ID, NONE}},
421 {CASE(Sample), {ID, NONE}},
Dejan Mircevski205408b2015-09-30 16:42:34 -0400422 {CASE_CAP(MinLod, SPV_CAPABILITY_AS_MASK(CapabilityMinLod)), {ID, NONE}},
David Netoee1b3bb2015-09-18 11:19:18 -0400423#undef CASE
424#undef CASE_CAP
425#undef ID
426#undef NONE
427};
428
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100429static const spv_operand_desc_t fpFastMathModeEntries[] = {
430 {"None",
431 FPFastMathModeMaskNone,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100432 0,
433 {SPV_OPERAND_TYPE_NONE}},
434 {"NotNaN",
435 FPFastMathModeNotNaNMask,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400436 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100437 {SPV_OPERAND_TYPE_NONE}},
438 {"NotInf",
439 FPFastMathModeNotInfMask,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400440 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100441 {SPV_OPERAND_TYPE_NONE}},
442 {"NSZ",
443 FPFastMathModeNSZMask,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400444 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100445 {SPV_OPERAND_TYPE_NONE}},
446 {"AllowRecip",
447 FPFastMathModeAllowRecipMask,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400448 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100449 {SPV_OPERAND_TYPE_NONE}},
450 {"Fast",
451 FPFastMathModeFastMask,
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};
455
456static const spv_operand_desc_t fpRoundingModeEntries[] = {
457 {"RTE",
458 FPRoundingModeRTE,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400459 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100460 {SPV_OPERAND_TYPE_NONE}},
461 {"RTZ",
462 FPRoundingModeRTZ,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400463 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100464 {SPV_OPERAND_TYPE_NONE}},
465 {"RTP",
466 FPRoundingModeRTP,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400467 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100468 {SPV_OPERAND_TYPE_NONE}},
469 {"RTN",
470 FPRoundingModeRTN,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400471 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100472 {SPV_OPERAND_TYPE_NONE}},
473};
474
475static const spv_operand_desc_t linkageTypeEntries[] = {
476 {"Export",
477 LinkageTypeExport,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400478 SPV_CAPABILITY_AS_MASK(CapabilityLinkage),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100479 {SPV_OPERAND_TYPE_NONE}},
480 {"Import",
481 LinkageTypeImport,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400482 SPV_CAPABILITY_AS_MASK(CapabilityLinkage),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100483 {SPV_OPERAND_TYPE_NONE}},
484};
485
486static const spv_operand_desc_t accessQualifierEntries[] = {
487 {"ReadOnly",
488 AccessQualifierReadOnly,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400489 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100490 {SPV_OPERAND_TYPE_NONE}},
491 {"WriteOnly",
492 AccessQualifierWriteOnly,
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 {"ReadWrite",
496 AccessQualifierReadWrite,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400497 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100498 {SPV_OPERAND_TYPE_NONE}},
499};
500
501static const spv_operand_desc_t functionParameterAttributeEntries[] = {
502 {"Zext",
503 FunctionParameterAttributeZext,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400504 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100505 {SPV_OPERAND_TYPE_NONE}},
506 {"Sext",
507 FunctionParameterAttributeSext,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400508 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100509 {SPV_OPERAND_TYPE_NONE}},
510 {"ByVal",
511 FunctionParameterAttributeByVal,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400512 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100513 {SPV_OPERAND_TYPE_NONE}},
514 {"Sret",
515 FunctionParameterAttributeSret,
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,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400520 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100521 {SPV_OPERAND_TYPE_NONE}},
David Neto37547b22015-09-10 13:23:11 -0400522 {"NoCapture",
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100523 FunctionParameterAttributeNoCapture,
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}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100526 {"NoWrite",
527 FunctionParameterAttributeNoWrite,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400528 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100529 {SPV_OPERAND_TYPE_NONE}},
530 {"NoReadWrite",
531 FunctionParameterAttributeNoReadWrite,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400532 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100533 {SPV_OPERAND_TYPE_NONE}},
534};
535
536static const spv_operand_desc_t decorationEntries[] = {
Lei Zhang604e5ce2015-08-14 14:46:43 -0400537 {"RelaxedPrecision",
538 DecorationRelaxedPrecision,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400539 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100540 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400541 {
Dejan Mircevski50babb22015-09-29 10:56:32 -0400542 "SpecId",
543 DecorationSpecId,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400544 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Dejan Mircevski50babb22015-09-29 10:56:32 -0400545 {SPV_OPERAND_TYPE_LITERAL_NUMBER},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400546 },
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100547 {"Block",
548 DecorationBlock,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400549 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100550 {SPV_OPERAND_TYPE_NONE}},
551 {"BufferBlock",
552 DecorationBufferBlock,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400553 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100554 {SPV_OPERAND_TYPE_NONE}},
555 {"RowMajor",
556 DecorationRowMajor,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400557 SPV_CAPABILITY_AS_MASK(CapabilityMatrix),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100558 {SPV_OPERAND_TYPE_NONE}},
559 {"ColMajor",
560 DecorationColMajor,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400561 SPV_CAPABILITY_AS_MASK(CapabilityMatrix),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100562 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400563 {"ArrayStride",
564 DecorationArrayStride,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400565 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Lei Zhang604e5ce2015-08-14 14:46:43 -0400566 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
567 {"MatrixStride",
568 DecorationMatrixStride,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400569 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Lei Zhang604e5ce2015-08-14 14:46:43 -0400570 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100571 {"GLSLShared",
572 DecorationGLSLShared,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400573 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100574 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100575 {"GLSLPacked",
576 DecorationGLSLPacked,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400577 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100578 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400579 {"CPacked",
580 DecorationCPacked,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400581 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Lei Zhang604e5ce2015-08-14 14:46:43 -0400582 {SPV_OPERAND_TYPE_NONE}},
583 {"BuiltIn",
584 DecorationBuiltIn,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400585 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Lei Zhang604e5ce2015-08-14 14:46:43 -0400586 {SPV_OPERAND_TYPE_BUILT_IN, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100587 {"Smooth",
588 DecorationSmooth,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400589 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100590 {SPV_OPERAND_TYPE_NONE}},
David Netodbaf4072015-09-22 16:23:06 -0400591 {"NoPerspective",
592 DecorationNoPerspective,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400593 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100594 {SPV_OPERAND_TYPE_NONE}},
595 {"Flat",
596 DecorationFlat,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400597 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100598 {SPV_OPERAND_TYPE_NONE}},
599 {"Patch",
600 DecorationPatch,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400601 SPV_CAPABILITY_AS_MASK(CapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100602 {SPV_OPERAND_TYPE_NONE}},
603 {"Centroid",
604 DecorationCentroid,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400605 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100606 {SPV_OPERAND_TYPE_NONE}},
607 {"Sample",
608 DecorationSample,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400609 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100610 {SPV_OPERAND_TYPE_NONE}},
611 {"Invariant",
612 DecorationInvariant,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400613 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100614 {SPV_OPERAND_TYPE_NONE}},
615 {"Restrict",
616 DecorationRestrict,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100617 0,
618 {SPV_OPERAND_TYPE_NONE}},
619 {"Aliased",
620 DecorationAliased,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100621 0,
622 {SPV_OPERAND_TYPE_NONE}},
623 {"Volatile",
624 DecorationVolatile,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100625 0,
626 {SPV_OPERAND_TYPE_NONE}},
627 {"Constant",
628 DecorationConstant,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400629 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100630 {SPV_OPERAND_TYPE_NONE}},
631 {"Coherent",
632 DecorationCoherent,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100633 0,
634 {SPV_OPERAND_TYPE_NONE}},
David Netodbaf4072015-09-22 16:23:06 -0400635 {"NonWritable",
636 DecorationNonWritable,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100637 0,
638 {SPV_OPERAND_TYPE_NONE}},
David Netodbaf4072015-09-22 16:23:06 -0400639 {"NonReadable",
640 DecorationNonReadable,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100641 0,
642 {SPV_OPERAND_TYPE_NONE}},
643 {"Uniform",
644 DecorationUniform,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400645 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100646 {SPV_OPERAND_TYPE_NONE}},
David Neto37547b22015-09-10 13:23:11 -0400647 {"SaturatedConversion",
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100648 DecorationSaturatedConversion,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400649 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100650 {SPV_OPERAND_TYPE_NONE}},
651 {"Stream",
652 DecorationStream,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400653 SPV_CAPABILITY_AS_MASK(CapabilityGeometry),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100654 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
655 {"Location",
656 DecorationLocation,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400657 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100658 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
659 {"Component",
660 DecorationComponent,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400661 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100662 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
663 {"Index",
664 DecorationIndex,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400665 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100666 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
667 {"Binding",
668 DecorationBinding,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400669 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100670 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
671 {"DescriptorSet",
672 DecorationDescriptorSet,
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_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
675 {"Offset",
676 DecorationOffset,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100677 0,
678 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100679 {"XfbBuffer",
680 DecorationXfbBuffer,
David Netoddda85a2015-10-02 17:10:10 -0400681 SPV_CAPABILITY_AS_MASK(CapabilityTransformFeedback),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100682 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400683 {"XfbStride",
684 DecorationXfbStride,
David Netoddda85a2015-10-02 17:10:10 -0400685 SPV_CAPABILITY_AS_MASK(CapabilityTransformFeedback),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100686 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100687 {"FuncParamAttr",
688 DecorationFuncParamAttr,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400689 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100690 {SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE, SPV_OPERAND_TYPE_NONE}},
691 {"FPRoundingMode",
692 DecorationFPRoundingMode,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400693 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100694 {SPV_OPERAND_TYPE_FP_ROUNDING_MODE, SPV_OPERAND_TYPE_NONE}},
695 {"FPFastMathMode",
David Neto37547b22015-09-10 13:23:11 -0400696 DecorationFPFastMathMode,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400697 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100698 {SPV_OPERAND_TYPE_FP_FAST_MATH_MODE, SPV_OPERAND_TYPE_NONE}},
699 {"LinkageAttributes",
700 DecorationLinkageAttributes,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400701 SPV_CAPABILITY_AS_MASK(CapabilityLinkage),
Dejan Mircevski50babb22015-09-29 10:56:32 -0400702 {SPV_OPERAND_TYPE_LITERAL_STRING, SPV_OPERAND_TYPE_LINKAGE_TYPE,
703 SPV_OPERAND_TYPE_NONE}},
David Netod7687982015-09-23 14:59:27 -0400704 {"NoContraction",
705 DecorationNoContraction,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400706 SPV_CAPABILITY_AS_MASK(CapabilityShader),
David Netod7687982015-09-23 14:59:27 -0400707 {SPV_OPERAND_TYPE_NONE}},
708 {"InputTargetIndex",
709 DecorationInputTargetIndex,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400710 SPV_CAPABILITY_AS_MASK(CapabilityShader), // TODO(dneto): Should this be
711 // CapabilityInputTarget?
Dejan Mircevski50babb22015-09-29 10:56:32 -0400712 {SPV_OPERAND_TYPE_NONE}}, // TODO(dneto): Should this have a literal
713 // number argument?
David Netod7687982015-09-23 14:59:27 -0400714 {"Alignment",
715 DecorationAlignment,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400716 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
David Netod7687982015-09-23 14:59:27 -0400717 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100718};
719
720static const spv_operand_desc_t builtInEntries[] = {
721 {"Position",
722 BuiltInPosition,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400723 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100724 {SPV_OPERAND_TYPE_NONE}},
725 {"PointSize",
726 BuiltInPointSize,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400727 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100728 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100729 {"ClipDistance",
730 BuiltInClipDistance,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400731 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100732 {SPV_OPERAND_TYPE_NONE}},
733 {"CullDistance",
734 BuiltInCullDistance,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400735 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100736 {SPV_OPERAND_TYPE_NONE}},
737 {"VertexId",
738 BuiltInVertexId,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400739 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100740 {SPV_OPERAND_TYPE_NONE}},
741 {"InstanceId",
742 BuiltInInstanceId,
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}},
745 {"PrimitiveId",
746 BuiltInPrimitiveId,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400747 SPV_CAPABILITY_AS_MASK(CapabilityGeometry) |
748 SPV_CAPABILITY_AS_MASK(CapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100749 {SPV_OPERAND_TYPE_NONE}},
750 {"InvocationId",
751 BuiltInInvocationId,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400752 SPV_CAPABILITY_AS_MASK(CapabilityGeometry) |
753 SPV_CAPABILITY_AS_MASK(CapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100754 {SPV_OPERAND_TYPE_NONE}},
755 {"Layer",
756 BuiltInLayer,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400757 SPV_CAPABILITY_AS_MASK(CapabilityGeometry),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100758 {SPV_OPERAND_TYPE_NONE}},
759 {"ViewportIndex",
760 BuiltInViewportIndex,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400761 SPV_CAPABILITY_AS_MASK(CapabilityGeometry),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100762 {SPV_OPERAND_TYPE_NONE}},
763 {"TessLevelOuter",
764 BuiltInTessLevelOuter,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400765 SPV_CAPABILITY_AS_MASK(CapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100766 {SPV_OPERAND_TYPE_NONE}},
767 {"TessLevelInner",
768 BuiltInTessLevelInner,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400769 SPV_CAPABILITY_AS_MASK(CapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100770 {SPV_OPERAND_TYPE_NONE}},
771 {"TessCoord",
772 BuiltInTessCoord,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400773 SPV_CAPABILITY_AS_MASK(CapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100774 {SPV_OPERAND_TYPE_NONE}},
775 {"PatchVertices",
776 BuiltInPatchVertices,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400777 SPV_CAPABILITY_AS_MASK(CapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100778 {SPV_OPERAND_TYPE_NONE}},
779 {"FragCoord",
780 BuiltInFragCoord,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400781 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100782 {SPV_OPERAND_TYPE_NONE}},
783 {"PointCoord",
784 BuiltInPointCoord,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400785 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100786 {SPV_OPERAND_TYPE_NONE}},
787 {"FrontFacing",
788 BuiltInFrontFacing,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400789 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100790 {SPV_OPERAND_TYPE_NONE}},
791 {"SampleId",
792 BuiltInSampleId,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400793 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100794 {SPV_OPERAND_TYPE_NONE}},
795 {"SamplePosition",
796 BuiltInSamplePosition,
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 {"SampleMask",
800 BuiltInSampleMask,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400801 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100802 {SPV_OPERAND_TYPE_NONE}},
803 {"FragColor",
804 BuiltInFragColor,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400805 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100806 {SPV_OPERAND_TYPE_NONE}},
807 {"FragDepth",
808 BuiltInFragDepth,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400809 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100810 {SPV_OPERAND_TYPE_NONE}},
811 {"HelperInvocation",
812 BuiltInHelperInvocation,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400813 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100814 {SPV_OPERAND_TYPE_NONE}},
815 {"NumWorkgroups",
816 BuiltInNumWorkgroups,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100817 0,
818 {SPV_OPERAND_TYPE_NONE}},
819 {"WorkgroupSize",
820 BuiltInWorkgroupSize,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100821 0,
822 {SPV_OPERAND_TYPE_NONE}},
823 {"WorkgroupId",
824 BuiltInWorkgroupId,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100825 0,
826 {SPV_OPERAND_TYPE_NONE}},
827 {"LocalInvocationId",
828 BuiltInLocalInvocationId,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100829 0,
830 {SPV_OPERAND_TYPE_NONE}},
831 {"GlobalInvocationId",
832 BuiltInGlobalInvocationId,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100833 0,
834 {SPV_OPERAND_TYPE_NONE}},
835 {"LocalInvocationIndex",
David Neto37547b22015-09-10 13:23:11 -0400836 BuiltInLocalInvocationIndex,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400837 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100838 {SPV_OPERAND_TYPE_NONE}},
839 {"WorkDim",
840 BuiltInWorkDim,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400841 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100842 {SPV_OPERAND_TYPE_NONE}},
843 {"GlobalSize",
844 BuiltInGlobalSize,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400845 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100846 {SPV_OPERAND_TYPE_NONE}},
847 {"EnqueuedWorkgroupSize",
848 BuiltInEnqueuedWorkgroupSize,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400849 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100850 {SPV_OPERAND_TYPE_NONE}},
851 {"GlobalOffset",
852 BuiltInGlobalOffset,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400853 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100854 {SPV_OPERAND_TYPE_NONE}},
855 {"GlobalLinearId",
856 BuiltInGlobalLinearId,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400857 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100858 {SPV_OPERAND_TYPE_NONE}},
859 {"WorkgroupLinearId",
860 BuiltInWorkgroupLinearId,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400861 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100862 {SPV_OPERAND_TYPE_NONE}},
863 {"SubgroupSize",
864 BuiltInSubgroupSize,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400865 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100866 {SPV_OPERAND_TYPE_NONE}},
867 {"SubgroupMaxSize",
868 BuiltInSubgroupMaxSize,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400869 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100870 {SPV_OPERAND_TYPE_NONE}},
871 {"NumSubgroups",
872 BuiltInNumSubgroups,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400873 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100874 {SPV_OPERAND_TYPE_NONE}},
875 {"NumEnqueuedSubgroups",
876 BuiltInNumEnqueuedSubgroups,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400877 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100878 {SPV_OPERAND_TYPE_NONE}},
879 {"SubgroupId",
David Neto37547b22015-09-10 13:23:11 -0400880 BuiltInSubgroupId,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400881 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100882 {SPV_OPERAND_TYPE_NONE}},
883 {"SubgroupLocalInvocationId",
884 BuiltInSubgroupLocalInvocationId,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400885 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100886 {SPV_OPERAND_TYPE_NONE}},
David Neto2d1b5e52015-09-23 15:35:27 -0400887 {"VertexIndex",
888 BuiltInVertexIndex,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400889 SPV_CAPABILITY_AS_MASK(CapabilityShader),
David Neto2d1b5e52015-09-23 15:35:27 -0400890 {SPV_OPERAND_TYPE_NONE}},
891 {"InstanceIndex",
892 BuiltInInstanceIndex,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400893 SPV_CAPABILITY_AS_MASK(CapabilityShader),
David Neto2d1b5e52015-09-23 15:35:27 -0400894 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100895};
896
897static const spv_operand_desc_t selectionControlEntries[] = {
898 {"None",
899 SelectionControlMaskNone,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100900 0,
901 {SPV_OPERAND_TYPE_NONE}},
902 {"Flatten",
903 SelectionControlFlattenMask,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100904 0,
905 {SPV_OPERAND_TYPE_NONE}},
906 {"DontFlatten",
907 SelectionControlDontFlattenMask,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100908 0,
909 {SPV_OPERAND_TYPE_NONE}},
910};
911
912static const spv_operand_desc_t loopControlEntries[] = {
913 {"None",
914 LoopControlMaskNone,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100915 0,
916 {SPV_OPERAND_TYPE_NONE}},
917 {"Unroll",
918 LoopControlUnrollMask,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100919 0,
920 {SPV_OPERAND_TYPE_NONE}},
921 {"DontUnroll",
922 LoopControlDontUnrollMask,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100923 0,
924 {SPV_OPERAND_TYPE_NONE}},
925};
926
927static const spv_operand_desc_t functionControlEntries[] = {
928 {"None",
929 FunctionControlMaskNone,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100930 0,
931 {SPV_OPERAND_TYPE_NONE}},
David Netof4fde6c2015-09-14 14:50:37 -0400932 {"Inline",
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100933 FunctionControlInlineMask,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100934 0,
935 {SPV_OPERAND_TYPE_NONE}},
936 {"DontInline",
937 FunctionControlDontInlineMask,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100938 0,
939 {SPV_OPERAND_TYPE_NONE}},
940 {"Pure",
941 FunctionControlPureMask,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100942 0,
943 {SPV_OPERAND_TYPE_NONE}},
944 {"Const",
945 FunctionControlConstMask,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100946 0,
947 {SPV_OPERAND_TYPE_NONE}},
948};
949
950static const spv_operand_desc_t memorySemanticsEntries[] = {
David Netobfa3d862015-09-25 10:30:27 -0400951 // "Relaxed" should be a synonym for "None".
952 // Put the Relaxed entry first so that the disassembler
953 // will prefer to emit "Relaxed".
954 {"Relaxed",
955 MemorySemanticsMaskNone,
David Netobfa3d862015-09-25 10:30:27 -0400956 0,
957 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100958 {"None",
959 MemorySemanticsMaskNone,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100960 0,
961 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100962 {"SequentiallyConsistent",
963 MemorySemanticsSequentiallyConsistentMask,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100964 0,
965 {SPV_OPERAND_TYPE_NONE}},
966 {"Acquire",
967 MemorySemanticsAcquireMask,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100968 0,
969 {SPV_OPERAND_TYPE_NONE}},
970 {"Release",
971 MemorySemanticsReleaseMask,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100972 0,
973 {SPV_OPERAND_TYPE_NONE}},
974 {"UniformMemory",
975 MemorySemanticsUniformMemoryMask,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400976 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100977 {SPV_OPERAND_TYPE_NONE}},
978 {"SubgroupMemory",
979 MemorySemanticsSubgroupMemoryMask,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100980 0,
981 {SPV_OPERAND_TYPE_NONE}},
982 {"WorkgroupLocalMemory",
983 MemorySemanticsWorkgroupLocalMemoryMask,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100984 0,
985 {SPV_OPERAND_TYPE_NONE}},
986 {"WorkgroupGlobalMemory",
987 MemorySemanticsWorkgroupGlobalMemoryMask,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100988 0,
989 {SPV_OPERAND_TYPE_NONE}},
990 {"AtomicCounterMemory",
991 MemorySemanticsAtomicCounterMemoryMask,
Dejan Mircevski205408b2015-09-30 16:42:34 -0400992 SPV_CAPABILITY_AS_MASK(CapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100993 {SPV_OPERAND_TYPE_NONE}},
994 {
Dejan Mircevski50babb22015-09-29 10:56:32 -0400995 "ImageMemory",
996 MemorySemanticsImageMemoryMask,
Dejan Mircevski50babb22015-09-29 10:56:32 -0400997 0,
998 {SPV_OPERAND_TYPE_NONE},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100999 },
1000};
1001
1002static const spv_operand_desc_t memoryAccessEntries[] = {
1003 {"None",
1004 MemoryAccessMaskNone,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001005 0,
1006 {SPV_OPERAND_TYPE_NONE}},
1007 {"Volatile",
1008 MemoryAccessVolatileMask,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001009 0,
1010 {SPV_OPERAND_TYPE_NONE}},
1011 {
Dejan Mircevski50babb22015-09-29 10:56:32 -04001012 "Aligned",
1013 MemoryAccessAlignedMask,
Dejan Mircevski50babb22015-09-29 10:56:32 -04001014 0,
1015 {SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_NONE},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001016 },
David Neto49c299b2015-09-23 15:38:59 -04001017 {"Nontemporal",
1018 MemoryAccessNontemporalMask,
David Neto49c299b2015-09-23 15:38:59 -04001019 0,
1020 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001021};
1022
1023static const spv_operand_desc_t scopeEntries[] = {
1024 {"CrossDevice",
1025 ScopeCrossDevice,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001026 0,
1027 {SPV_OPERAND_TYPE_NONE}},
David Neto9db3a532015-10-07 16:58:38 -04001028 {"Device", ScopeDevice, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001029 {"Workgroup",
1030 ScopeWorkgroup,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001031 0,
1032 {SPV_OPERAND_TYPE_NONE}},
1033 {"Subgroup",
1034 ScopeSubgroup,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001035 0,
1036 {SPV_OPERAND_TYPE_NONE}},
1037 {
Dejan Mircevski50babb22015-09-29 10:56:32 -04001038 "Invocation",
1039 ScopeInvocation,
Dejan Mircevski50babb22015-09-29 10:56:32 -04001040 0,
1041 {SPV_OPERAND_TYPE_NONE},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001042 },
1043};
1044
1045static const spv_operand_desc_t groupOperationEntries[] = {
1046 {"Reduce",
1047 GroupOperationReduce,
Dejan Mircevski205408b2015-09-30 16:42:34 -04001048 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001049 {SPV_OPERAND_TYPE_NONE}},
1050 {"InclusiveScan",
1051 GroupOperationInclusiveScan,
Dejan Mircevski205408b2015-09-30 16:42:34 -04001052 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001053 {SPV_OPERAND_TYPE_NONE}},
1054 {"ExclusiveScan",
1055 GroupOperationExclusiveScan,
Dejan Mircevski205408b2015-09-30 16:42:34 -04001056 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001057 {SPV_OPERAND_TYPE_NONE}},
1058};
1059
1060static const spv_operand_desc_t kernelKernelEnqueueFlagssEntries[] = {
1061 {"NoWait",
1062 KernelEnqueueFlagsNoWait,
Dejan Mircevski205408b2015-09-30 16:42:34 -04001063 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001064 {SPV_OPERAND_TYPE_NONE}},
1065 {"WaitKernel",
1066 KernelEnqueueFlagsWaitKernel,
Dejan Mircevski205408b2015-09-30 16:42:34 -04001067 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001068 {SPV_OPERAND_TYPE_NONE}},
1069 {"WaitWorkGroup",
1070 KernelEnqueueFlagsWaitWorkGroup,
Dejan Mircevski205408b2015-09-30 16:42:34 -04001071 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001072 {SPV_OPERAND_TYPE_NONE}},
1073};
1074
1075static const spv_operand_desc_t kernelProfilingInfoEntries[] = {
1076 {"None",
1077 KernelProfilingInfoMaskNone,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001078 0,
1079 {SPV_OPERAND_TYPE_NONE}},
1080 {"CmdExecTime",
1081 KernelProfilingInfoCmdExecTimeMask,
Dejan Mircevski205408b2015-09-30 16:42:34 -04001082 SPV_CAPABILITY_AS_MASK(CapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001083 {SPV_OPERAND_TYPE_NONE}},
1084};
1085
David Netod30b2332015-09-23 16:04:24 -04001086// A macro for defining a capability that doesn't depend on another capability.
David Neto9db3a532015-10-07 16:58:38 -04001087#define CASE(NAME) \
1088 { \
1089 #NAME, Capability##NAME, 0, { SPV_OPERAND_TYPE_NONE } \
David Netod30b2332015-09-23 16:04:24 -04001090 }
1091
1092// A macro for defining a capability that depends on another.
David Neto9db3a532015-10-07 16:58:38 -04001093#define CASE_CAP(NAME, CAP) \
1094 { \
1095 #NAME, Capability##NAME, SPV_CAPABILITY_AS_MASK(Capability##CAP), { \
1096 SPV_OPERAND_TYPE_NONE \
1097 } \
David Netod30b2332015-09-23 16:04:24 -04001098 }
1099
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001100static const spv_operand_desc_t capabilityInfoEntries[] = {
David Netod30b2332015-09-23 16:04:24 -04001101 CASE(Matrix),
1102 CASE_CAP(Shader, Matrix),
1103 CASE_CAP(Geometry, Shader),
1104 CASE_CAP(Tessellation, Shader),
1105 CASE(Addresses),
1106 CASE(Linkage),
1107 CASE(Kernel),
1108 CASE_CAP(Vector16, Kernel),
1109 CASE_CAP(Float16Buffer, Kernel),
1110 CASE_CAP(Float16, Float16Buffer),
1111 CASE(Float64),
1112 CASE(Int64),
1113 CASE_CAP(Int64Atomics, Int64),
1114 CASE_CAP(ImageBasic, Kernel),
1115 CASE_CAP(ImageReadWrite, Kernel),
1116 CASE_CAP(ImageMipmap, Kernel),
1117 CASE_CAP(ImageSRGBWrite, Kernel),
1118 CASE_CAP(Pipes, Kernel),
1119 CASE(Groups),
1120 CASE_CAP(DeviceEnqueue, Kernel),
1121 CASE_CAP(LiteralSampler, Kernel),
1122 CASE_CAP(AtomicStorage, Shader),
1123 CASE(Int16),
1124 CASE_CAP(TessellationPointSize, Tessellation),
1125 CASE_CAP(GeometryPointSize, Geometry),
1126 CASE_CAP(ImageGatherExtended, Shader),
1127 CASE_CAP(StorageImageExtendedFormats, Shader),
1128 CASE_CAP(StorageImageMultisample, Shader),
1129 CASE_CAP(UniformBufferArrayDynamicIndexing, Shader),
1130 CASE_CAP(SampledImageArrayDynamicIndexing, Shader),
1131 CASE_CAP(StorageBufferArrayDynamicIndexing, Shader),
1132 CASE_CAP(StorageImageArrayDynamicIndexing, Shader),
1133 CASE_CAP(ClipDistance, Shader),
1134 CASE_CAP(CullDistance, Shader),
1135 CASE_CAP(ImageCubeArray, SampledCubeArray),
1136 CASE_CAP(SampleRateShading, Shader),
1137 CASE_CAP(ImageRect, SampledRect),
1138 CASE_CAP(SampledRect, Shader),
1139 CASE_CAP(GenericPointer, Addresses),
1140 CASE_CAP(Int8, Kernel),
1141 CASE_CAP(InputTarget, Shader),
1142 CASE_CAP(SparseResidency, Shader),
1143 CASE_CAP(MinLod, Shader),
1144 CASE_CAP(Sampled1D, Shader),
1145 CASE_CAP(Image1D, Sampled1D),
1146 CASE_CAP(SampledCubeArray, Shader),
1147 CASE_CAP(SampledBuffer, Shader),
1148 CASE_CAP(ImageBuffer, SampledBuffer),
1149 CASE_CAP(ImageMSArray, Shader),
1150 CASE_CAP(AdvancedFormats, Shader),
1151 CASE_CAP(ImageQuery, Shader),
1152 CASE_CAP(DerivativeControl, Shader),
1153 CASE_CAP(InterpolationFunction, Shader),
1154 CASE_CAP(TransformFeedback, Shader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001155};
David Netod30b2332015-09-23 16:04:24 -04001156#undef CASE
1157#undef CASE_CAP
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001158
1159static const spv_operand_desc_group_t opcodeEntryTypes[] = {
1160 {SPV_OPERAND_TYPE_SOURCE_LANGUAGE,
1161 sizeof(sourceLanguageEntries) / sizeof(spv_operand_desc_t),
1162 sourceLanguageEntries},
1163 {SPV_OPERAND_TYPE_EXECUTION_MODEL,
1164 sizeof(executionModelEntries) / sizeof(spv_operand_desc_t),
1165 executionModelEntries},
1166 {SPV_OPERAND_TYPE_ADDRESSING_MODEL,
1167 sizeof(addressingModelEntries) / sizeof(spv_operand_desc_t),
1168 addressingModelEntries},
1169 {SPV_OPERAND_TYPE_MEMORY_MODEL,
1170 sizeof(memoryModelEntries) / sizeof(spv_operand_desc_t),
1171 memoryModelEntries},
1172 {SPV_OPERAND_TYPE_EXECUTION_MODE,
1173 sizeof(executionModeEntries) / sizeof(spv_operand_desc_t),
1174 executionModeEntries},
1175 {SPV_OPERAND_TYPE_STORAGE_CLASS,
1176 sizeof(storageClassEntries) / sizeof(spv_operand_desc_t),
1177 storageClassEntries},
1178 {SPV_OPERAND_TYPE_DIMENSIONALITY,
1179 sizeof(dimensionalityEntries) / sizeof(spv_operand_desc_t),
1180 dimensionalityEntries},
1181 {SPV_OPERAND_TYPE_SAMPLER_ADDRESSING_MODE,
1182 sizeof(samplerAddressingModeEntries) / sizeof(spv_operand_desc_t),
1183 samplerAddressingModeEntries},
1184 {SPV_OPERAND_TYPE_SAMPLER_FILTER_MODE,
1185 sizeof(samplerFilterModeEntries) / sizeof(spv_operand_desc_t),
1186 samplerFilterModeEntries},
David Netob30a0c52015-09-16 15:56:43 -04001187 {SPV_OPERAND_TYPE_SAMPLER_IMAGE_FORMAT,
1188 sizeof(samplerImageFormatEntries) / sizeof(spv_operand_desc_t),
1189 samplerImageFormatEntries},
David Netoddda85a2015-10-02 17:10:10 -04001190 {SPV_OPERAND_TYPE_IMAGE_CHANNEL_ORDER,
1191 sizeof(imageChannelOrderEntries) / sizeof(spv_operand_desc_t),
1192 imageChannelOrderEntries},
1193 {SPV_OPERAND_TYPE_IMAGE_CHANNEL_DATA_TYPE,
1194 sizeof(imageChannelDataTypeEntries) / sizeof(spv_operand_desc_t),
1195 imageChannelDataTypeEntries},
David Netoee1b3bb2015-09-18 11:19:18 -04001196 {SPV_OPERAND_TYPE_OPTIONAL_IMAGE,
1197 sizeof(imageOperandEntries) / sizeof(spv_operand_desc_t),
1198 imageOperandEntries},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001199 {SPV_OPERAND_TYPE_FP_FAST_MATH_MODE,
1200 sizeof(fpFastMathModeEntries) / sizeof(spv_operand_desc_t),
1201 fpFastMathModeEntries},
1202 {SPV_OPERAND_TYPE_FP_ROUNDING_MODE,
1203 sizeof(fpRoundingModeEntries) / sizeof(spv_operand_desc_t),
1204 fpRoundingModeEntries},
1205 {SPV_OPERAND_TYPE_LINKAGE_TYPE,
1206 sizeof(linkageTypeEntries) / sizeof(spv_operand_desc_t),
1207 linkageTypeEntries},
1208 {SPV_OPERAND_TYPE_ACCESS_QUALIFIER,
1209 sizeof(accessQualifierEntries) / sizeof(spv_operand_desc_t),
1210 accessQualifierEntries},
1211 {SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE,
1212 sizeof(functionParameterAttributeEntries) / sizeof(spv_operand_desc_t),
1213 functionParameterAttributeEntries},
1214 {SPV_OPERAND_TYPE_DECORATION,
1215 sizeof(decorationEntries) / sizeof(spv_operand_desc_t), decorationEntries},
1216 {SPV_OPERAND_TYPE_BUILT_IN,
1217 sizeof(builtInEntries) / sizeof(spv_operand_desc_t), builtInEntries},
1218 {SPV_OPERAND_TYPE_SELECTION_CONTROL,
1219 sizeof(selectionControlEntries) / sizeof(spv_operand_desc_t),
1220 selectionControlEntries},
1221 {SPV_OPERAND_TYPE_LOOP_CONTROL,
1222 sizeof(loopControlEntries) / sizeof(spv_operand_desc_t),
1223 loopControlEntries},
1224 {SPV_OPERAND_TYPE_FUNCTION_CONTROL,
1225 sizeof(functionControlEntries) / sizeof(spv_operand_desc_t),
1226 functionControlEntries},
1227 {SPV_OPERAND_TYPE_MEMORY_SEMANTICS,
1228 sizeof(memorySemanticsEntries) / sizeof(spv_operand_desc_t),
1229 memorySemanticsEntries},
David Neto78c3b432015-08-27 13:03:52 -04001230 {SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001231 sizeof(memoryAccessEntries) / sizeof(spv_operand_desc_t),
1232 memoryAccessEntries},
1233 {SPV_OPERAND_TYPE_EXECUTION_SCOPE,
1234 sizeof(scopeEntries) / sizeof(spv_operand_desc_t), scopeEntries},
1235 {SPV_OPERAND_TYPE_GROUP_OPERATION,
1236 sizeof(groupOperationEntries) / sizeof(spv_operand_desc_t),
1237 groupOperationEntries},
1238 {SPV_OPERAND_TYPE_KERNEL_ENQ_FLAGS,
1239 sizeof(kernelKernelEnqueueFlagssEntries) / sizeof(spv_operand_desc_t),
1240 kernelKernelEnqueueFlagssEntries},
David Neto47994822015-08-27 13:11:01 -04001241 {SPV_OPERAND_TYPE_KERNEL_PROFILING_INFO,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001242 sizeof(kernelProfilingInfoEntries) / sizeof(spv_operand_desc_t),
1243 kernelProfilingInfoEntries},
1244 {SPV_OPERAND_TYPE_CAPABILITY,
1245 sizeof(capabilityInfoEntries) / sizeof(spv_operand_desc_t),
1246 capabilityInfoEntries},
1247};
1248
Dejan Mircevski50babb22015-09-29 10:56:32 -04001249spv_result_t spvOperandTableGet(spv_operand_table* pOperandTable) {
Lei Zhang40056702015-09-11 14:31:27 -04001250 if (!pOperandTable) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001251
1252 static const spv_operand_table_t table = {
1253 sizeof(opcodeEntryTypes) / sizeof(spv_operand_desc_group_t),
1254 opcodeEntryTypes};
1255
1256 *pOperandTable = &table;
1257
1258 return SPV_SUCCESS;
1259}
1260
1261spv_result_t spvOperandTableNameLookup(const spv_operand_table table,
1262 const spv_operand_type_t type,
David Neto388c40d2015-09-16 16:42:56 -04001263 const char* name,
1264 const size_t nameLength,
1265 spv_operand_desc* pEntry) {
Lei Zhang40056702015-09-11 14:31:27 -04001266 if (!table) return SPV_ERROR_INVALID_TABLE;
1267 if (!name || !pEntry) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001268
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001269 for (uint64_t typeIndex = 0; typeIndex < table->count; ++typeIndex) {
1270 if (type == table->types[typeIndex].type) {
1271 for (uint64_t operandIndex = 0;
1272 operandIndex < table->types[typeIndex].count; ++operandIndex) {
1273 if (nameLength ==
1274 strlen(table->types[typeIndex].entries[operandIndex].name) &&
1275 !strncmp(table->types[typeIndex].entries[operandIndex].name, name,
David Neto388c40d2015-09-16 16:42:56 -04001276 nameLength)) {
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001277 *pEntry = &table->types[typeIndex].entries[operandIndex];
1278 return SPV_SUCCESS;
1279 }
1280 }
1281 }
1282 }
1283
1284 return SPV_ERROR_INVALID_LOOKUP;
1285}
1286
1287spv_result_t spvOperandTableValueLookup(const spv_operand_table table,
1288 const spv_operand_type_t type,
1289 const uint32_t value,
Dejan Mircevski50babb22015-09-29 10:56:32 -04001290 spv_operand_desc* pEntry) {
Lei Zhang40056702015-09-11 14:31:27 -04001291 if (!table) return SPV_ERROR_INVALID_TABLE;
1292 if (!pEntry) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001293
1294 for (uint64_t typeIndex = 0; typeIndex < table->count; ++typeIndex) {
1295 if (type == table->types[typeIndex].type) {
1296 for (uint64_t operandIndex = 0;
1297 operandIndex < table->types[typeIndex].count; ++operandIndex) {
1298 if (value == table->types[typeIndex].entries[operandIndex].value) {
1299 *pEntry = &table->types[typeIndex].entries[operandIndex];
1300 return SPV_SUCCESS;
1301 }
1302 }
1303 }
1304 }
1305
1306 return SPV_ERROR_INVALID_LOOKUP;
1307}
1308
Dejan Mircevski50babb22015-09-29 10:56:32 -04001309const char* spvOperandTypeStr(spv_operand_type_t type) {
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001310 switch (type) {
1311 case SPV_OPERAND_TYPE_ID:
David Netofadbf622015-09-14 17:07:11 -04001312 case SPV_OPERAND_TYPE_OPTIONAL_ID:
1313 case SPV_OPERAND_TYPE_ID_IN_OPTIONAL_TUPLE:
1314 return "ID";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001315 case SPV_OPERAND_TYPE_RESULT_ID:
1316 return "result ID";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001317 case SPV_OPERAND_TYPE_LITERAL_NUMBER:
1318 return "literal number";
Lei Zhangb41d1502015-09-14 15:22:23 -04001319 case SPV_OPERAND_TYPE_MULTIWORD_LITERAL_NUMBER:
1320 return "multiple word literal number";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001321 case SPV_OPERAND_TYPE_LITERAL_STRING:
1322 return "literal string";
1323 case SPV_OPERAND_TYPE_SOURCE_LANGUAGE:
Dejan Mircevskid2c81cf2015-10-09 11:06:10 -04001324 return "source language";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001325 case SPV_OPERAND_TYPE_EXECUTION_MODEL:
1326 return "execution model";
1327 case SPV_OPERAND_TYPE_ADDRESSING_MODEL:
1328 return "addressing model";
1329 case SPV_OPERAND_TYPE_MEMORY_MODEL:
1330 return "memory model";
1331 case SPV_OPERAND_TYPE_EXECUTION_MODE:
1332 return "execution mode";
1333 case SPV_OPERAND_TYPE_STORAGE_CLASS:
1334 return "storage class";
1335 case SPV_OPERAND_TYPE_DIMENSIONALITY:
1336 return "dimensionality";
1337 case SPV_OPERAND_TYPE_SAMPLER_ADDRESSING_MODE:
1338 return "addressing mode";
1339 case SPV_OPERAND_TYPE_SAMPLER_FILTER_MODE:
1340 return "sampler filter mode";
David Netob30a0c52015-09-16 15:56:43 -04001341 case SPV_OPERAND_TYPE_SAMPLER_IMAGE_FORMAT:
Dejan Mircevski971b3442015-10-13 12:54:47 -04001342 return "image format";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001343 case SPV_OPERAND_TYPE_FP_FAST_MATH_MODE:
1344 return "floating pointer fast math mode";
1345 case SPV_OPERAND_TYPE_FP_ROUNDING_MODE:
1346 return "floating point rounding mode";
1347 case SPV_OPERAND_TYPE_LINKAGE_TYPE:
1348 return "linkage type";
1349 case SPV_OPERAND_TYPE_ACCESS_QUALIFIER:
1350 return "access qualifier";
1351 case SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE:
1352 return "function parameter attribute";
1353 case SPV_OPERAND_TYPE_DECORATION:
1354 return "decoration";
1355 case SPV_OPERAND_TYPE_BUILT_IN:
1356 return "built in";
1357 case SPV_OPERAND_TYPE_SELECTION_CONTROL:
1358 return "selection control";
1359 case SPV_OPERAND_TYPE_LOOP_CONTROL:
1360 return "loop control";
1361 case SPV_OPERAND_TYPE_FUNCTION_CONTROL:
1362 return "function control";
1363 case SPV_OPERAND_TYPE_MEMORY_SEMANTICS:
1364 return "memory semantics";
David Neto78c3b432015-08-27 13:03:52 -04001365 case SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001366 return "memory access";
1367 case SPV_OPERAND_TYPE_EXECUTION_SCOPE:
David Netofadbf622015-09-14 17:07:11 -04001368 return "execution scope ID";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001369 case SPV_OPERAND_TYPE_GROUP_OPERATION:
1370 return "group operation";
1371 case SPV_OPERAND_TYPE_KERNEL_ENQ_FLAGS:
1372 return "kernel enqeue flags";
David Neto47994822015-08-27 13:11:01 -04001373 case SPV_OPERAND_TYPE_KERNEL_PROFILING_INFO:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001374 return "kernel profiling info";
1375 case SPV_OPERAND_TYPE_CAPABILITY:
1376 return "capability";
David Netoee1b3bb2015-09-18 11:19:18 -04001377 case SPV_OPERAND_TYPE_OPTIONAL_IMAGE:
1378 return "image operand";
David Neto78c3b432015-08-27 13:03:52 -04001379 case SPV_OPERAND_TYPE_NONE:
1380 return "NONE";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001381 default:
1382 assert(0 && "Unhandled operand type!");
1383 break;
1384 }
1385 return "unknown";
1386}
David Neto78c3b432015-08-27 13:03:52 -04001387
1388void spvPrependOperandTypes(const spv_operand_type_t* types,
1389 spv_operand_pattern_t* pattern) {
1390 const spv_operand_type_t* endTypes;
Dejan Mircevski50babb22015-09-29 10:56:32 -04001391 for (endTypes = types; *endTypes != SPV_OPERAND_TYPE_NONE; ++endTypes)
David Neto78c3b432015-08-27 13:03:52 -04001392 ;
1393 pattern->insert(pattern->begin(), types, endTypes);
1394}
1395
David Neto5bf88fc2015-09-17 17:06:10 -04001396void spvPrependOperandTypesForMask(const spv_operand_table operandTable,
1397 const spv_operand_type_t type,
1398 const uint32_t mask,
1399 spv_operand_pattern_t* pattern) {
1400 // Scan from highest bits to lowest bits because we will prepend in LIFO
1401 // fashion, and we need the operands for lower order bits to appear first.
1402 for (uint32_t candidate_bit = (1 << 31); candidate_bit; candidate_bit >>= 1) {
1403 if (candidate_bit & mask) {
1404 spv_operand_desc entry = nullptr;
1405 if (SPV_SUCCESS == spvOperandTableValueLookup(operandTable, type,
1406 candidate_bit, &entry)) {
1407 spvPrependOperandTypes(entry->operandTypes, pattern);
1408 }
1409 }
1410 }
1411}
1412
David Neto78c3b432015-08-27 13:03:52 -04001413bool spvOperandIsOptional(spv_operand_type_t type) {
1414 // Variable means zero or more times.
Dejan Mircevski50babb22015-09-29 10:56:32 -04001415 if (spvOperandIsVariable(type)) return true;
David Neto78c3b432015-08-27 13:03:52 -04001416
1417 switch (type) {
1418 case SPV_OPERAND_TYPE_OPTIONAL_ID:
1419 case SPV_OPERAND_TYPE_OPTIONAL_IMAGE:
David Neto561dc4e2015-09-25 14:23:29 -04001420 case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_NUMBER:
David Neto78c3b432015-08-27 13:03:52 -04001421 case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_STRING:
1422 case SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS:
1423 case SPV_OPERAND_TYPE_OPTIONAL_EXECUTION_MODE:
Dejan Mircevski903f9d62015-09-28 17:04:39 -04001424 case SPV_OPERAND_TYPE_OPTIONAL_CIV:
David Neto78c3b432015-08-27 13:03:52 -04001425 return true;
1426 default:
1427 break;
1428 }
1429 return false;
1430}
1431
1432bool spvOperandIsVariable(spv_operand_type_t type) {
1433 switch (type) {
1434 case SPV_OPERAND_TYPE_VARIABLE_ID:
David Neto561dc4e2015-09-25 14:23:29 -04001435 case SPV_OPERAND_TYPE_VARIABLE_LITERAL_NUMBER:
1436 case SPV_OPERAND_TYPE_VARIABLE_ID_LITERAL_NUMBER:
1437 case SPV_OPERAND_TYPE_VARIABLE_LITERAL_NUMBER_ID:
David Neto78c3b432015-08-27 13:03:52 -04001438 case SPV_OPERAND_TYPE_VARIABLE_EXECUTION_MODE:
1439 return true;
1440 default:
1441 break;
1442 }
1443 return false;
1444}
1445
David Neto78c3b432015-08-27 13:03:52 -04001446bool spvExpandOperandSequenceOnce(spv_operand_type_t type,
1447 spv_operand_pattern_t* pattern) {
1448 switch (type) {
1449 case SPV_OPERAND_TYPE_VARIABLE_ID:
1450 pattern->insert(pattern->begin(), {SPV_OPERAND_TYPE_OPTIONAL_ID, type});
1451 return true;
David Neto561dc4e2015-09-25 14:23:29 -04001452 case SPV_OPERAND_TYPE_VARIABLE_LITERAL_NUMBER:
David Neto78c3b432015-08-27 13:03:52 -04001453 pattern->insert(pattern->begin(),
David Neto561dc4e2015-09-25 14:23:29 -04001454 {SPV_OPERAND_TYPE_OPTIONAL_LITERAL_NUMBER, type});
David Neto78c3b432015-08-27 13:03:52 -04001455 return true;
David Neto561dc4e2015-09-25 14:23:29 -04001456 case SPV_OPERAND_TYPE_VARIABLE_LITERAL_NUMBER_ID:
1457 // Represents Zero or more (Literal number, Id) pairs.
David Neto78c3b432015-08-27 13:03:52 -04001458 pattern->insert(pattern->begin(),
David Neto561dc4e2015-09-25 14:23:29 -04001459 {SPV_OPERAND_TYPE_OPTIONAL_LITERAL_NUMBER,
David Neto78c3b432015-08-27 13:03:52 -04001460 SPV_OPERAND_TYPE_ID_IN_OPTIONAL_TUPLE, type});
1461 return true;
David Neto561dc4e2015-09-25 14:23:29 -04001462 case SPV_OPERAND_TYPE_VARIABLE_ID_LITERAL_NUMBER:
1463 // Represents Zero or more (Id, Literal number) pairs.
Dejan Mircevski50babb22015-09-29 10:56:32 -04001464 pattern->insert(
1465 pattern->begin(),
1466 {SPV_OPERAND_TYPE_OPTIONAL_ID,
1467 SPV_OPERAND_TYPE_LITERAL_NUMBER_IN_OPTIONAL_TUPLE, type});
David Neto78c3b432015-08-27 13:03:52 -04001468 return true;
David Neto78c3b432015-08-27 13:03:52 -04001469 case SPV_OPERAND_TYPE_VARIABLE_EXECUTION_MODE:
Dejan Mircevski50babb22015-09-29 10:56:32 -04001470 pattern->insert(pattern->begin(),
1471 {SPV_OPERAND_TYPE_OPTIONAL_EXECUTION_MODE, type});
David Neto78c3b432015-08-27 13:03:52 -04001472 return true;
1473 default:
1474 break;
1475 }
1476 return false;
1477}
1478
Dejan Mircevski50babb22015-09-29 10:56:32 -04001479spv_operand_type_t spvTakeFirstMatchableOperand(
1480 spv_operand_pattern_t* pattern) {
David Neto78c3b432015-08-27 13:03:52 -04001481 assert(!pattern->empty());
1482 spv_operand_type_t result;
1483 do {
1484 result = pattern->front();
1485 pattern->pop_front();
Dejan Mircevski50babb22015-09-29 10:56:32 -04001486 } while (spvExpandOperandSequenceOnce(result, pattern));
David Neto78c3b432015-08-27 13:03:52 -04001487 return result;
1488}
Dejan Mircevski903f9d62015-09-28 17:04:39 -04001489
Dejan Mircevski897bff92015-09-29 10:38:18 -04001490spv_operand_pattern_t spvAlternatePatternFollowingImmediate(
1491 const spv_operand_pattern_t& pattern) {
1492 spv_operand_pattern_t alternatePattern;
1493 for (const auto& operand : pattern) {
1494 if (operand == SPV_OPERAND_TYPE_RESULT_ID) {
1495 alternatePattern.push_back(operand);
1496 alternatePattern.push_back(SPV_OPERAND_TYPE_OPTIONAL_CIV);
1497 return alternatePattern;
Dejan Mircevski903f9d62015-09-28 17:04:39 -04001498 }
Dejan Mircevski897bff92015-09-29 10:38:18 -04001499 alternatePattern.push_back(SPV_OPERAND_TYPE_OPTIONAL_CIV);
Dejan Mircevski903f9d62015-09-28 17:04:39 -04001500 }
Dejan Mircevski897bff92015-09-29 10:38:18 -04001501 // No result-id found, so just expect CIVs.
1502 return {SPV_OPERAND_TYPE_OPTIONAL_CIV};
Dejan Mircevski903f9d62015-09-28 17:04:39 -04001503}