blob: 2479263e68e396f580b9c9f5cffefc6afcc15cab [file] [log] [blame]
Dejan Mircevskib6fe02f2016-01-07 13:44:22 -05001// Copyright (c) 2015-2016 The Khronos Group Inc.
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01002//
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[] = {
Lei Zhang1a0334e2015-11-02 09:41:20 -050033 {"Unknown", SpvSourceLanguageUnknown, 0, {SPV_OPERAND_TYPE_NONE}},
34 {"ESSL", SpvSourceLanguageESSL, 0, {SPV_OPERAND_TYPE_NONE}},
35 {"GLSL", SpvSourceLanguageGLSL, 0, {SPV_OPERAND_TYPE_NONE}},
David Netod02f68a2015-11-11 12:32:21 -050036 {"OpenCL_C", SpvSourceLanguageOpenCL_C, 0, {SPV_OPERAND_TYPE_NONE}},
37 {"OpenCL_CPP", SpvSourceLanguageOpenCL_CPP, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010038};
39
40static const spv_operand_desc_t executionModelEntries[] = {
41 {"Vertex",
Lei Zhangb36e7042015-10-28 13:40:52 -040042 SpvExecutionModelVertex,
43 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010044 {SPV_OPERAND_TYPE_NONE}},
45 {"TessellationControl",
Lei Zhangb36e7042015-10-28 13:40:52 -040046 SpvExecutionModelTessellationControl,
47 SPV_CAPABILITY_AS_MASK(SpvCapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010048 {SPV_OPERAND_TYPE_NONE}},
49 {"TessellationEvaluation",
Lei Zhangb36e7042015-10-28 13:40:52 -040050 SpvExecutionModelTessellationEvaluation,
51 SPV_CAPABILITY_AS_MASK(SpvCapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010052 {SPV_OPERAND_TYPE_NONE}},
53 {"Geometry",
Lei Zhangb36e7042015-10-28 13:40:52 -040054 SpvExecutionModelGeometry,
55 SPV_CAPABILITY_AS_MASK(SpvCapabilityGeometry),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010056 {SPV_OPERAND_TYPE_NONE}},
57 {"Fragment",
Lei Zhangb36e7042015-10-28 13:40:52 -040058 SpvExecutionModelFragment,
59 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010060 {SPV_OPERAND_TYPE_NONE}},
61 {"GLCompute",
Lei Zhangb36e7042015-10-28 13:40:52 -040062 SpvExecutionModelGLCompute,
63 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010064 {SPV_OPERAND_TYPE_NONE}},
65 {"Kernel",
Lei Zhangb36e7042015-10-28 13:40:52 -040066 SpvExecutionModelKernel,
67 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010068 {SPV_OPERAND_TYPE_NONE}},
69};
70
71static const spv_operand_desc_t addressingModelEntries[] = {
Lei Zhang1a0334e2015-11-02 09:41:20 -050072 {"Logical", SpvAddressingModelLogical, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010073 {"Physical32",
Lei Zhangb36e7042015-10-28 13:40:52 -040074 SpvAddressingModelPhysical32,
75 SPV_CAPABILITY_AS_MASK(SpvCapabilityAddresses),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010076 {SPV_OPERAND_TYPE_NONE}},
77 {"Physical64",
Lei Zhangb36e7042015-10-28 13:40:52 -040078 SpvAddressingModelPhysical64,
79 SPV_CAPABILITY_AS_MASK(SpvCapabilityAddresses),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010080 {SPV_OPERAND_TYPE_NONE}},
81};
82
83static const spv_operand_desc_t memoryModelEntries[] = {
84 {"Simple",
Lei Zhangb36e7042015-10-28 13:40:52 -040085 SpvMemoryModelSimple,
86 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010087 {SPV_OPERAND_TYPE_NONE}},
88 {"GLSL450",
Lei Zhangb36e7042015-10-28 13:40:52 -040089 SpvMemoryModelGLSL450,
90 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010091 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -040092 {"OpenCL",
Lei Zhangb36e7042015-10-28 13:40:52 -040093 SpvMemoryModelOpenCL,
94 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010095 {SPV_OPERAND_TYPE_NONE}},
96};
97
Lei Zhang85c6f792015-09-23 15:42:18 -040098// Execution mode requiring the given capability and having no operands.
Lei Zhangb36e7042015-10-28 13:40:52 -040099#define ExecMode0(mode, cap) \
100 #mode, SpvExecutionMode##mode, SPV_CAPABILITY_AS_MASK(SpvCapability##cap), { \
101 SPV_OPERAND_TYPE_NONE \
Lei Zhang85c6f792015-09-23 15:42:18 -0400102 }
103// Execution mode requiring the given capability and having one literal number
104// operand.
Lei Zhangb36e7042015-10-28 13:40:52 -0400105#define ExecMode1(mode, cap) \
106 #mode, SpvExecutionMode##mode, SPV_CAPABILITY_AS_MASK(SpvCapability##cap), { \
107 SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE \
Lei Zhang85c6f792015-09-23 15:42:18 -0400108 }
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100109static const spv_operand_desc_t executionModeEntries[] = {
Lei Zhang85c6f792015-09-23 15:42:18 -0400110 {ExecMode1(Invocations, Geometry)},
111 {ExecMode0(SpacingEqual, Tessellation)},
112 {ExecMode0(SpacingFractionalEven, Tessellation)},
113 {ExecMode0(SpacingFractionalOdd, Tessellation)},
114 {ExecMode0(VertexOrderCw, Tessellation)},
115 {ExecMode0(VertexOrderCcw, Tessellation)},
116 {ExecMode0(PixelCenterInteger, Shader)},
117 {ExecMode0(OriginUpperLeft, Shader)},
118 {ExecMode0(OriginLowerLeft, Shader)},
119 {ExecMode0(EarlyFragmentTests, Shader)},
120 {ExecMode0(PointMode, Tessellation)},
Lei Zhang863ddbe2015-09-23 17:09:01 -0400121 {ExecMode0(Xfb, TransformFeedback)},
Lei Zhang85c6f792015-09-23 15:42:18 -0400122 {ExecMode0(DepthReplacing, Shader)},
Lei Zhang85c6f792015-09-23 15:42:18 -0400123 {ExecMode0(DepthGreater, Shader)},
124 {ExecMode0(DepthLess, Shader)},
125 {ExecMode0(DepthUnchanged, Shader)},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100126 {"LocalSize",
Lei Zhangb36e7042015-10-28 13:40:52 -0400127 SpvExecutionModeLocalSize,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100128 0,
Lei Zhang6483bd72015-10-14 17:02:39 -0400129 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_LITERAL_INTEGER,
130 SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100131 {"LocalSizeHint",
Lei Zhangb36e7042015-10-28 13:40:52 -0400132 SpvExecutionModeLocalSizeHint,
133 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Lei Zhang6483bd72015-10-14 17:02:39 -0400134 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_LITERAL_INTEGER,
135 SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Lei Zhang85c6f792015-09-23 15:42:18 -0400136 {ExecMode0(InputPoints, Geometry)},
137 {ExecMode0(InputLines, Geometry)},
138 {ExecMode0(InputLinesAdjacency, Geometry)},
David Netod02f68a2015-11-11 12:32:21 -0500139 {"Triangles",
140 SpvExecutionModeTriangles,
Lei Zhangb36e7042015-10-28 13:40:52 -0400141 SPV_CAPABILITY_AS_MASK(SpvCapabilityGeometry) |
142 SPV_CAPABILITY_AS_MASK(SpvCapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100143 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang85c6f792015-09-23 15:42:18 -0400144 {ExecMode0(InputTrianglesAdjacency, Geometry)},
David Netod02f68a2015-11-11 12:32:21 -0500145 {ExecMode0(Quads, Tessellation)},
146 {ExecMode0(Isolines, Tessellation)},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100147 {"OutputVertices",
Lei Zhangb36e7042015-10-28 13:40:52 -0400148 SpvExecutionModeOutputVertices,
149 SPV_CAPABILITY_AS_MASK(SpvCapabilityGeometry) |
150 SPV_CAPABILITY_AS_MASK(SpvCapabilityTessellation),
Lei Zhang6483bd72015-10-14 17:02:39 -0400151 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Lei Zhang85c6f792015-09-23 15:42:18 -0400152 {ExecMode0(OutputPoints, Geometry)},
153 {ExecMode0(OutputLineStrip, Geometry)},
154 {ExecMode0(OutputTriangleStrip, Geometry)},
155 {ExecMode1(VecTypeHint, Kernel)},
156 {ExecMode0(ContractionOff, Kernel)},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100157};
Lei Zhang85c6f792015-09-23 15:42:18 -0400158#undef ExecMode0
159#undef ExecMode1
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100160
161static const spv_operand_desc_t storageClassEntries[] = {
Dejan Mircevski50babb22015-09-29 10:56:32 -0400162 // TODO(dneto): There are more storage classes in Rev32 and later.
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100163 {"UniformConstant",
Lei Zhangb36e7042015-10-28 13:40:52 -0400164 SpvStorageClassUniformConstant,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100165 0,
166 {SPV_OPERAND_TYPE_NONE}},
167 {"Input",
Lei Zhangb36e7042015-10-28 13:40:52 -0400168 SpvStorageClassInput,
169 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100170 {SPV_OPERAND_TYPE_NONE}},
171 {"Uniform",
Lei Zhangb36e7042015-10-28 13:40:52 -0400172 SpvStorageClassUniform,
173 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100174 {SPV_OPERAND_TYPE_NONE}},
175 {"Output",
Lei Zhangb36e7042015-10-28 13:40:52 -0400176 SpvStorageClassOutput,
177 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100178 {SPV_OPERAND_TYPE_NONE}},
David Netod9ad0502015-11-24 18:37:24 -0500179 {"Workgroup", SpvStorageClassWorkgroup, 0, {SPV_OPERAND_TYPE_NONE}},
David Netod02f68a2015-11-11 12:32:21 -0500180 {"CrossWorkgroup",
181 SpvStorageClassCrossWorkgroup,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100182 0,
183 {SPV_OPERAND_TYPE_NONE}},
David Netod02f68a2015-11-11 12:32:21 -0500184 {"Private",
185 SpvStorageClassPrivate,
Lei Zhangb36e7042015-10-28 13:40:52 -0400186 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100187 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang1a0334e2015-11-02 09:41:20 -0500188 {"Function", SpvStorageClassFunction, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100189 {"Generic",
Lei Zhangb36e7042015-10-28 13:40:52 -0400190 SpvStorageClassGeneric,
191 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100192 {SPV_OPERAND_TYPE_NONE}},
David Neto9819adf2015-09-23 10:19:57 -0400193 {"PushConstant",
Lei Zhangb36e7042015-10-28 13:40:52 -0400194 SpvStorageClassPushConstant,
195 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
David Neto9819adf2015-09-23 10:19:57 -0400196 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100197 {"AtomicCounter",
Lei Zhangb36e7042015-10-28 13:40:52 -0400198 SpvStorageClassAtomicCounter,
199 SPV_CAPABILITY_AS_MASK(SpvCapabilityAtomicStorage),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100200 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang1a0334e2015-11-02 09:41:20 -0500201 {"Image", SpvStorageClassImage, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100202};
203
204static const spv_operand_desc_t dimensionalityEntries[] = {
David Netoddda85a2015-10-02 17:10:10 -0400205 {"1D",
Lei Zhangb36e7042015-10-28 13:40:52 -0400206 SpvDim1D,
207 SPV_CAPABILITY_AS_MASK(SpvCapabilitySampled1D),
David Netoddda85a2015-10-02 17:10:10 -0400208 {SPV_OPERAND_TYPE_NONE}},
Lei Zhangb36e7042015-10-28 13:40:52 -0400209 {"2D", SpvDim2D, 0, {SPV_OPERAND_TYPE_NONE}},
210 {"3D", SpvDim3D, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100211 {"Cube",
Lei Zhangb36e7042015-10-28 13:40:52 -0400212 SpvDimCube,
213 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100214 {SPV_OPERAND_TYPE_NONE}},
215 {"Rect",
Lei Zhangb36e7042015-10-28 13:40:52 -0400216 SpvDimRect,
217 SPV_CAPABILITY_AS_MASK(SpvCapabilitySampledRect),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100218 {SPV_OPERAND_TYPE_NONE}},
David Netoddda85a2015-10-02 17:10:10 -0400219 {"Buffer",
Lei Zhangb36e7042015-10-28 13:40:52 -0400220 SpvDimBuffer,
221 SPV_CAPABILITY_AS_MASK(SpvCapabilitySampledBuffer),
David Netoddda85a2015-10-02 17:10:10 -0400222 {SPV_OPERAND_TYPE_NONE}},
David Netod02f68a2015-11-11 12:32:21 -0500223 {"SubpassData",
224 SpvDimSubpassData,
225 SPV_CAPABILITY_AS_MASK(SpvCapabilityInputAttachment),
David Netoaa0c3a52015-09-23 10:30:06 -0400226 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100227};
228
229static const spv_operand_desc_t samplerAddressingModeEntries[] = {
230 {"None",
Lei Zhangb36e7042015-10-28 13:40:52 -0400231 SpvSamplerAddressingModeNone,
232 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100233 {SPV_OPERAND_TYPE_NONE}},
234 {"ClampToEdge",
Lei Zhangb36e7042015-10-28 13:40:52 -0400235 SpvSamplerAddressingModeClampToEdge,
236 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100237 {SPV_OPERAND_TYPE_NONE}},
238 {"Clamp",
Lei Zhangb36e7042015-10-28 13:40:52 -0400239 SpvSamplerAddressingModeClamp,
240 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100241 {SPV_OPERAND_TYPE_NONE}},
242 {"Repeat",
Lei Zhangb36e7042015-10-28 13:40:52 -0400243 SpvSamplerAddressingModeRepeat,
244 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100245 {SPV_OPERAND_TYPE_NONE}},
246 {"RepeatMirrored",
Lei Zhangb36e7042015-10-28 13:40:52 -0400247 SpvSamplerAddressingModeRepeatMirrored,
248 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100249 {SPV_OPERAND_TYPE_NONE}},
250};
251
252static const spv_operand_desc_t samplerFilterModeEntries[] = {
253 {"Nearest",
Lei Zhangb36e7042015-10-28 13:40:52 -0400254 SpvSamplerFilterModeNearest,
255 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100256 {SPV_OPERAND_TYPE_NONE}},
257 {"Linear",
Lei Zhangb36e7042015-10-28 13:40:52 -0400258 SpvSamplerFilterModeLinear,
259 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100260 {SPV_OPERAND_TYPE_NONE}},
261};
262
David Netob30a0c52015-09-16 15:56:43 -0400263static const spv_operand_desc_t samplerImageFormatEntries[] = {
Lei Zhangb36e7042015-10-28 13:40:52 -0400264#define CASE0(NAME) \
265 { \
266 #NAME, SpvImageFormat##NAME, 0, { SPV_OPERAND_TYPE_NONE } \
David Netoddda85a2015-10-02 17:10:10 -0400267 }
Lei Zhangb36e7042015-10-28 13:40:52 -0400268#define CASE(NAME, CAP) \
269 { \
270 #NAME, SpvImageFormat##NAME, SPV_CAPABILITY_AS_MASK(SpvCapability##CAP), { \
271 SPV_OPERAND_TYPE_NONE \
272 } \
David Netob30a0c52015-09-16 15:56:43 -0400273 }
Dejan Mircevski50babb22015-09-29 10:56:32 -0400274 // clang-format off
David Netoddda85a2015-10-02 17:10:10 -0400275 CASE0(Unknown),
276 CASE(Rgba32f, Shader),
277 CASE(Rgba16f, Shader),
278 CASE(R32f, Shader),
279 CASE(Rgba8, Shader),
280 CASE(Rgba8Snorm, Shader),
David Netod02f68a2015-11-11 12:32:21 -0500281 CASE(Rg32f, StorageImageExtendedFormats),
282 CASE(Rg16f, StorageImageExtendedFormats),
283 CASE(R11fG11fB10f, StorageImageExtendedFormats),
284 CASE(R16f, StorageImageExtendedFormats),
285 CASE(Rgba16, StorageImageExtendedFormats),
286 CASE(Rgb10A2, StorageImageExtendedFormats),
287 CASE(Rg16, StorageImageExtendedFormats),
288 CASE(Rg8, StorageImageExtendedFormats),
289 CASE(R16, StorageImageExtendedFormats),
290 CASE(R8, StorageImageExtendedFormats),
291 CASE(Rgba16Snorm, StorageImageExtendedFormats),
292 CASE(Rg16Snorm, StorageImageExtendedFormats),
293 CASE(Rg8Snorm, StorageImageExtendedFormats),
294 CASE(R16Snorm, StorageImageExtendedFormats),
295 CASE(R8Snorm, StorageImageExtendedFormats),
David Netoddda85a2015-10-02 17:10:10 -0400296 CASE(Rgba32i, Shader),
297 CASE(Rgba16i, Shader),
298 CASE(Rgba8i, Shader),
299 CASE(R32i, Shader),
David Netod02f68a2015-11-11 12:32:21 -0500300 CASE(Rg32i, StorageImageExtendedFormats),
301 CASE(Rg16i, StorageImageExtendedFormats),
302 CASE(Rg8i, StorageImageExtendedFormats),
303 CASE(R16i, StorageImageExtendedFormats),
304 CASE(R8i, StorageImageExtendedFormats),
David Netoddda85a2015-10-02 17:10:10 -0400305 CASE(Rgba32ui, Shader),
306 CASE(Rgba16ui, Shader),
307 CASE(Rgba8ui, Shader),
308 CASE(R32ui, Shader),
David Netod02f68a2015-11-11 12:32:21 -0500309 CASE(Rgb10a2ui, StorageImageExtendedFormats),
310 CASE(Rg32ui, StorageImageExtendedFormats),
311 CASE(Rg16ui, StorageImageExtendedFormats),
312 CASE(Rg8ui, StorageImageExtendedFormats),
313 CASE(R16ui, StorageImageExtendedFormats),
314 CASE(R8ui, StorageImageExtendedFormats),
Dejan Mircevski50babb22015-09-29 10:56:32 -0400315// clang-format on
David Netob30a0c52015-09-16 15:56:43 -0400316#undef CASE
317};
318
David Netoddda85a2015-10-02 17:10:10 -0400319// All image channel orders depend on the Kernel capability.
Lei Zhang1a0334e2015-11-02 09:41:20 -0500320#define CASE(NAME) \
321 { \
322 #NAME, SpvImageChannelOrder##NAME, \
323 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel), { \
324 SPV_OPERAND_TYPE_NONE \
325 } \
David Netoddda85a2015-10-02 17:10:10 -0400326 }
327static const spv_operand_desc_t imageChannelOrderEntries[] = {
Lei Zhang1a0334e2015-11-02 09:41:20 -0500328 CASE(R), CASE(A), CASE(RG), CASE(RA), CASE(RGB),
329 CASE(RGBA), CASE(BGRA), CASE(ARGB), CASE(Intensity), CASE(Luminance),
330 CASE(Rx), CASE(RGx), CASE(RGBx), CASE(Depth), CASE(DepthStencil),
331 CASE(sRGB), CASE(sRGBx), CASE(sRGBA), CASE(sBGRA),
David Netoddda85a2015-10-02 17:10:10 -0400332};
333#undef CASE
334
335// All image channel data types depend on the Kernel capability.
Lei Zhangb36e7042015-10-28 13:40:52 -0400336#define CASE(NAME) \
337 { \
338 #NAME, SpvImageChannelDataType##NAME, \
339 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel), { \
340 SPV_OPERAND_TYPE_NONE \
341 } \
David Netoddda85a2015-10-02 17:10:10 -0400342 }
343static const spv_operand_desc_t imageChannelDataTypeEntries[] = {
David Netod02f68a2015-11-11 12:32:21 -0500344 CASE(SnormInt8), CASE(SnormInt16), CASE(UnormInt8),
345 CASE(UnormInt16), CASE(UnormShort565), CASE(UnormShort555),
346 CASE(UnormInt101010), CASE(SignedInt8), CASE(SignedInt16),
347 CASE(SignedInt32), CASE(UnsignedInt8), CASE(UnsignedInt16),
348 CASE(UnsignedInt32), CASE(HalfFloat), CASE(Float),
349 CASE(UnormInt24), CASE(UnormInt101010_2),
David Netoddda85a2015-10-02 17:10:10 -0400350};
351#undef CASE
352
David Netoee1b3bb2015-09-18 11:19:18 -0400353// Image operand definitions. Each enum value is a mask. When that mask
354// bit is set, the instruction should have further ID operands.
355// Some mask values depend on a capability.
356static const spv_operand_desc_t imageOperandEntries[] = {
357// Rev32 and later adds many more enums.
Lei Zhang1a0334e2015-11-02 09:41:20 -0500358#define CASE(NAME) #NAME, SpvImageOperands##NAME##Mask, 0
359#define CASE_CAP(NAME, CAP) #NAME, SpvImageOperands##NAME##Mask, CAP
David Netoee1b3bb2015-09-18 11:19:18 -0400360#define ID SPV_OPERAND_TYPE_ID
361#define NONE SPV_OPERAND_TYPE_NONE
Lei Zhangb36e7042015-10-28 13:40:52 -0400362 {"None", SpvImageOperandsMaskNone, 0, {NONE}},
363 {CASE_CAP(Bias, SPV_CAPABILITY_AS_MASK(SpvCapabilityShader)), {ID, NONE}},
David Netoee1b3bb2015-09-18 11:19:18 -0400364 {CASE(Lod), {ID, NONE}},
365 {CASE(Grad), {ID, ID, NONE}},
366 {CASE(ConstOffset), {ID, NONE}},
Lei Zhangb36e7042015-10-28 13:40:52 -0400367 {CASE_CAP(Offset, SPV_CAPABILITY_AS_MASK(SpvCapabilityImageGatherExtended)),
Dejan Mircevski205408b2015-09-30 16:42:34 -0400368 {ID, NONE}},
David Netoee1b3bb2015-09-18 11:19:18 -0400369 {CASE(ConstOffsets), {ID, NONE}},
370 {CASE(Sample), {ID, NONE}},
Lei Zhangb36e7042015-10-28 13:40:52 -0400371 {CASE_CAP(MinLod, SPV_CAPABILITY_AS_MASK(SpvCapabilityMinLod)), {ID, NONE}},
David Netoee1b3bb2015-09-18 11:19:18 -0400372#undef CASE
373#undef CASE_CAP
374#undef ID
375#undef NONE
376};
377
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100378static const spv_operand_desc_t fpFastMathModeEntries[] = {
Lei Zhang1a0334e2015-11-02 09:41:20 -0500379 {"None", SpvFPFastMathModeMaskNone, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100380 {"NotNaN",
Lei Zhangb36e7042015-10-28 13:40:52 -0400381 SpvFPFastMathModeNotNaNMask,
382 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100383 {SPV_OPERAND_TYPE_NONE}},
384 {"NotInf",
Lei Zhangb36e7042015-10-28 13:40:52 -0400385 SpvFPFastMathModeNotInfMask,
386 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100387 {SPV_OPERAND_TYPE_NONE}},
388 {"NSZ",
Lei Zhangb36e7042015-10-28 13:40:52 -0400389 SpvFPFastMathModeNSZMask,
390 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100391 {SPV_OPERAND_TYPE_NONE}},
392 {"AllowRecip",
Lei Zhangb36e7042015-10-28 13:40:52 -0400393 SpvFPFastMathModeAllowRecipMask,
394 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100395 {SPV_OPERAND_TYPE_NONE}},
396 {"Fast",
Lei Zhangb36e7042015-10-28 13:40:52 -0400397 SpvFPFastMathModeFastMask,
398 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100399 {SPV_OPERAND_TYPE_NONE}},
400};
401
402static const spv_operand_desc_t fpRoundingModeEntries[] = {
403 {"RTE",
Lei Zhangb36e7042015-10-28 13:40:52 -0400404 SpvFPRoundingModeRTE,
405 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100406 {SPV_OPERAND_TYPE_NONE}},
407 {"RTZ",
Lei Zhangb36e7042015-10-28 13:40:52 -0400408 SpvFPRoundingModeRTZ,
409 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100410 {SPV_OPERAND_TYPE_NONE}},
411 {"RTP",
Lei Zhangb36e7042015-10-28 13:40:52 -0400412 SpvFPRoundingModeRTP,
413 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100414 {SPV_OPERAND_TYPE_NONE}},
415 {"RTN",
Lei Zhangb36e7042015-10-28 13:40:52 -0400416 SpvFPRoundingModeRTN,
417 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100418 {SPV_OPERAND_TYPE_NONE}},
419};
420
421static const spv_operand_desc_t linkageTypeEntries[] = {
422 {"Export",
Lei Zhangb36e7042015-10-28 13:40:52 -0400423 SpvLinkageTypeExport,
424 SPV_CAPABILITY_AS_MASK(SpvCapabilityLinkage),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100425 {SPV_OPERAND_TYPE_NONE}},
426 {"Import",
Lei Zhangb36e7042015-10-28 13:40:52 -0400427 SpvLinkageTypeImport,
428 SPV_CAPABILITY_AS_MASK(SpvCapabilityLinkage),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100429 {SPV_OPERAND_TYPE_NONE}},
430};
431
432static const spv_operand_desc_t accessQualifierEntries[] = {
433 {"ReadOnly",
Lei Zhangb36e7042015-10-28 13:40:52 -0400434 SpvAccessQualifierReadOnly,
435 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100436 {SPV_OPERAND_TYPE_NONE}},
437 {"WriteOnly",
Lei Zhangb36e7042015-10-28 13:40:52 -0400438 SpvAccessQualifierWriteOnly,
439 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100440 {SPV_OPERAND_TYPE_NONE}},
441 {"ReadWrite",
Lei Zhangb36e7042015-10-28 13:40:52 -0400442 SpvAccessQualifierReadWrite,
443 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100444 {SPV_OPERAND_TYPE_NONE}},
445};
446
447static const spv_operand_desc_t functionParameterAttributeEntries[] = {
448 {"Zext",
Lei Zhangb36e7042015-10-28 13:40:52 -0400449 SpvFunctionParameterAttributeZext,
450 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100451 {SPV_OPERAND_TYPE_NONE}},
452 {"Sext",
Lei Zhangb36e7042015-10-28 13:40:52 -0400453 SpvFunctionParameterAttributeSext,
454 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100455 {SPV_OPERAND_TYPE_NONE}},
456 {"ByVal",
Lei Zhangb36e7042015-10-28 13:40:52 -0400457 SpvFunctionParameterAttributeByVal,
458 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100459 {SPV_OPERAND_TYPE_NONE}},
460 {"Sret",
Lei Zhangb36e7042015-10-28 13:40:52 -0400461 SpvFunctionParameterAttributeSret,
462 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100463 {SPV_OPERAND_TYPE_NONE}},
464 {"NoAlias",
Lei Zhangb36e7042015-10-28 13:40:52 -0400465 SpvFunctionParameterAttributeNoAlias,
466 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100467 {SPV_OPERAND_TYPE_NONE}},
David Neto37547b22015-09-10 13:23:11 -0400468 {"NoCapture",
Lei Zhangb36e7042015-10-28 13:40:52 -0400469 SpvFunctionParameterAttributeNoCapture,
470 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100471 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100472 {"NoWrite",
Lei Zhangb36e7042015-10-28 13:40:52 -0400473 SpvFunctionParameterAttributeNoWrite,
474 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100475 {SPV_OPERAND_TYPE_NONE}},
476 {"NoReadWrite",
Lei Zhangb36e7042015-10-28 13:40:52 -0400477 SpvFunctionParameterAttributeNoReadWrite,
478 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100479 {SPV_OPERAND_TYPE_NONE}},
480};
481
482static const spv_operand_desc_t decorationEntries[] = {
Lei Zhang604e5ce2015-08-14 14:46:43 -0400483 {"RelaxedPrecision",
Lei Zhangb36e7042015-10-28 13:40:52 -0400484 SpvDecorationRelaxedPrecision,
485 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100486 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400487 {
Dejan Mircevski50babb22015-09-29 10:56:32 -0400488 "SpecId",
Lei Zhangb36e7042015-10-28 13:40:52 -0400489 SpvDecorationSpecId,
490 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Lei Zhang6483bd72015-10-14 17:02:39 -0400491 {SPV_OPERAND_TYPE_LITERAL_INTEGER},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400492 },
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100493 {"Block",
Lei Zhangb36e7042015-10-28 13:40:52 -0400494 SpvDecorationBlock,
495 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100496 {SPV_OPERAND_TYPE_NONE}},
497 {"BufferBlock",
Lei Zhangb36e7042015-10-28 13:40:52 -0400498 SpvDecorationBufferBlock,
499 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100500 {SPV_OPERAND_TYPE_NONE}},
501 {"RowMajor",
Lei Zhangb36e7042015-10-28 13:40:52 -0400502 SpvDecorationRowMajor,
503 SPV_CAPABILITY_AS_MASK(SpvCapabilityMatrix),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100504 {SPV_OPERAND_TYPE_NONE}},
505 {"ColMajor",
Lei Zhangb36e7042015-10-28 13:40:52 -0400506 SpvDecorationColMajor,
507 SPV_CAPABILITY_AS_MASK(SpvCapabilityMatrix),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100508 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400509 {"ArrayStride",
Lei Zhangb36e7042015-10-28 13:40:52 -0400510 SpvDecorationArrayStride,
511 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Lei Zhang6483bd72015-10-14 17:02:39 -0400512 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400513 {"MatrixStride",
Lei Zhangb36e7042015-10-28 13:40:52 -0400514 SpvDecorationMatrixStride,
515 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Lei Zhang6483bd72015-10-14 17:02:39 -0400516 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100517 {"GLSLShared",
Lei Zhangb36e7042015-10-28 13:40:52 -0400518 SpvDecorationGLSLShared,
519 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100520 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100521 {"GLSLPacked",
Lei Zhangb36e7042015-10-28 13:40:52 -0400522 SpvDecorationGLSLPacked,
523 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100524 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400525 {"CPacked",
Lei Zhangb36e7042015-10-28 13:40:52 -0400526 SpvDecorationCPacked,
527 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Lei Zhang604e5ce2015-08-14 14:46:43 -0400528 {SPV_OPERAND_TYPE_NONE}},
529 {"BuiltIn",
Lei Zhangb36e7042015-10-28 13:40:52 -0400530 SpvDecorationBuiltIn,
531 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Lei Zhang604e5ce2015-08-14 14:46:43 -0400532 {SPV_OPERAND_TYPE_BUILT_IN, SPV_OPERAND_TYPE_NONE}},
David Netodbaf4072015-09-22 16:23:06 -0400533 {"NoPerspective",
Lei Zhangb36e7042015-10-28 13:40:52 -0400534 SpvDecorationNoPerspective,
535 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100536 {SPV_OPERAND_TYPE_NONE}},
537 {"Flat",
Lei Zhangb36e7042015-10-28 13:40:52 -0400538 SpvDecorationFlat,
539 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100540 {SPV_OPERAND_TYPE_NONE}},
541 {"Patch",
Lei Zhangb36e7042015-10-28 13:40:52 -0400542 SpvDecorationPatch,
543 SPV_CAPABILITY_AS_MASK(SpvCapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100544 {SPV_OPERAND_TYPE_NONE}},
545 {"Centroid",
Lei Zhangb36e7042015-10-28 13:40:52 -0400546 SpvDecorationCentroid,
547 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100548 {SPV_OPERAND_TYPE_NONE}},
549 {"Sample",
Lei Zhangb36e7042015-10-28 13:40:52 -0400550 SpvDecorationSample,
551 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100552 {SPV_OPERAND_TYPE_NONE}},
553 {"Invariant",
Lei Zhangb36e7042015-10-28 13:40:52 -0400554 SpvDecorationInvariant,
555 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100556 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang1a0334e2015-11-02 09:41:20 -0500557 {"Restrict", SpvDecorationRestrict, 0, {SPV_OPERAND_TYPE_NONE}},
558 {"Aliased", SpvDecorationAliased, 0, {SPV_OPERAND_TYPE_NONE}},
559 {"Volatile", SpvDecorationVolatile, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100560 {"Constant",
Lei Zhangb36e7042015-10-28 13:40:52 -0400561 SpvDecorationConstant,
562 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100563 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang1a0334e2015-11-02 09:41:20 -0500564 {"Coherent", SpvDecorationCoherent, 0, {SPV_OPERAND_TYPE_NONE}},
565 {"NonWritable", SpvDecorationNonWritable, 0, {SPV_OPERAND_TYPE_NONE}},
566 {"NonReadable", SpvDecorationNonReadable, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100567 {"Uniform",
Lei Zhangb36e7042015-10-28 13:40:52 -0400568 SpvDecorationUniform,
569 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100570 {SPV_OPERAND_TYPE_NONE}},
David Neto37547b22015-09-10 13:23:11 -0400571 {"SaturatedConversion",
Lei Zhangb36e7042015-10-28 13:40:52 -0400572 SpvDecorationSaturatedConversion,
573 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100574 {SPV_OPERAND_TYPE_NONE}},
575 {"Stream",
Lei Zhangb36e7042015-10-28 13:40:52 -0400576 SpvDecorationStream,
David Neto12511c82015-11-12 15:30:28 -0500577 SPV_CAPABILITY_AS_MASK(SpvCapabilityGeometryStreams),
Lei Zhang6483bd72015-10-14 17:02:39 -0400578 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100579 {"Location",
Lei Zhangb36e7042015-10-28 13:40:52 -0400580 SpvDecorationLocation,
581 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Lei Zhang6483bd72015-10-14 17:02:39 -0400582 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100583 {"Component",
Lei Zhangb36e7042015-10-28 13:40:52 -0400584 SpvDecorationComponent,
585 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Lei Zhang6483bd72015-10-14 17:02:39 -0400586 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100587 {"Index",
Lei Zhangb36e7042015-10-28 13:40:52 -0400588 SpvDecorationIndex,
589 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Lei Zhang6483bd72015-10-14 17:02:39 -0400590 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100591 {"Binding",
Lei Zhangb36e7042015-10-28 13:40:52 -0400592 SpvDecorationBinding,
593 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Lei Zhang6483bd72015-10-14 17:02:39 -0400594 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100595 {"DescriptorSet",
Lei Zhangb36e7042015-10-28 13:40:52 -0400596 SpvDecorationDescriptorSet,
597 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Lei Zhang6483bd72015-10-14 17:02:39 -0400598 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100599 {"Offset",
Lei Zhangb36e7042015-10-28 13:40:52 -0400600 SpvDecorationOffset,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100601 0,
Lei Zhang6483bd72015-10-14 17:02:39 -0400602 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100603 {"XfbBuffer",
Lei Zhangb36e7042015-10-28 13:40:52 -0400604 SpvDecorationXfbBuffer,
605 SPV_CAPABILITY_AS_MASK(SpvCapabilityTransformFeedback),
Lei Zhang6483bd72015-10-14 17:02:39 -0400606 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400607 {"XfbStride",
Lei Zhangb36e7042015-10-28 13:40:52 -0400608 SpvDecorationXfbStride,
609 SPV_CAPABILITY_AS_MASK(SpvCapabilityTransformFeedback),
Lei Zhang6483bd72015-10-14 17:02:39 -0400610 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100611 {"FuncParamAttr",
Lei Zhangb36e7042015-10-28 13:40:52 -0400612 SpvDecorationFuncParamAttr,
613 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100614 {SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE, SPV_OPERAND_TYPE_NONE}},
615 {"FPRoundingMode",
Lei Zhangb36e7042015-10-28 13:40:52 -0400616 SpvDecorationFPRoundingMode,
617 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100618 {SPV_OPERAND_TYPE_FP_ROUNDING_MODE, SPV_OPERAND_TYPE_NONE}},
619 {"FPFastMathMode",
Lei Zhangb36e7042015-10-28 13:40:52 -0400620 SpvDecorationFPFastMathMode,
621 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100622 {SPV_OPERAND_TYPE_FP_FAST_MATH_MODE, SPV_OPERAND_TYPE_NONE}},
623 {"LinkageAttributes",
Lei Zhangb36e7042015-10-28 13:40:52 -0400624 SpvDecorationLinkageAttributes,
625 SPV_CAPABILITY_AS_MASK(SpvCapabilityLinkage),
Dejan Mircevski50babb22015-09-29 10:56:32 -0400626 {SPV_OPERAND_TYPE_LITERAL_STRING, SPV_OPERAND_TYPE_LINKAGE_TYPE,
627 SPV_OPERAND_TYPE_NONE}},
David Netod7687982015-09-23 14:59:27 -0400628 {"NoContraction",
Lei Zhangb36e7042015-10-28 13:40:52 -0400629 SpvDecorationNoContraction,
630 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
David Netod7687982015-09-23 14:59:27 -0400631 {SPV_OPERAND_TYPE_NONE}},
David Netod02f68a2015-11-11 12:32:21 -0500632 {"InputAttachmentIndex",
633 SpvDecorationInputAttachmentIndex,
634 SPV_CAPABILITY_AS_MASK(SpvCapabilityInputAttachment),
635 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
David Netod7687982015-09-23 14:59:27 -0400636 {"Alignment",
Lei Zhangb36e7042015-10-28 13:40:52 -0400637 SpvDecorationAlignment,
638 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Lei Zhang6483bd72015-10-14 17:02:39 -0400639 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100640};
641
642static const spv_operand_desc_t builtInEntries[] = {
643 {"Position",
Lei Zhangb36e7042015-10-28 13:40:52 -0400644 SpvBuiltInPosition,
645 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100646 {SPV_OPERAND_TYPE_NONE}},
647 {"PointSize",
Lei Zhangb36e7042015-10-28 13:40:52 -0400648 SpvBuiltInPointSize,
649 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100650 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100651 {"ClipDistance",
Lei Zhangb36e7042015-10-28 13:40:52 -0400652 SpvBuiltInClipDistance,
653 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100654 {SPV_OPERAND_TYPE_NONE}},
655 {"CullDistance",
Lei Zhangb36e7042015-10-28 13:40:52 -0400656 SpvBuiltInCullDistance,
657 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100658 {SPV_OPERAND_TYPE_NONE}},
659 {"VertexId",
Lei Zhangb36e7042015-10-28 13:40:52 -0400660 SpvBuiltInVertexId,
661 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100662 {SPV_OPERAND_TYPE_NONE}},
663 {"InstanceId",
Lei Zhangb36e7042015-10-28 13:40:52 -0400664 SpvBuiltInInstanceId,
665 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100666 {SPV_OPERAND_TYPE_NONE}},
667 {"PrimitiveId",
Lei Zhangb36e7042015-10-28 13:40:52 -0400668 SpvBuiltInPrimitiveId,
669 SPV_CAPABILITY_AS_MASK(SpvCapabilityGeometry) |
670 SPV_CAPABILITY_AS_MASK(SpvCapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100671 {SPV_OPERAND_TYPE_NONE}},
672 {"InvocationId",
Lei Zhangb36e7042015-10-28 13:40:52 -0400673 SpvBuiltInInvocationId,
674 SPV_CAPABILITY_AS_MASK(SpvCapabilityGeometry) |
675 SPV_CAPABILITY_AS_MASK(SpvCapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100676 {SPV_OPERAND_TYPE_NONE}},
677 {"Layer",
Lei Zhangb36e7042015-10-28 13:40:52 -0400678 SpvBuiltInLayer,
679 SPV_CAPABILITY_AS_MASK(SpvCapabilityGeometry),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100680 {SPV_OPERAND_TYPE_NONE}},
681 {"ViewportIndex",
Lei Zhangb36e7042015-10-28 13:40:52 -0400682 SpvBuiltInViewportIndex,
683 SPV_CAPABILITY_AS_MASK(SpvCapabilityGeometry),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100684 {SPV_OPERAND_TYPE_NONE}},
685 {"TessLevelOuter",
Lei Zhangb36e7042015-10-28 13:40:52 -0400686 SpvBuiltInTessLevelOuter,
687 SPV_CAPABILITY_AS_MASK(SpvCapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100688 {SPV_OPERAND_TYPE_NONE}},
689 {"TessLevelInner",
Lei Zhangb36e7042015-10-28 13:40:52 -0400690 SpvBuiltInTessLevelInner,
691 SPV_CAPABILITY_AS_MASK(SpvCapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100692 {SPV_OPERAND_TYPE_NONE}},
693 {"TessCoord",
Lei Zhangb36e7042015-10-28 13:40:52 -0400694 SpvBuiltInTessCoord,
695 SPV_CAPABILITY_AS_MASK(SpvCapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100696 {SPV_OPERAND_TYPE_NONE}},
697 {"PatchVertices",
Lei Zhangb36e7042015-10-28 13:40:52 -0400698 SpvBuiltInPatchVertices,
699 SPV_CAPABILITY_AS_MASK(SpvCapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100700 {SPV_OPERAND_TYPE_NONE}},
701 {"FragCoord",
Lei Zhangb36e7042015-10-28 13:40:52 -0400702 SpvBuiltInFragCoord,
703 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100704 {SPV_OPERAND_TYPE_NONE}},
705 {"PointCoord",
Lei Zhangb36e7042015-10-28 13:40:52 -0400706 SpvBuiltInPointCoord,
707 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100708 {SPV_OPERAND_TYPE_NONE}},
709 {"FrontFacing",
Lei Zhangb36e7042015-10-28 13:40:52 -0400710 SpvBuiltInFrontFacing,
711 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100712 {SPV_OPERAND_TYPE_NONE}},
713 {"SampleId",
Lei Zhangb36e7042015-10-28 13:40:52 -0400714 SpvBuiltInSampleId,
715 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100716 {SPV_OPERAND_TYPE_NONE}},
717 {"SamplePosition",
Lei Zhangb36e7042015-10-28 13:40:52 -0400718 SpvBuiltInSamplePosition,
719 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100720 {SPV_OPERAND_TYPE_NONE}},
721 {"SampleMask",
Lei Zhangb36e7042015-10-28 13:40:52 -0400722 SpvBuiltInSampleMask,
723 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100724 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100725 {"FragDepth",
Lei Zhangb36e7042015-10-28 13:40:52 -0400726 SpvBuiltInFragDepth,
727 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100728 {SPV_OPERAND_TYPE_NONE}},
729 {"HelperInvocation",
Lei Zhangb36e7042015-10-28 13:40:52 -0400730 SpvBuiltInHelperInvocation,
731 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100732 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang1a0334e2015-11-02 09:41:20 -0500733 {"NumWorkgroups", SpvBuiltInNumWorkgroups, 0, {SPV_OPERAND_TYPE_NONE}},
734 {"WorkgroupSize", SpvBuiltInWorkgroupSize, 0, {SPV_OPERAND_TYPE_NONE}},
735 {"WorkgroupId", SpvBuiltInWorkgroupId, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100736 {"LocalInvocationId",
Lei Zhangb36e7042015-10-28 13:40:52 -0400737 SpvBuiltInLocalInvocationId,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100738 0,
739 {SPV_OPERAND_TYPE_NONE}},
740 {"GlobalInvocationId",
Lei Zhangb36e7042015-10-28 13:40:52 -0400741 SpvBuiltInGlobalInvocationId,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100742 0,
743 {SPV_OPERAND_TYPE_NONE}},
744 {"LocalInvocationIndex",
Lei Zhangb36e7042015-10-28 13:40:52 -0400745 SpvBuiltInLocalInvocationIndex,
746 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100747 {SPV_OPERAND_TYPE_NONE}},
748 {"WorkDim",
Lei Zhangb36e7042015-10-28 13:40:52 -0400749 SpvBuiltInWorkDim,
750 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100751 {SPV_OPERAND_TYPE_NONE}},
752 {"GlobalSize",
Lei Zhangb36e7042015-10-28 13:40:52 -0400753 SpvBuiltInGlobalSize,
754 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100755 {SPV_OPERAND_TYPE_NONE}},
756 {"EnqueuedWorkgroupSize",
Lei Zhangb36e7042015-10-28 13:40:52 -0400757 SpvBuiltInEnqueuedWorkgroupSize,
758 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100759 {SPV_OPERAND_TYPE_NONE}},
760 {"GlobalOffset",
Lei Zhangb36e7042015-10-28 13:40:52 -0400761 SpvBuiltInGlobalOffset,
762 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100763 {SPV_OPERAND_TYPE_NONE}},
764 {"GlobalLinearId",
Lei Zhangb36e7042015-10-28 13:40:52 -0400765 SpvBuiltInGlobalLinearId,
766 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100767 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100768 {"SubgroupSize",
Lei Zhangb36e7042015-10-28 13:40:52 -0400769 SpvBuiltInSubgroupSize,
770 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100771 {SPV_OPERAND_TYPE_NONE}},
772 {"SubgroupMaxSize",
Lei Zhangb36e7042015-10-28 13:40:52 -0400773 SpvBuiltInSubgroupMaxSize,
774 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100775 {SPV_OPERAND_TYPE_NONE}},
776 {"NumSubgroups",
Lei Zhangb36e7042015-10-28 13:40:52 -0400777 SpvBuiltInNumSubgroups,
778 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100779 {SPV_OPERAND_TYPE_NONE}},
780 {"NumEnqueuedSubgroups",
Lei Zhangb36e7042015-10-28 13:40:52 -0400781 SpvBuiltInNumEnqueuedSubgroups,
782 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100783 {SPV_OPERAND_TYPE_NONE}},
784 {"SubgroupId",
Lei Zhangb36e7042015-10-28 13:40:52 -0400785 SpvBuiltInSubgroupId,
786 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100787 {SPV_OPERAND_TYPE_NONE}},
788 {"SubgroupLocalInvocationId",
Lei Zhangb36e7042015-10-28 13:40:52 -0400789 SpvBuiltInSubgroupLocalInvocationId,
790 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100791 {SPV_OPERAND_TYPE_NONE}},
David Neto2d1b5e52015-09-23 15:35:27 -0400792 {"VertexIndex",
Lei Zhangb36e7042015-10-28 13:40:52 -0400793 SpvBuiltInVertexIndex,
794 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
David Neto2d1b5e52015-09-23 15:35:27 -0400795 {SPV_OPERAND_TYPE_NONE}},
796 {"InstanceIndex",
Lei Zhangb36e7042015-10-28 13:40:52 -0400797 SpvBuiltInInstanceIndex,
798 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
David Neto2d1b5e52015-09-23 15:35:27 -0400799 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100800};
801
802static const spv_operand_desc_t selectionControlEntries[] = {
Lei Zhang1a0334e2015-11-02 09:41:20 -0500803 {"None", SpvSelectionControlMaskNone, 0, {SPV_OPERAND_TYPE_NONE}},
804 {"Flatten", SpvSelectionControlFlattenMask, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100805 {"DontFlatten",
Lei Zhangb36e7042015-10-28 13:40:52 -0400806 SpvSelectionControlDontFlattenMask,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100807 0,
808 {SPV_OPERAND_TYPE_NONE}},
809};
810
811static const spv_operand_desc_t loopControlEntries[] = {
Lei Zhang1a0334e2015-11-02 09:41:20 -0500812 {"None", SpvLoopControlMaskNone, 0, {SPV_OPERAND_TYPE_NONE}},
813 {"Unroll", SpvLoopControlUnrollMask, 0, {SPV_OPERAND_TYPE_NONE}},
814 {"DontUnroll", SpvLoopControlDontUnrollMask, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100815};
816
817static const spv_operand_desc_t functionControlEntries[] = {
Lei Zhang1a0334e2015-11-02 09:41:20 -0500818 {"None", SpvFunctionControlMaskNone, 0, {SPV_OPERAND_TYPE_NONE}},
819 {"Inline", SpvFunctionControlInlineMask, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100820 {"DontInline",
Lei Zhangb36e7042015-10-28 13:40:52 -0400821 SpvFunctionControlDontInlineMask,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100822 0,
823 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang1a0334e2015-11-02 09:41:20 -0500824 {"Pure", SpvFunctionControlPureMask, 0, {SPV_OPERAND_TYPE_NONE}},
825 {"Const", SpvFunctionControlConstMask, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100826};
827
828static const spv_operand_desc_t memorySemanticsEntries[] = {
David Netobfa3d862015-09-25 10:30:27 -0400829 // "Relaxed" should be a synonym for "None".
830 // Put the Relaxed entry first so that the disassembler
831 // will prefer to emit "Relaxed".
Lei Zhang1a0334e2015-11-02 09:41:20 -0500832 {"Relaxed", SpvMemorySemanticsMaskNone, 0, {SPV_OPERAND_TYPE_NONE}},
833 {"None", SpvMemorySemanticsMaskNone, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100834 {"SequentiallyConsistent",
Lei Zhangb36e7042015-10-28 13:40:52 -0400835 SpvMemorySemanticsSequentiallyConsistentMask,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100836 0,
837 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang1a0334e2015-11-02 09:41:20 -0500838 {"Acquire", SpvMemorySemanticsAcquireMask, 0, {SPV_OPERAND_TYPE_NONE}},
839 {"Release", SpvMemorySemanticsReleaseMask, 0, {SPV_OPERAND_TYPE_NONE}},
David Netod02f68a2015-11-11 12:32:21 -0500840 {"AcquireRelease",
841 SpvMemorySemanticsAcquireReleaseMask,
842 0,
843 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100844 {"UniformMemory",
Lei Zhangb36e7042015-10-28 13:40:52 -0400845 SpvMemorySemanticsUniformMemoryMask,
846 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100847 {SPV_OPERAND_TYPE_NONE}},
848 {"SubgroupMemory",
Lei Zhangb36e7042015-10-28 13:40:52 -0400849 SpvMemorySemanticsSubgroupMemoryMask,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100850 0,
851 {SPV_OPERAND_TYPE_NONE}},
David Netod02f68a2015-11-11 12:32:21 -0500852 {"WorkgroupMemory",
853 SpvMemorySemanticsWorkgroupMemoryMask,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100854 0,
855 {SPV_OPERAND_TYPE_NONE}},
David Netod02f68a2015-11-11 12:32:21 -0500856 {"CrossWorkgroupMemory",
857 SpvMemorySemanticsCrossWorkgroupMemoryMask,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100858 0,
859 {SPV_OPERAND_TYPE_NONE}},
860 {"AtomicCounterMemory",
Lei Zhangb36e7042015-10-28 13:40:52 -0400861 SpvMemorySemanticsAtomicCounterMemoryMask,
862 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100863 {SPV_OPERAND_TYPE_NONE}},
864 {
Dejan Mircevski50babb22015-09-29 10:56:32 -0400865 "ImageMemory",
Lei Zhangb36e7042015-10-28 13:40:52 -0400866 SpvMemorySemanticsImageMemoryMask,
Dejan Mircevski50babb22015-09-29 10:56:32 -0400867 0,
868 {SPV_OPERAND_TYPE_NONE},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100869 },
870};
871
872static const spv_operand_desc_t memoryAccessEntries[] = {
Lei Zhang1a0334e2015-11-02 09:41:20 -0500873 {"None", SpvMemoryAccessMaskNone, 0, {SPV_OPERAND_TYPE_NONE}},
874 {"Volatile", SpvMemoryAccessVolatileMask, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100875 {
Dejan Mircevski50babb22015-09-29 10:56:32 -0400876 "Aligned",
Lei Zhangb36e7042015-10-28 13:40:52 -0400877 SpvMemoryAccessAlignedMask,
Dejan Mircevski50babb22015-09-29 10:56:32 -0400878 0,
Lei Zhang6483bd72015-10-14 17:02:39 -0400879 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100880 },
Lei Zhang1a0334e2015-11-02 09:41:20 -0500881 {"Nontemporal", SpvMemoryAccessNontemporalMask, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100882};
883
884static const spv_operand_desc_t scopeEntries[] = {
Lei Zhang1a0334e2015-11-02 09:41:20 -0500885 {"CrossDevice", SpvScopeCrossDevice, 0, {SPV_OPERAND_TYPE_NONE}},
Lei Zhangb36e7042015-10-28 13:40:52 -0400886 {"Device", SpvScopeDevice, 0, {SPV_OPERAND_TYPE_NONE}},
Lei Zhang1a0334e2015-11-02 09:41:20 -0500887 {"Workgroup", SpvScopeWorkgroup, 0, {SPV_OPERAND_TYPE_NONE}},
888 {"Subgroup", SpvScopeSubgroup, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100889 {
Lei Zhang1a0334e2015-11-02 09:41:20 -0500890 "Invocation", SpvScopeInvocation, 0, {SPV_OPERAND_TYPE_NONE},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100891 },
892};
893
894static const spv_operand_desc_t groupOperationEntries[] = {
895 {"Reduce",
Lei Zhangb36e7042015-10-28 13:40:52 -0400896 SpvGroupOperationReduce,
897 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100898 {SPV_OPERAND_TYPE_NONE}},
899 {"InclusiveScan",
Lei Zhangb36e7042015-10-28 13:40:52 -0400900 SpvGroupOperationInclusiveScan,
901 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100902 {SPV_OPERAND_TYPE_NONE}},
903 {"ExclusiveScan",
Lei Zhangb36e7042015-10-28 13:40:52 -0400904 SpvGroupOperationExclusiveScan,
905 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100906 {SPV_OPERAND_TYPE_NONE}},
907};
908
909static const spv_operand_desc_t kernelKernelEnqueueFlagssEntries[] = {
910 {"NoWait",
Lei Zhangb36e7042015-10-28 13:40:52 -0400911 SpvKernelEnqueueFlagsNoWait,
912 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100913 {SPV_OPERAND_TYPE_NONE}},
914 {"WaitKernel",
Lei Zhangb36e7042015-10-28 13:40:52 -0400915 SpvKernelEnqueueFlagsWaitKernel,
916 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100917 {SPV_OPERAND_TYPE_NONE}},
918 {"WaitWorkGroup",
Lei Zhangb36e7042015-10-28 13:40:52 -0400919 SpvKernelEnqueueFlagsWaitWorkGroup,
920 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100921 {SPV_OPERAND_TYPE_NONE}},
922};
923
924static const spv_operand_desc_t kernelProfilingInfoEntries[] = {
Lei Zhang1a0334e2015-11-02 09:41:20 -0500925 {"None", SpvKernelProfilingInfoMaskNone, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100926 {"CmdExecTime",
Lei Zhangb36e7042015-10-28 13:40:52 -0400927 SpvKernelProfilingInfoCmdExecTimeMask,
928 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100929 {SPV_OPERAND_TYPE_NONE}},
930};
931
David Netod30b2332015-09-23 16:04:24 -0400932// A macro for defining a capability that doesn't depend on another capability.
Lei Zhangb36e7042015-10-28 13:40:52 -0400933#define CASE(NAME) \
934 { \
935 #NAME, SpvCapability##NAME, 0, { SPV_OPERAND_TYPE_NONE } \
David Netod30b2332015-09-23 16:04:24 -0400936 }
937
938// A macro for defining a capability that depends on another.
Lei Zhangb36e7042015-10-28 13:40:52 -0400939#define CASE_CAP(NAME, CAP) \
940 { \
941 #NAME, SpvCapability##NAME, SPV_CAPABILITY_AS_MASK(SpvCapability##CAP), { \
942 SPV_OPERAND_TYPE_NONE \
943 } \
David Netod30b2332015-09-23 16:04:24 -0400944 }
945
David Neto64a9be92015-11-18 15:48:32 -0500946// clang-format off
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100947static const spv_operand_desc_t capabilityInfoEntries[] = {
David Netod30b2332015-09-23 16:04:24 -0400948 CASE(Matrix),
949 CASE_CAP(Shader, Matrix),
950 CASE_CAP(Geometry, Shader),
951 CASE_CAP(Tessellation, Shader),
952 CASE(Addresses),
953 CASE(Linkage),
954 CASE(Kernel),
955 CASE_CAP(Vector16, Kernel),
956 CASE_CAP(Float16Buffer, Kernel),
957 CASE_CAP(Float16, Float16Buffer),
958 CASE(Float64),
959 CASE(Int64),
960 CASE_CAP(Int64Atomics, Int64),
961 CASE_CAP(ImageBasic, Kernel),
962 CASE_CAP(ImageReadWrite, Kernel),
963 CASE_CAP(ImageMipmap, Kernel),
David Netod02f68a2015-11-11 12:32:21 -0500964 // Value 16 intentionally missing.
David Netod30b2332015-09-23 16:04:24 -0400965 CASE_CAP(Pipes, Kernel),
966 CASE(Groups),
967 CASE_CAP(DeviceEnqueue, Kernel),
968 CASE_CAP(LiteralSampler, Kernel),
969 CASE_CAP(AtomicStorage, Shader),
970 CASE(Int16),
971 CASE_CAP(TessellationPointSize, Tessellation),
972 CASE_CAP(GeometryPointSize, Geometry),
973 CASE_CAP(ImageGatherExtended, Shader),
David Netod02f68a2015-11-11 12:32:21 -0500974 // Value 26 intentionally missing.
David Netod30b2332015-09-23 16:04:24 -0400975 CASE_CAP(StorageImageMultisample, Shader),
976 CASE_CAP(UniformBufferArrayDynamicIndexing, Shader),
977 CASE_CAP(SampledImageArrayDynamicIndexing, Shader),
978 CASE_CAP(StorageBufferArrayDynamicIndexing, Shader),
979 CASE_CAP(StorageImageArrayDynamicIndexing, Shader),
980 CASE_CAP(ClipDistance, Shader),
981 CASE_CAP(CullDistance, Shader),
982 CASE_CAP(ImageCubeArray, SampledCubeArray),
983 CASE_CAP(SampleRateShading, Shader),
984 CASE_CAP(ImageRect, SampledRect),
985 CASE_CAP(SampledRect, Shader),
986 CASE_CAP(GenericPointer, Addresses),
987 CASE_CAP(Int8, Kernel),
David Netod02f68a2015-11-11 12:32:21 -0500988 CASE_CAP(InputAttachment, Shader),
David Netod30b2332015-09-23 16:04:24 -0400989 CASE_CAP(SparseResidency, Shader),
990 CASE_CAP(MinLod, Shader),
991 CASE_CAP(Sampled1D, Shader),
992 CASE_CAP(Image1D, Sampled1D),
993 CASE_CAP(SampledCubeArray, Shader),
994 CASE_CAP(SampledBuffer, Shader),
995 CASE_CAP(ImageBuffer, SampledBuffer),
996 CASE_CAP(ImageMSArray, Shader),
David Netod02f68a2015-11-11 12:32:21 -0500997 CASE_CAP(StorageImageExtendedFormats, Shader),
David Netod30b2332015-09-23 16:04:24 -0400998 CASE_CAP(ImageQuery, Shader),
999 CASE_CAP(DerivativeControl, Shader),
1000 CASE_CAP(InterpolationFunction, Shader),
1001 CASE_CAP(TransformFeedback, Shader),
David Neto12511c82015-11-12 15:30:28 -05001002 CASE_CAP(GeometryStreams, Geometry),
David Neto5f7ed912015-11-12 15:44:25 -05001003 CASE_CAP(StorageImageReadWithoutFormat, Shader),
1004 CASE_CAP(StorageImageWriteWithoutFormat, Shader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001005};
David Neto64a9be92015-11-18 15:48:32 -05001006// clang-format on
David Netod30b2332015-09-23 16:04:24 -04001007#undef CASE
1008#undef CASE_CAP
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001009
David Netoba73a7c2016-01-06 13:08:39 -05001010// Evaluates to the number of elements of array A.
1011// If we could use constexpr, then we could make this a template function.
1012// If the source arrays were std::array, then we could have used
1013// std::array::size.
1014#define ARRAY_SIZE(A) (static_cast<uint32_t>(sizeof(A)/sizeof(A[0])))
1015
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001016static const spv_operand_desc_group_t opcodeEntryTypes[] = {
David Netoba73a7c2016-01-06 13:08:39 -05001017 // TODO(dneto): Reformat this table.
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001018 {SPV_OPERAND_TYPE_SOURCE_LANGUAGE,
David Netoba73a7c2016-01-06 13:08:39 -05001019 ARRAY_SIZE(sourceLanguageEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001020 sourceLanguageEntries},
1021 {SPV_OPERAND_TYPE_EXECUTION_MODEL,
David Netoba73a7c2016-01-06 13:08:39 -05001022 ARRAY_SIZE(executionModelEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001023 executionModelEntries},
1024 {SPV_OPERAND_TYPE_ADDRESSING_MODEL,
David Netoba73a7c2016-01-06 13:08:39 -05001025 ARRAY_SIZE(addressingModelEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001026 addressingModelEntries},
1027 {SPV_OPERAND_TYPE_MEMORY_MODEL,
David Netoba73a7c2016-01-06 13:08:39 -05001028 ARRAY_SIZE(memoryModelEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001029 memoryModelEntries},
1030 {SPV_OPERAND_TYPE_EXECUTION_MODE,
David Netoba73a7c2016-01-06 13:08:39 -05001031 ARRAY_SIZE(executionModeEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001032 executionModeEntries},
1033 {SPV_OPERAND_TYPE_STORAGE_CLASS,
David Netoba73a7c2016-01-06 13:08:39 -05001034 ARRAY_SIZE(storageClassEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001035 storageClassEntries},
1036 {SPV_OPERAND_TYPE_DIMENSIONALITY,
David Netoba73a7c2016-01-06 13:08:39 -05001037 ARRAY_SIZE(dimensionalityEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001038 dimensionalityEntries},
1039 {SPV_OPERAND_TYPE_SAMPLER_ADDRESSING_MODE,
David Netoba73a7c2016-01-06 13:08:39 -05001040 ARRAY_SIZE(samplerAddressingModeEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001041 samplerAddressingModeEntries},
1042 {SPV_OPERAND_TYPE_SAMPLER_FILTER_MODE,
David Netoba73a7c2016-01-06 13:08:39 -05001043 ARRAY_SIZE(samplerFilterModeEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001044 samplerFilterModeEntries},
David Netob30a0c52015-09-16 15:56:43 -04001045 {SPV_OPERAND_TYPE_SAMPLER_IMAGE_FORMAT,
David Netoba73a7c2016-01-06 13:08:39 -05001046 ARRAY_SIZE(samplerImageFormatEntries),
David Netob30a0c52015-09-16 15:56:43 -04001047 samplerImageFormatEntries},
David Netoddda85a2015-10-02 17:10:10 -04001048 {SPV_OPERAND_TYPE_IMAGE_CHANNEL_ORDER,
David Netoba73a7c2016-01-06 13:08:39 -05001049 ARRAY_SIZE(imageChannelOrderEntries),
David Netoddda85a2015-10-02 17:10:10 -04001050 imageChannelOrderEntries},
1051 {SPV_OPERAND_TYPE_IMAGE_CHANNEL_DATA_TYPE,
David Netoba73a7c2016-01-06 13:08:39 -05001052 ARRAY_SIZE(imageChannelDataTypeEntries),
David Netoddda85a2015-10-02 17:10:10 -04001053 imageChannelDataTypeEntries},
David Neto201caf72015-11-04 17:38:17 -05001054 {SPV_OPERAND_TYPE_IMAGE,
David Netoba73a7c2016-01-06 13:08:39 -05001055 ARRAY_SIZE(imageOperandEntries),
David Neto201caf72015-11-04 17:38:17 -05001056 imageOperandEntries},
1057 {SPV_OPERAND_TYPE_OPTIONAL_IMAGE, // Same as *_IMAGE
David Netoba73a7c2016-01-06 13:08:39 -05001058 ARRAY_SIZE(imageOperandEntries),
David Netoee1b3bb2015-09-18 11:19:18 -04001059 imageOperandEntries},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001060 {SPV_OPERAND_TYPE_FP_FAST_MATH_MODE,
David Netoba73a7c2016-01-06 13:08:39 -05001061 ARRAY_SIZE(fpFastMathModeEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001062 fpFastMathModeEntries},
1063 {SPV_OPERAND_TYPE_FP_ROUNDING_MODE,
David Netoba73a7c2016-01-06 13:08:39 -05001064 ARRAY_SIZE(fpRoundingModeEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001065 fpRoundingModeEntries},
1066 {SPV_OPERAND_TYPE_LINKAGE_TYPE,
David Netoba73a7c2016-01-06 13:08:39 -05001067 ARRAY_SIZE(linkageTypeEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001068 linkageTypeEntries},
1069 {SPV_OPERAND_TYPE_ACCESS_QUALIFIER,
David Netoba73a7c2016-01-06 13:08:39 -05001070 ARRAY_SIZE(accessQualifierEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001071 accessQualifierEntries},
1072 {SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE,
David Netoba73a7c2016-01-06 13:08:39 -05001073 ARRAY_SIZE(functionParameterAttributeEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001074 functionParameterAttributeEntries},
1075 {SPV_OPERAND_TYPE_DECORATION,
David Netoba73a7c2016-01-06 13:08:39 -05001076 ARRAY_SIZE(decorationEntries), decorationEntries},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001077 {SPV_OPERAND_TYPE_BUILT_IN,
David Netoba73a7c2016-01-06 13:08:39 -05001078 ARRAY_SIZE(builtInEntries), builtInEntries},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001079 {SPV_OPERAND_TYPE_SELECTION_CONTROL,
David Netoba73a7c2016-01-06 13:08:39 -05001080 ARRAY_SIZE(selectionControlEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001081 selectionControlEntries},
1082 {SPV_OPERAND_TYPE_LOOP_CONTROL,
David Netoba73a7c2016-01-06 13:08:39 -05001083 ARRAY_SIZE(loopControlEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001084 loopControlEntries},
1085 {SPV_OPERAND_TYPE_FUNCTION_CONTROL,
David Netoba73a7c2016-01-06 13:08:39 -05001086 ARRAY_SIZE(functionControlEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001087 functionControlEntries},
David Neto64a9be92015-11-18 15:48:32 -05001088 {SPV_OPERAND_TYPE_MEMORY_SEMANTICS_ID,
David Netoba73a7c2016-01-06 13:08:39 -05001089 ARRAY_SIZE(memorySemanticsEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001090 memorySemanticsEntries},
David Neto201caf72015-11-04 17:38:17 -05001091 {SPV_OPERAND_TYPE_MEMORY_ACCESS,
David Netoba73a7c2016-01-06 13:08:39 -05001092 ARRAY_SIZE(memoryAccessEntries),
David Neto201caf72015-11-04 17:38:17 -05001093 memoryAccessEntries},
1094 {SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS, // Same as *_MEMORY_ACCESS
David Netoba73a7c2016-01-06 13:08:39 -05001095 ARRAY_SIZE(memoryAccessEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001096 memoryAccessEntries},
David Neto64a9be92015-11-18 15:48:32 -05001097 {SPV_OPERAND_TYPE_SCOPE_ID,
David Netoba73a7c2016-01-06 13:08:39 -05001098 ARRAY_SIZE(scopeEntries), scopeEntries},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001099 {SPV_OPERAND_TYPE_GROUP_OPERATION,
David Netoba73a7c2016-01-06 13:08:39 -05001100 ARRAY_SIZE(groupOperationEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001101 groupOperationEntries},
1102 {SPV_OPERAND_TYPE_KERNEL_ENQ_FLAGS,
David Netoba73a7c2016-01-06 13:08:39 -05001103 ARRAY_SIZE(kernelKernelEnqueueFlagssEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001104 kernelKernelEnqueueFlagssEntries},
David Neto47994822015-08-27 13:11:01 -04001105 {SPV_OPERAND_TYPE_KERNEL_PROFILING_INFO,
David Netoba73a7c2016-01-06 13:08:39 -05001106 ARRAY_SIZE(kernelProfilingInfoEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001107 kernelProfilingInfoEntries},
1108 {SPV_OPERAND_TYPE_CAPABILITY,
David Netoba73a7c2016-01-06 13:08:39 -05001109 ARRAY_SIZE(capabilityInfoEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001110 capabilityInfoEntries},
1111};
1112
Dejan Mircevski50babb22015-09-29 10:56:32 -04001113spv_result_t spvOperandTableGet(spv_operand_table* pOperandTable) {
Lei Zhang40056702015-09-11 14:31:27 -04001114 if (!pOperandTable) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001115
David Netoba73a7c2016-01-06 13:08:39 -05001116 static const spv_operand_table_t table = {ARRAY_SIZE(opcodeEntryTypes),
1117 opcodeEntryTypes};
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001118
1119 *pOperandTable = &table;
1120
1121 return SPV_SUCCESS;
1122}
1123
Dejan Mircevski3e6b2df2016-01-07 11:00:38 -05001124#undef ARRAY_SIZE
1125
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001126spv_result_t spvOperandTableNameLookup(const spv_operand_table table,
1127 const spv_operand_type_t type,
David Neto388c40d2015-09-16 16:42:56 -04001128 const char* name,
1129 const size_t nameLength,
1130 spv_operand_desc* pEntry) {
Lei Zhang40056702015-09-11 14:31:27 -04001131 if (!table) return SPV_ERROR_INVALID_TABLE;
1132 if (!name || !pEntry) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001133
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001134 for (uint64_t typeIndex = 0; typeIndex < table->count; ++typeIndex) {
1135 if (type == table->types[typeIndex].type) {
1136 for (uint64_t operandIndex = 0;
1137 operandIndex < table->types[typeIndex].count; ++operandIndex) {
1138 if (nameLength ==
1139 strlen(table->types[typeIndex].entries[operandIndex].name) &&
1140 !strncmp(table->types[typeIndex].entries[operandIndex].name, name,
David Neto388c40d2015-09-16 16:42:56 -04001141 nameLength)) {
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001142 *pEntry = &table->types[typeIndex].entries[operandIndex];
1143 return SPV_SUCCESS;
1144 }
1145 }
1146 }
1147 }
1148
1149 return SPV_ERROR_INVALID_LOOKUP;
1150}
1151
1152spv_result_t spvOperandTableValueLookup(const spv_operand_table table,
1153 const spv_operand_type_t type,
1154 const uint32_t value,
Dejan Mircevski50babb22015-09-29 10:56:32 -04001155 spv_operand_desc* pEntry) {
Lei Zhang40056702015-09-11 14:31:27 -04001156 if (!table) return SPV_ERROR_INVALID_TABLE;
1157 if (!pEntry) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001158
1159 for (uint64_t typeIndex = 0; typeIndex < table->count; ++typeIndex) {
1160 if (type == table->types[typeIndex].type) {
1161 for (uint64_t operandIndex = 0;
1162 operandIndex < table->types[typeIndex].count; ++operandIndex) {
1163 if (value == table->types[typeIndex].entries[operandIndex].value) {
1164 *pEntry = &table->types[typeIndex].entries[operandIndex];
1165 return SPV_SUCCESS;
1166 }
1167 }
1168 }
1169 }
1170
1171 return SPV_ERROR_INVALID_LOOKUP;
1172}
1173
Dejan Mircevski50babb22015-09-29 10:56:32 -04001174const char* spvOperandTypeStr(spv_operand_type_t type) {
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001175 switch (type) {
1176 case SPV_OPERAND_TYPE_ID:
David Netofadbf622015-09-14 17:07:11 -04001177 case SPV_OPERAND_TYPE_OPTIONAL_ID:
David Netofadbf622015-09-14 17:07:11 -04001178 return "ID";
David Neto201caf72015-11-04 17:38:17 -05001179 case SPV_OPERAND_TYPE_TYPE_ID:
1180 return "type ID";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001181 case SPV_OPERAND_TYPE_RESULT_ID:
1182 return "result ID";
Lei Zhang6483bd72015-10-14 17:02:39 -04001183 case SPV_OPERAND_TYPE_LITERAL_INTEGER:
David Neto201caf72015-11-04 17:38:17 -05001184 case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_INTEGER:
1185 case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_NUMBER:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001186 return "literal number";
David Neto201caf72015-11-04 17:38:17 -05001187 case SPV_OPERAND_TYPE_OPTIONAL_TYPED_LITERAL_INTEGER:
1188 return "possibly multi-word literal integer";
1189 case SPV_OPERAND_TYPE_TYPED_LITERAL_NUMBER:
1190 return "possibly multi-word literal number";
1191 case SPV_OPERAND_TYPE_EXTENSION_INSTRUCTION_NUMBER:
1192 return "extension instruction number";
David Neto0f166be2015-11-11 01:56:49 -05001193 case SPV_OPERAND_TYPE_SPEC_CONSTANT_OP_NUMBER:
1194 return "OpSpecConstantOp opcode";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001195 case SPV_OPERAND_TYPE_LITERAL_STRING:
David Neto201caf72015-11-04 17:38:17 -05001196 case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_STRING:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001197 return "literal string";
1198 case SPV_OPERAND_TYPE_SOURCE_LANGUAGE:
Dejan Mircevskid2c81cf2015-10-09 11:06:10 -04001199 return "source language";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001200 case SPV_OPERAND_TYPE_EXECUTION_MODEL:
1201 return "execution model";
1202 case SPV_OPERAND_TYPE_ADDRESSING_MODEL:
1203 return "addressing model";
1204 case SPV_OPERAND_TYPE_MEMORY_MODEL:
1205 return "memory model";
1206 case SPV_OPERAND_TYPE_EXECUTION_MODE:
David Neto201caf72015-11-04 17:38:17 -05001207 case SPV_OPERAND_TYPE_OPTIONAL_EXECUTION_MODE:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001208 return "execution mode";
1209 case SPV_OPERAND_TYPE_STORAGE_CLASS:
1210 return "storage class";
1211 case SPV_OPERAND_TYPE_DIMENSIONALITY:
1212 return "dimensionality";
1213 case SPV_OPERAND_TYPE_SAMPLER_ADDRESSING_MODE:
David Netod9ad0502015-11-24 18:37:24 -05001214 return "sampler addressing mode";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001215 case SPV_OPERAND_TYPE_SAMPLER_FILTER_MODE:
1216 return "sampler filter mode";
David Netob30a0c52015-09-16 15:56:43 -04001217 case SPV_OPERAND_TYPE_SAMPLER_IMAGE_FORMAT:
Dejan Mircevski971b3442015-10-13 12:54:47 -04001218 return "image format";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001219 case SPV_OPERAND_TYPE_FP_FAST_MATH_MODE:
Dejan Mircevski355cc0c2015-10-13 15:02:03 -04001220 return "floating-point fast math mode";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001221 case SPV_OPERAND_TYPE_FP_ROUNDING_MODE:
Dejan Mircevski355cc0c2015-10-13 15:02:03 -04001222 return "floating-point rounding mode";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001223 case SPV_OPERAND_TYPE_LINKAGE_TYPE:
1224 return "linkage type";
1225 case SPV_OPERAND_TYPE_ACCESS_QUALIFIER:
1226 return "access qualifier";
1227 case SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE:
1228 return "function parameter attribute";
1229 case SPV_OPERAND_TYPE_DECORATION:
1230 return "decoration";
1231 case SPV_OPERAND_TYPE_BUILT_IN:
Dejan Mircevskid7b0f832015-10-13 15:39:38 -04001232 return "built-in";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001233 case SPV_OPERAND_TYPE_SELECTION_CONTROL:
1234 return "selection control";
1235 case SPV_OPERAND_TYPE_LOOP_CONTROL:
1236 return "loop control";
1237 case SPV_OPERAND_TYPE_FUNCTION_CONTROL:
1238 return "function control";
David Neto64a9be92015-11-18 15:48:32 -05001239 case SPV_OPERAND_TYPE_MEMORY_SEMANTICS_ID:
David Netod9ad0502015-11-24 18:37:24 -05001240 return "memory semantics ID";
David Neto201caf72015-11-04 17:38:17 -05001241 case SPV_OPERAND_TYPE_MEMORY_ACCESS:
David Neto78c3b432015-08-27 13:03:52 -04001242 case SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001243 return "memory access";
David Neto64a9be92015-11-18 15:48:32 -05001244 case SPV_OPERAND_TYPE_SCOPE_ID:
David Netod9ad0502015-11-24 18:37:24 -05001245 return "scope ID";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001246 case SPV_OPERAND_TYPE_GROUP_OPERATION:
1247 return "group operation";
1248 case SPV_OPERAND_TYPE_KERNEL_ENQ_FLAGS:
1249 return "kernel enqeue flags";
David Neto47994822015-08-27 13:11:01 -04001250 case SPV_OPERAND_TYPE_KERNEL_PROFILING_INFO:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001251 return "kernel profiling info";
1252 case SPV_OPERAND_TYPE_CAPABILITY:
1253 return "capability";
David Neto201caf72015-11-04 17:38:17 -05001254 case SPV_OPERAND_TYPE_IMAGE:
David Netoee1b3bb2015-09-18 11:19:18 -04001255 case SPV_OPERAND_TYPE_OPTIONAL_IMAGE:
David Netod9ad0502015-11-24 18:37:24 -05001256 return "image";
David Neto201caf72015-11-04 17:38:17 -05001257 case SPV_OPERAND_TYPE_OPTIONAL_CIV:
1258 return "context-insensitive value";
1259
1260 // The next values are for values returned from an instruction, not actually
1261 // an operand. So the specific strings don't matter. But let's add them
1262 // for completeness and ease of testing.
1263 case SPV_OPERAND_TYPE_IMAGE_CHANNEL_ORDER:
1264 return "image channel order";
1265 case SPV_OPERAND_TYPE_IMAGE_CHANNEL_DATA_TYPE:
1266 return "image channel data type";
1267
David Neto78c3b432015-08-27 13:03:52 -04001268 case SPV_OPERAND_TYPE_NONE:
1269 return "NONE";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001270 default:
1271 assert(0 && "Unhandled operand type!");
1272 break;
1273 }
1274 return "unknown";
1275}
David Neto78c3b432015-08-27 13:03:52 -04001276
1277void spvPrependOperandTypes(const spv_operand_type_t* types,
1278 spv_operand_pattern_t* pattern) {
1279 const spv_operand_type_t* endTypes;
Dejan Mircevski50babb22015-09-29 10:56:32 -04001280 for (endTypes = types; *endTypes != SPV_OPERAND_TYPE_NONE; ++endTypes)
David Neto78c3b432015-08-27 13:03:52 -04001281 ;
1282 pattern->insert(pattern->begin(), types, endTypes);
1283}
1284
David Neto5bf88fc2015-09-17 17:06:10 -04001285void spvPrependOperandTypesForMask(const spv_operand_table operandTable,
1286 const spv_operand_type_t type,
1287 const uint32_t mask,
1288 spv_operand_pattern_t* pattern) {
1289 // Scan from highest bits to lowest bits because we will prepend in LIFO
1290 // fashion, and we need the operands for lower order bits to appear first.
1291 for (uint32_t candidate_bit = (1 << 31); candidate_bit; candidate_bit >>= 1) {
1292 if (candidate_bit & mask) {
1293 spv_operand_desc entry = nullptr;
1294 if (SPV_SUCCESS == spvOperandTableValueLookup(operandTable, type,
1295 candidate_bit, &entry)) {
1296 spvPrependOperandTypes(entry->operandTypes, pattern);
1297 }
1298 }
1299 }
1300}
1301
David Netob5267562016-02-02 12:05:34 -05001302bool spvOperandIsConcreteMask(spv_operand_type_t type) {
1303 return SPV_OPERAND_TYPE_FIRST_CONCRETE_MASK_TYPE <= type &&
1304 type <= SPV_OPERAND_TYPE_LAST_CONCRETE_MASK_TYPE;
1305}
1306
David Neto78c3b432015-08-27 13:03:52 -04001307bool spvOperandIsOptional(spv_operand_type_t type) {
David Neto201caf72015-11-04 17:38:17 -05001308 return SPV_OPERAND_TYPE_FIRST_OPTIONAL_TYPE <= type &&
1309 type <= SPV_OPERAND_TYPE_LAST_OPTIONAL_TYPE;
David Neto78c3b432015-08-27 13:03:52 -04001310}
1311
1312bool spvOperandIsVariable(spv_operand_type_t type) {
David Neto201caf72015-11-04 17:38:17 -05001313 return SPV_OPERAND_TYPE_FIRST_VARIABLE_TYPE <= type &&
1314 type <= SPV_OPERAND_TYPE_LAST_VARIABLE_TYPE;
David Neto78c3b432015-08-27 13:03:52 -04001315}
1316
David Neto78c3b432015-08-27 13:03:52 -04001317bool spvExpandOperandSequenceOnce(spv_operand_type_t type,
1318 spv_operand_pattern_t* pattern) {
1319 switch (type) {
1320 case SPV_OPERAND_TYPE_VARIABLE_ID:
1321 pattern->insert(pattern->begin(), {SPV_OPERAND_TYPE_OPTIONAL_ID, type});
1322 return true;
Lei Zhang6483bd72015-10-14 17:02:39 -04001323 case SPV_OPERAND_TYPE_VARIABLE_LITERAL_INTEGER:
David Neto78c3b432015-08-27 13:03:52 -04001324 pattern->insert(pattern->begin(),
Lei Zhang6483bd72015-10-14 17:02:39 -04001325 {SPV_OPERAND_TYPE_OPTIONAL_LITERAL_INTEGER, type});
David Neto78c3b432015-08-27 13:03:52 -04001326 return true;
Lei Zhang6483bd72015-10-14 17:02:39 -04001327 case SPV_OPERAND_TYPE_VARIABLE_LITERAL_INTEGER_ID:
David Neto201caf72015-11-04 17:38:17 -05001328 // Represents Zero or more (Literal number, Id) pairs,
1329 // where the literal number must be a scalar integer.
David Neto78c3b432015-08-27 13:03:52 -04001330 pattern->insert(pattern->begin(),
David Neto201caf72015-11-04 17:38:17 -05001331 {SPV_OPERAND_TYPE_OPTIONAL_TYPED_LITERAL_INTEGER,
1332 SPV_OPERAND_TYPE_ID, type});
David Neto78c3b432015-08-27 13:03:52 -04001333 return true;
Lei Zhang6483bd72015-10-14 17:02:39 -04001334 case SPV_OPERAND_TYPE_VARIABLE_ID_LITERAL_INTEGER:
David Neto561dc4e2015-09-25 14:23:29 -04001335 // Represents Zero or more (Id, Literal number) pairs.
David Neto201caf72015-11-04 17:38:17 -05001336 pattern->insert(pattern->begin(),
1337 {SPV_OPERAND_TYPE_OPTIONAL_ID,
1338 SPV_OPERAND_TYPE_LITERAL_INTEGER, type});
David Neto78c3b432015-08-27 13:03:52 -04001339 return true;
David Neto78c3b432015-08-27 13:03:52 -04001340 case SPV_OPERAND_TYPE_VARIABLE_EXECUTION_MODE:
Dejan Mircevski50babb22015-09-29 10:56:32 -04001341 pattern->insert(pattern->begin(),
1342 {SPV_OPERAND_TYPE_OPTIONAL_EXECUTION_MODE, type});
David Neto78c3b432015-08-27 13:03:52 -04001343 return true;
1344 default:
1345 break;
1346 }
1347 return false;
1348}
1349
Dejan Mircevski50babb22015-09-29 10:56:32 -04001350spv_operand_type_t spvTakeFirstMatchableOperand(
1351 spv_operand_pattern_t* pattern) {
David Neto78c3b432015-08-27 13:03:52 -04001352 assert(!pattern->empty());
1353 spv_operand_type_t result;
1354 do {
1355 result = pattern->front();
1356 pattern->pop_front();
Dejan Mircevski50babb22015-09-29 10:56:32 -04001357 } while (spvExpandOperandSequenceOnce(result, pattern));
David Neto78c3b432015-08-27 13:03:52 -04001358 return result;
1359}
Dejan Mircevski903f9d62015-09-28 17:04:39 -04001360
Dejan Mircevski897bff92015-09-29 10:38:18 -04001361spv_operand_pattern_t spvAlternatePatternFollowingImmediate(
1362 const spv_operand_pattern_t& pattern) {
1363 spv_operand_pattern_t alternatePattern;
1364 for (const auto& operand : pattern) {
1365 if (operand == SPV_OPERAND_TYPE_RESULT_ID) {
1366 alternatePattern.push_back(operand);
1367 alternatePattern.push_back(SPV_OPERAND_TYPE_OPTIONAL_CIV);
1368 return alternatePattern;
Dejan Mircevski903f9d62015-09-28 17:04:39 -04001369 }
Dejan Mircevski897bff92015-09-29 10:38:18 -04001370 alternatePattern.push_back(SPV_OPERAND_TYPE_OPTIONAL_CIV);
Dejan Mircevski903f9d62015-09-28 17:04:39 -04001371 }
Dejan Mircevski897bff92015-09-29 10:38:18 -04001372 // No result-id found, so just expect CIVs.
1373 return {SPV_OPERAND_TYPE_OPTIONAL_CIV};
Dejan Mircevski903f9d62015-09-28 17:04:39 -04001374}
Dejan Mircevski961f5dc2016-01-15 11:25:11 -05001375
1376bool spvIsIdType(spv_operand_type_t type) {
1377 switch (type) {
1378 case SPV_OPERAND_TYPE_ID:
1379 case SPV_OPERAND_TYPE_TYPE_ID:
1380 case SPV_OPERAND_TYPE_RESULT_ID:
1381 case SPV_OPERAND_TYPE_MEMORY_SEMANTICS_ID:
1382 case SPV_OPERAND_TYPE_SCOPE_ID:
1383 return true;
1384 default:
1385 return false;
1386 }
1387 return false;
1388}