blob: 3754654583b3e84feedeeaddd2dc757fc60ed190 [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,
David Netodd8a6612016-02-14 13:55:50 -0500191 SPV_CAPABILITY_AS_MASK(SpvCapabilityGenericPointer),
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,
David Netodd8a6612016-02-14 13:55:50 -0500515 SPV_CAPABILITY_AS_MASK(SpvCapabilityMatrix),
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,
David Netodd8a6612016-02-14 13:55:50 -0500531 0,
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,
David Netodd8a6612016-02-14 13:55:50 -0500551 SPV_CAPABILITY_AS_MASK(SpvCapabilitySampleRateShading),
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,
David Netodd8a6612016-02-14 13:55:50 -0500601 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
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,
David Netodd8a6612016-02-14 13:55:50 -0500653 SPV_CAPABILITY_AS_MASK(SpvCapabilityClipDistance),
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,
David Netodd8a6612016-02-14 13:55:50 -0500657 SPV_CAPABILITY_AS_MASK(SpvCapabilityCullDistance),
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,
David Netodd8a6612016-02-14 13:55:50 -0500683 SPV_CAPABILITY_AS_MASK(SpvCapabilityMultiViewport),
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,
David Netodd8a6612016-02-14 13:55:50 -0500715 SPV_CAPABILITY_AS_MASK(SpvCapabilitySampleRateShading),
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,
David Netodd8a6612016-02-14 13:55:50 -0500719 SPV_CAPABILITY_AS_MASK(SpvCapabilitySampleRateShading),
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,
David Netodd8a6612016-02-14 13:55:50 -0500723 SPV_CAPABILITY_AS_MASK(SpvCapabilitySampleRateShading),
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,
David Netodd8a6612016-02-14 13:55:50 -0500746 0,
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,
David Netodd8a6612016-02-14 13:55:50 -0500862 SPV_CAPABILITY_AS_MASK(SpvCapabilityAtomicStorage),
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),
David Netodd8a6612016-02-14 13:55:50 -0500957 CASE(Float16),
David Netod30b2332015-09-23 16:04:24 -0400958 CASE(Float64),
959 CASE(Int64),
960 CASE_CAP(Int64Atomics, Int64),
961 CASE_CAP(ImageBasic, Kernel),
Lei Zhang45291462016-03-29 09:47:23 -0400962 CASE_CAP(ImageReadWrite, ImageBasic),
963 CASE_CAP(ImageMipmap, ImageBasic),
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),
David Neto53075ea2016-02-17 12:12:45 -05001005 CASE_CAP(MultiViewport, Geometry),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001006};
David Neto64a9be92015-11-18 15:48:32 -05001007// clang-format on
David Netod30b2332015-09-23 16:04:24 -04001008#undef CASE
1009#undef CASE_CAP
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001010
David Netoba73a7c2016-01-06 13:08:39 -05001011// Evaluates to the number of elements of array A.
1012// If we could use constexpr, then we could make this a template function.
1013// If the source arrays were std::array, then we could have used
1014// std::array::size.
David Netodd8a6612016-02-14 13:55:50 -05001015#define ARRAY_SIZE(A) (static_cast<uint32_t>(sizeof(A) / sizeof(A[0])))
David Netoba73a7c2016-01-06 13:08:39 -05001016
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001017static const spv_operand_desc_group_t opcodeEntryTypes[] = {
David Netodd8a6612016-02-14 13:55:50 -05001018 // TODO(dneto): Reformat this table.
1019 {SPV_OPERAND_TYPE_SOURCE_LANGUAGE, ARRAY_SIZE(sourceLanguageEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001020 sourceLanguageEntries},
David Netodd8a6612016-02-14 13:55:50 -05001021 {SPV_OPERAND_TYPE_EXECUTION_MODEL, ARRAY_SIZE(executionModelEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001022 executionModelEntries},
David Netodd8a6612016-02-14 13:55:50 -05001023 {SPV_OPERAND_TYPE_ADDRESSING_MODEL, ARRAY_SIZE(addressingModelEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001024 addressingModelEntries},
David Netodd8a6612016-02-14 13:55:50 -05001025 {SPV_OPERAND_TYPE_MEMORY_MODEL, ARRAY_SIZE(memoryModelEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001026 memoryModelEntries},
David Netodd8a6612016-02-14 13:55:50 -05001027 {SPV_OPERAND_TYPE_EXECUTION_MODE, ARRAY_SIZE(executionModeEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001028 executionModeEntries},
David Netodd8a6612016-02-14 13:55:50 -05001029 {SPV_OPERAND_TYPE_STORAGE_CLASS, ARRAY_SIZE(storageClassEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001030 storageClassEntries},
David Netodd8a6612016-02-14 13:55:50 -05001031 {SPV_OPERAND_TYPE_DIMENSIONALITY, ARRAY_SIZE(dimensionalityEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001032 dimensionalityEntries},
1033 {SPV_OPERAND_TYPE_SAMPLER_ADDRESSING_MODE,
David Netodd8a6612016-02-14 13:55:50 -05001034 ARRAY_SIZE(samplerAddressingModeEntries), samplerAddressingModeEntries},
1035 {SPV_OPERAND_TYPE_SAMPLER_FILTER_MODE, ARRAY_SIZE(samplerFilterModeEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001036 samplerFilterModeEntries},
David Netob30a0c52015-09-16 15:56:43 -04001037 {SPV_OPERAND_TYPE_SAMPLER_IMAGE_FORMAT,
David Netodd8a6612016-02-14 13:55:50 -05001038 ARRAY_SIZE(samplerImageFormatEntries), samplerImageFormatEntries},
1039 {SPV_OPERAND_TYPE_IMAGE_CHANNEL_ORDER, ARRAY_SIZE(imageChannelOrderEntries),
David Netoddda85a2015-10-02 17:10:10 -04001040 imageChannelOrderEntries},
1041 {SPV_OPERAND_TYPE_IMAGE_CHANNEL_DATA_TYPE,
David Netodd8a6612016-02-14 13:55:50 -05001042 ARRAY_SIZE(imageChannelDataTypeEntries), imageChannelDataTypeEntries},
1043 {SPV_OPERAND_TYPE_IMAGE, ARRAY_SIZE(imageOperandEntries),
David Neto201caf72015-11-04 17:38:17 -05001044 imageOperandEntries},
1045 {SPV_OPERAND_TYPE_OPTIONAL_IMAGE, // Same as *_IMAGE
David Netodd8a6612016-02-14 13:55:50 -05001046 ARRAY_SIZE(imageOperandEntries), imageOperandEntries},
1047 {SPV_OPERAND_TYPE_FP_FAST_MATH_MODE, ARRAY_SIZE(fpFastMathModeEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001048 fpFastMathModeEntries},
David Netodd8a6612016-02-14 13:55:50 -05001049 {SPV_OPERAND_TYPE_FP_ROUNDING_MODE, ARRAY_SIZE(fpRoundingModeEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001050 fpRoundingModeEntries},
David Netodd8a6612016-02-14 13:55:50 -05001051 {SPV_OPERAND_TYPE_LINKAGE_TYPE, ARRAY_SIZE(linkageTypeEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001052 linkageTypeEntries},
David Netodd8a6612016-02-14 13:55:50 -05001053 {SPV_OPERAND_TYPE_ACCESS_QUALIFIER, ARRAY_SIZE(accessQualifierEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001054 accessQualifierEntries},
David Neto2889a0c2016-02-15 13:50:00 -05001055 {SPV_OPERAND_TYPE_OPTIONAL_ACCESS_QUALIFIER, // Same as *_ACCESS_QUALIFIER
1056 ARRAY_SIZE(accessQualifierEntries), accessQualifierEntries},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001057 {SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE,
David Netoba73a7c2016-01-06 13:08:39 -05001058 ARRAY_SIZE(functionParameterAttributeEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001059 functionParameterAttributeEntries},
David Netodd8a6612016-02-14 13:55:50 -05001060 {SPV_OPERAND_TYPE_DECORATION, ARRAY_SIZE(decorationEntries),
1061 decorationEntries},
1062 {SPV_OPERAND_TYPE_BUILT_IN, ARRAY_SIZE(builtInEntries), builtInEntries},
1063 {SPV_OPERAND_TYPE_SELECTION_CONTROL, ARRAY_SIZE(selectionControlEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001064 selectionControlEntries},
David Netodd8a6612016-02-14 13:55:50 -05001065 {SPV_OPERAND_TYPE_LOOP_CONTROL, ARRAY_SIZE(loopControlEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001066 loopControlEntries},
David Netodd8a6612016-02-14 13:55:50 -05001067 {SPV_OPERAND_TYPE_FUNCTION_CONTROL, ARRAY_SIZE(functionControlEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001068 functionControlEntries},
David Netodd8a6612016-02-14 13:55:50 -05001069 {SPV_OPERAND_TYPE_MEMORY_SEMANTICS_ID, ARRAY_SIZE(memorySemanticsEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001070 memorySemanticsEntries},
David Netodd8a6612016-02-14 13:55:50 -05001071 {SPV_OPERAND_TYPE_MEMORY_ACCESS, ARRAY_SIZE(memoryAccessEntries),
David Neto201caf72015-11-04 17:38:17 -05001072 memoryAccessEntries},
1073 {SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS, // Same as *_MEMORY_ACCESS
David Netodd8a6612016-02-14 13:55:50 -05001074 ARRAY_SIZE(memoryAccessEntries), memoryAccessEntries},
1075 {SPV_OPERAND_TYPE_SCOPE_ID, ARRAY_SIZE(scopeEntries), scopeEntries},
1076 {SPV_OPERAND_TYPE_GROUP_OPERATION, ARRAY_SIZE(groupOperationEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001077 groupOperationEntries},
1078 {SPV_OPERAND_TYPE_KERNEL_ENQ_FLAGS,
David Netoba73a7c2016-01-06 13:08:39 -05001079 ARRAY_SIZE(kernelKernelEnqueueFlagssEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001080 kernelKernelEnqueueFlagssEntries},
David Neto47994822015-08-27 13:11:01 -04001081 {SPV_OPERAND_TYPE_KERNEL_PROFILING_INFO,
David Netodd8a6612016-02-14 13:55:50 -05001082 ARRAY_SIZE(kernelProfilingInfoEntries), kernelProfilingInfoEntries},
1083 {SPV_OPERAND_TYPE_CAPABILITY, ARRAY_SIZE(capabilityInfoEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001084 capabilityInfoEntries},
1085};
1086
Dejan Mircevski50babb22015-09-29 10:56:32 -04001087spv_result_t spvOperandTableGet(spv_operand_table* pOperandTable) {
Lei Zhang40056702015-09-11 14:31:27 -04001088 if (!pOperandTable) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001089
David Netoba73a7c2016-01-06 13:08:39 -05001090 static const spv_operand_table_t table = {ARRAY_SIZE(opcodeEntryTypes),
1091 opcodeEntryTypes};
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001092
1093 *pOperandTable = &table;
1094
1095 return SPV_SUCCESS;
1096}
1097
Dejan Mircevski3e6b2df2016-01-07 11:00:38 -05001098#undef ARRAY_SIZE
1099
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001100spv_result_t spvOperandTableNameLookup(const spv_operand_table table,
1101 const spv_operand_type_t type,
David Neto388c40d2015-09-16 16:42:56 -04001102 const char* name,
1103 const size_t nameLength,
1104 spv_operand_desc* pEntry) {
Lei Zhang40056702015-09-11 14:31:27 -04001105 if (!table) return SPV_ERROR_INVALID_TABLE;
1106 if (!name || !pEntry) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001107
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001108 for (uint64_t typeIndex = 0; typeIndex < table->count; ++typeIndex) {
1109 if (type == table->types[typeIndex].type) {
1110 for (uint64_t operandIndex = 0;
1111 operandIndex < table->types[typeIndex].count; ++operandIndex) {
1112 if (nameLength ==
1113 strlen(table->types[typeIndex].entries[operandIndex].name) &&
1114 !strncmp(table->types[typeIndex].entries[operandIndex].name, name,
David Neto388c40d2015-09-16 16:42:56 -04001115 nameLength)) {
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001116 *pEntry = &table->types[typeIndex].entries[operandIndex];
1117 return SPV_SUCCESS;
1118 }
1119 }
1120 }
1121 }
1122
1123 return SPV_ERROR_INVALID_LOOKUP;
1124}
1125
1126spv_result_t spvOperandTableValueLookup(const spv_operand_table table,
1127 const spv_operand_type_t type,
1128 const uint32_t value,
Dejan Mircevski50babb22015-09-29 10:56:32 -04001129 spv_operand_desc* pEntry) {
Lei Zhang40056702015-09-11 14:31:27 -04001130 if (!table) return SPV_ERROR_INVALID_TABLE;
1131 if (!pEntry) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001132
1133 for (uint64_t typeIndex = 0; typeIndex < table->count; ++typeIndex) {
1134 if (type == table->types[typeIndex].type) {
1135 for (uint64_t operandIndex = 0;
1136 operandIndex < table->types[typeIndex].count; ++operandIndex) {
1137 if (value == table->types[typeIndex].entries[operandIndex].value) {
1138 *pEntry = &table->types[typeIndex].entries[operandIndex];
1139 return SPV_SUCCESS;
1140 }
1141 }
1142 }
1143 }
1144
1145 return SPV_ERROR_INVALID_LOOKUP;
1146}
1147
Dejan Mircevski50babb22015-09-29 10:56:32 -04001148const char* spvOperandTypeStr(spv_operand_type_t type) {
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001149 switch (type) {
1150 case SPV_OPERAND_TYPE_ID:
David Netofadbf622015-09-14 17:07:11 -04001151 case SPV_OPERAND_TYPE_OPTIONAL_ID:
David Netofadbf622015-09-14 17:07:11 -04001152 return "ID";
David Neto201caf72015-11-04 17:38:17 -05001153 case SPV_OPERAND_TYPE_TYPE_ID:
1154 return "type ID";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001155 case SPV_OPERAND_TYPE_RESULT_ID:
1156 return "result ID";
Lei Zhang6483bd72015-10-14 17:02:39 -04001157 case SPV_OPERAND_TYPE_LITERAL_INTEGER:
David Neto201caf72015-11-04 17:38:17 -05001158 case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_INTEGER:
1159 case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_NUMBER:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001160 return "literal number";
David Neto201caf72015-11-04 17:38:17 -05001161 case SPV_OPERAND_TYPE_OPTIONAL_TYPED_LITERAL_INTEGER:
1162 return "possibly multi-word literal integer";
1163 case SPV_OPERAND_TYPE_TYPED_LITERAL_NUMBER:
1164 return "possibly multi-word literal number";
1165 case SPV_OPERAND_TYPE_EXTENSION_INSTRUCTION_NUMBER:
1166 return "extension instruction number";
David Neto0f166be2015-11-11 01:56:49 -05001167 case SPV_OPERAND_TYPE_SPEC_CONSTANT_OP_NUMBER:
1168 return "OpSpecConstantOp opcode";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001169 case SPV_OPERAND_TYPE_LITERAL_STRING:
David Neto201caf72015-11-04 17:38:17 -05001170 case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_STRING:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001171 return "literal string";
1172 case SPV_OPERAND_TYPE_SOURCE_LANGUAGE:
Dejan Mircevskid2c81cf2015-10-09 11:06:10 -04001173 return "source language";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001174 case SPV_OPERAND_TYPE_EXECUTION_MODEL:
1175 return "execution model";
1176 case SPV_OPERAND_TYPE_ADDRESSING_MODEL:
1177 return "addressing model";
1178 case SPV_OPERAND_TYPE_MEMORY_MODEL:
1179 return "memory model";
1180 case SPV_OPERAND_TYPE_EXECUTION_MODE:
1181 return "execution mode";
1182 case SPV_OPERAND_TYPE_STORAGE_CLASS:
1183 return "storage class";
1184 case SPV_OPERAND_TYPE_DIMENSIONALITY:
1185 return "dimensionality";
1186 case SPV_OPERAND_TYPE_SAMPLER_ADDRESSING_MODE:
David Netod9ad0502015-11-24 18:37:24 -05001187 return "sampler addressing mode";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001188 case SPV_OPERAND_TYPE_SAMPLER_FILTER_MODE:
1189 return "sampler filter mode";
David Netob30a0c52015-09-16 15:56:43 -04001190 case SPV_OPERAND_TYPE_SAMPLER_IMAGE_FORMAT:
Dejan Mircevski971b3442015-10-13 12:54:47 -04001191 return "image format";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001192 case SPV_OPERAND_TYPE_FP_FAST_MATH_MODE:
Dejan Mircevski355cc0c2015-10-13 15:02:03 -04001193 return "floating-point fast math mode";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001194 case SPV_OPERAND_TYPE_FP_ROUNDING_MODE:
Dejan Mircevski355cc0c2015-10-13 15:02:03 -04001195 return "floating-point rounding mode";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001196 case SPV_OPERAND_TYPE_LINKAGE_TYPE:
1197 return "linkage type";
1198 case SPV_OPERAND_TYPE_ACCESS_QUALIFIER:
David Neto2889a0c2016-02-15 13:50:00 -05001199 case SPV_OPERAND_TYPE_OPTIONAL_ACCESS_QUALIFIER:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001200 return "access qualifier";
1201 case SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE:
1202 return "function parameter attribute";
1203 case SPV_OPERAND_TYPE_DECORATION:
1204 return "decoration";
1205 case SPV_OPERAND_TYPE_BUILT_IN:
Dejan Mircevskid7b0f832015-10-13 15:39:38 -04001206 return "built-in";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001207 case SPV_OPERAND_TYPE_SELECTION_CONTROL:
1208 return "selection control";
1209 case SPV_OPERAND_TYPE_LOOP_CONTROL:
1210 return "loop control";
1211 case SPV_OPERAND_TYPE_FUNCTION_CONTROL:
1212 return "function control";
David Neto64a9be92015-11-18 15:48:32 -05001213 case SPV_OPERAND_TYPE_MEMORY_SEMANTICS_ID:
David Netod9ad0502015-11-24 18:37:24 -05001214 return "memory semantics ID";
David Neto201caf72015-11-04 17:38:17 -05001215 case SPV_OPERAND_TYPE_MEMORY_ACCESS:
David Neto78c3b432015-08-27 13:03:52 -04001216 case SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001217 return "memory access";
David Neto64a9be92015-11-18 15:48:32 -05001218 case SPV_OPERAND_TYPE_SCOPE_ID:
David Netod9ad0502015-11-24 18:37:24 -05001219 return "scope ID";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001220 case SPV_OPERAND_TYPE_GROUP_OPERATION:
1221 return "group operation";
1222 case SPV_OPERAND_TYPE_KERNEL_ENQ_FLAGS:
1223 return "kernel enqeue flags";
David Neto47994822015-08-27 13:11:01 -04001224 case SPV_OPERAND_TYPE_KERNEL_PROFILING_INFO:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001225 return "kernel profiling info";
1226 case SPV_OPERAND_TYPE_CAPABILITY:
1227 return "capability";
David Neto201caf72015-11-04 17:38:17 -05001228 case SPV_OPERAND_TYPE_IMAGE:
David Netoee1b3bb2015-09-18 11:19:18 -04001229 case SPV_OPERAND_TYPE_OPTIONAL_IMAGE:
David Netod9ad0502015-11-24 18:37:24 -05001230 return "image";
David Neto201caf72015-11-04 17:38:17 -05001231 case SPV_OPERAND_TYPE_OPTIONAL_CIV:
1232 return "context-insensitive value";
1233
1234 // The next values are for values returned from an instruction, not actually
1235 // an operand. So the specific strings don't matter. But let's add them
1236 // for completeness and ease of testing.
1237 case SPV_OPERAND_TYPE_IMAGE_CHANNEL_ORDER:
1238 return "image channel order";
1239 case SPV_OPERAND_TYPE_IMAGE_CHANNEL_DATA_TYPE:
1240 return "image channel data type";
1241
David Neto78c3b432015-08-27 13:03:52 -04001242 case SPV_OPERAND_TYPE_NONE:
1243 return "NONE";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001244 default:
1245 assert(0 && "Unhandled operand type!");
1246 break;
1247 }
1248 return "unknown";
1249}
David Neto78c3b432015-08-27 13:03:52 -04001250
1251void spvPrependOperandTypes(const spv_operand_type_t* types,
1252 spv_operand_pattern_t* pattern) {
1253 const spv_operand_type_t* endTypes;
Dejan Mircevski50babb22015-09-29 10:56:32 -04001254 for (endTypes = types; *endTypes != SPV_OPERAND_TYPE_NONE; ++endTypes)
David Neto78c3b432015-08-27 13:03:52 -04001255 ;
1256 pattern->insert(pattern->begin(), types, endTypes);
1257}
1258
David Neto5bf88fc2015-09-17 17:06:10 -04001259void spvPrependOperandTypesForMask(const spv_operand_table operandTable,
1260 const spv_operand_type_t type,
1261 const uint32_t mask,
1262 spv_operand_pattern_t* pattern) {
1263 // Scan from highest bits to lowest bits because we will prepend in LIFO
1264 // fashion, and we need the operands for lower order bits to appear first.
1265 for (uint32_t candidate_bit = (1 << 31); candidate_bit; candidate_bit >>= 1) {
1266 if (candidate_bit & mask) {
1267 spv_operand_desc entry = nullptr;
1268 if (SPV_SUCCESS == spvOperandTableValueLookup(operandTable, type,
1269 candidate_bit, &entry)) {
1270 spvPrependOperandTypes(entry->operandTypes, pattern);
1271 }
1272 }
1273 }
1274}
1275
David Netob5267562016-02-02 12:05:34 -05001276bool spvOperandIsConcreteMask(spv_operand_type_t type) {
1277 return SPV_OPERAND_TYPE_FIRST_CONCRETE_MASK_TYPE <= type &&
1278 type <= SPV_OPERAND_TYPE_LAST_CONCRETE_MASK_TYPE;
1279}
1280
David Neto78c3b432015-08-27 13:03:52 -04001281bool spvOperandIsOptional(spv_operand_type_t type) {
David Neto201caf72015-11-04 17:38:17 -05001282 return SPV_OPERAND_TYPE_FIRST_OPTIONAL_TYPE <= type &&
1283 type <= SPV_OPERAND_TYPE_LAST_OPTIONAL_TYPE;
David Neto78c3b432015-08-27 13:03:52 -04001284}
1285
1286bool spvOperandIsVariable(spv_operand_type_t type) {
David Neto201caf72015-11-04 17:38:17 -05001287 return SPV_OPERAND_TYPE_FIRST_VARIABLE_TYPE <= type &&
1288 type <= SPV_OPERAND_TYPE_LAST_VARIABLE_TYPE;
David Neto78c3b432015-08-27 13:03:52 -04001289}
1290
David Neto78c3b432015-08-27 13:03:52 -04001291bool spvExpandOperandSequenceOnce(spv_operand_type_t type,
1292 spv_operand_pattern_t* pattern) {
1293 switch (type) {
1294 case SPV_OPERAND_TYPE_VARIABLE_ID:
1295 pattern->insert(pattern->begin(), {SPV_OPERAND_TYPE_OPTIONAL_ID, type});
1296 return true;
Lei Zhang6483bd72015-10-14 17:02:39 -04001297 case SPV_OPERAND_TYPE_VARIABLE_LITERAL_INTEGER:
David Neto78c3b432015-08-27 13:03:52 -04001298 pattern->insert(pattern->begin(),
Lei Zhang6483bd72015-10-14 17:02:39 -04001299 {SPV_OPERAND_TYPE_OPTIONAL_LITERAL_INTEGER, type});
David Neto78c3b432015-08-27 13:03:52 -04001300 return true;
Lei Zhang6483bd72015-10-14 17:02:39 -04001301 case SPV_OPERAND_TYPE_VARIABLE_LITERAL_INTEGER_ID:
David Neto201caf72015-11-04 17:38:17 -05001302 // Represents Zero or more (Literal number, Id) pairs,
1303 // where the literal number must be a scalar integer.
David Neto78c3b432015-08-27 13:03:52 -04001304 pattern->insert(pattern->begin(),
David Neto201caf72015-11-04 17:38:17 -05001305 {SPV_OPERAND_TYPE_OPTIONAL_TYPED_LITERAL_INTEGER,
1306 SPV_OPERAND_TYPE_ID, type});
David Neto78c3b432015-08-27 13:03:52 -04001307 return true;
Lei Zhang6483bd72015-10-14 17:02:39 -04001308 case SPV_OPERAND_TYPE_VARIABLE_ID_LITERAL_INTEGER:
David Neto561dc4e2015-09-25 14:23:29 -04001309 // Represents Zero or more (Id, Literal number) pairs.
David Neto201caf72015-11-04 17:38:17 -05001310 pattern->insert(pattern->begin(),
1311 {SPV_OPERAND_TYPE_OPTIONAL_ID,
1312 SPV_OPERAND_TYPE_LITERAL_INTEGER, type});
David Neto78c3b432015-08-27 13:03:52 -04001313 return true;
David Neto78c3b432015-08-27 13:03:52 -04001314 default:
1315 break;
1316 }
1317 return false;
1318}
1319
Dejan Mircevski50babb22015-09-29 10:56:32 -04001320spv_operand_type_t spvTakeFirstMatchableOperand(
1321 spv_operand_pattern_t* pattern) {
David Neto78c3b432015-08-27 13:03:52 -04001322 assert(!pattern->empty());
1323 spv_operand_type_t result;
1324 do {
1325 result = pattern->front();
1326 pattern->pop_front();
Dejan Mircevski50babb22015-09-29 10:56:32 -04001327 } while (spvExpandOperandSequenceOnce(result, pattern));
David Neto78c3b432015-08-27 13:03:52 -04001328 return result;
1329}
Dejan Mircevski903f9d62015-09-28 17:04:39 -04001330
Dejan Mircevski897bff92015-09-29 10:38:18 -04001331spv_operand_pattern_t spvAlternatePatternFollowingImmediate(
1332 const spv_operand_pattern_t& pattern) {
1333 spv_operand_pattern_t alternatePattern;
1334 for (const auto& operand : pattern) {
1335 if (operand == SPV_OPERAND_TYPE_RESULT_ID) {
1336 alternatePattern.push_back(operand);
1337 alternatePattern.push_back(SPV_OPERAND_TYPE_OPTIONAL_CIV);
1338 return alternatePattern;
Dejan Mircevski903f9d62015-09-28 17:04:39 -04001339 }
Dejan Mircevski897bff92015-09-29 10:38:18 -04001340 alternatePattern.push_back(SPV_OPERAND_TYPE_OPTIONAL_CIV);
Dejan Mircevski903f9d62015-09-28 17:04:39 -04001341 }
Dejan Mircevski897bff92015-09-29 10:38:18 -04001342 // No result-id found, so just expect CIVs.
1343 return {SPV_OPERAND_TYPE_OPTIONAL_CIV};
Dejan Mircevski903f9d62015-09-28 17:04:39 -04001344}
Dejan Mircevski961f5dc2016-01-15 11:25:11 -05001345
1346bool spvIsIdType(spv_operand_type_t type) {
1347 switch (type) {
1348 case SPV_OPERAND_TYPE_ID:
1349 case SPV_OPERAND_TYPE_TYPE_ID:
1350 case SPV_OPERAND_TYPE_RESULT_ID:
1351 case SPV_OPERAND_TYPE_MEMORY_SEMANTICS_ID:
1352 case SPV_OPERAND_TYPE_SCOPE_ID:
1353 return true;
1354 default:
1355 return false;
1356 }
1357 return false;
1358}