blob: e58cde262db79aab558a48a7674d8c9a4b1cace0 [file] [log] [blame]
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001// Copyright (c) 2015 The Khronos Group Inc.
2//
3// Permission is hereby granted, free of charge, to any person obtaining a
4// copy of this software and/or associated documentation files (the
5// "Materials"), to deal in the Materials without restriction, including
6// without limitation the rights to use, copy, modify, merge, publish,
7// distribute, sublicense, and/or sell copies of the Materials, and to
8// permit persons to whom the Materials are furnished to do so, subject to
9// the following conditions:
10//
11// The above copyright notice and this permission notice shall be included
12// in all copies or substantial portions of the Materials.
13//
14// MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS
15// KHRONOS STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS
16// SPECIFICATIONS AND HEADER INFORMATION ARE LOCATED AT
17// https://www.khronos.org/registry/
18//
19// THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
20// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
22// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
23// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
24// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
25// MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
26
27#include "operand.h"
28
29#include <assert.h>
30#include <string.h>
31
32static const spv_operand_desc_t sourceLanguageEntries[] = {
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 Netod02f68a2015-11-11 12:32:21 -0500179 {"Workgroup",
180 SpvStorageClassWorkgroup,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100181 0,
182 {SPV_OPERAND_TYPE_NONE}},
David Netod02f68a2015-11-11 12:32:21 -0500183 {"CrossWorkgroup",
184 SpvStorageClassCrossWorkgroup,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100185 0,
186 {SPV_OPERAND_TYPE_NONE}},
David Netod02f68a2015-11-11 12:32:21 -0500187 {"Private",
188 SpvStorageClassPrivate,
Lei Zhangb36e7042015-10-28 13:40:52 -0400189 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100190 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang1a0334e2015-11-02 09:41:20 -0500191 {"Function", SpvStorageClassFunction, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100192 {"Generic",
Lei Zhangb36e7042015-10-28 13:40:52 -0400193 SpvStorageClassGeneric,
194 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100195 {SPV_OPERAND_TYPE_NONE}},
David Neto9819adf2015-09-23 10:19:57 -0400196 {"PushConstant",
Lei Zhangb36e7042015-10-28 13:40:52 -0400197 SpvStorageClassPushConstant,
198 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
David Neto9819adf2015-09-23 10:19:57 -0400199 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100200 {"AtomicCounter",
Lei Zhangb36e7042015-10-28 13:40:52 -0400201 SpvStorageClassAtomicCounter,
202 SPV_CAPABILITY_AS_MASK(SpvCapabilityAtomicStorage),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100203 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang1a0334e2015-11-02 09:41:20 -0500204 {"Image", SpvStorageClassImage, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100205};
206
207static const spv_operand_desc_t dimensionalityEntries[] = {
David Netoddda85a2015-10-02 17:10:10 -0400208 {"1D",
Lei Zhangb36e7042015-10-28 13:40:52 -0400209 SpvDim1D,
210 SPV_CAPABILITY_AS_MASK(SpvCapabilitySampled1D),
David Netoddda85a2015-10-02 17:10:10 -0400211 {SPV_OPERAND_TYPE_NONE}},
Lei Zhangb36e7042015-10-28 13:40:52 -0400212 {"2D", SpvDim2D, 0, {SPV_OPERAND_TYPE_NONE}},
213 {"3D", SpvDim3D, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100214 {"Cube",
Lei Zhangb36e7042015-10-28 13:40:52 -0400215 SpvDimCube,
216 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100217 {SPV_OPERAND_TYPE_NONE}},
218 {"Rect",
Lei Zhangb36e7042015-10-28 13:40:52 -0400219 SpvDimRect,
220 SPV_CAPABILITY_AS_MASK(SpvCapabilitySampledRect),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100221 {SPV_OPERAND_TYPE_NONE}},
David Netoddda85a2015-10-02 17:10:10 -0400222 {"Buffer",
Lei Zhangb36e7042015-10-28 13:40:52 -0400223 SpvDimBuffer,
224 SPV_CAPABILITY_AS_MASK(SpvCapabilitySampledBuffer),
David Netoddda85a2015-10-02 17:10:10 -0400225 {SPV_OPERAND_TYPE_NONE}},
David Netod02f68a2015-11-11 12:32:21 -0500226 {"SubpassData",
227 SpvDimSubpassData,
228 SPV_CAPABILITY_AS_MASK(SpvCapabilityInputAttachment),
David Netoaa0c3a52015-09-23 10:30:06 -0400229 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100230};
231
232static const spv_operand_desc_t samplerAddressingModeEntries[] = {
233 {"None",
Lei Zhangb36e7042015-10-28 13:40:52 -0400234 SpvSamplerAddressingModeNone,
235 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100236 {SPV_OPERAND_TYPE_NONE}},
237 {"ClampToEdge",
Lei Zhangb36e7042015-10-28 13:40:52 -0400238 SpvSamplerAddressingModeClampToEdge,
239 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100240 {SPV_OPERAND_TYPE_NONE}},
241 {"Clamp",
Lei Zhangb36e7042015-10-28 13:40:52 -0400242 SpvSamplerAddressingModeClamp,
243 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100244 {SPV_OPERAND_TYPE_NONE}},
245 {"Repeat",
Lei Zhangb36e7042015-10-28 13:40:52 -0400246 SpvSamplerAddressingModeRepeat,
247 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100248 {SPV_OPERAND_TYPE_NONE}},
249 {"RepeatMirrored",
Lei Zhangb36e7042015-10-28 13:40:52 -0400250 SpvSamplerAddressingModeRepeatMirrored,
251 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100252 {SPV_OPERAND_TYPE_NONE}},
253};
254
255static const spv_operand_desc_t samplerFilterModeEntries[] = {
256 {"Nearest",
Lei Zhangb36e7042015-10-28 13:40:52 -0400257 SpvSamplerFilterModeNearest,
258 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100259 {SPV_OPERAND_TYPE_NONE}},
260 {"Linear",
Lei Zhangb36e7042015-10-28 13:40:52 -0400261 SpvSamplerFilterModeLinear,
262 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100263 {SPV_OPERAND_TYPE_NONE}},
264};
265
David Netob30a0c52015-09-16 15:56:43 -0400266static const spv_operand_desc_t samplerImageFormatEntries[] = {
Lei Zhangb36e7042015-10-28 13:40:52 -0400267#define CASE0(NAME) \
268 { \
269 #NAME, SpvImageFormat##NAME, 0, { SPV_OPERAND_TYPE_NONE } \
David Netoddda85a2015-10-02 17:10:10 -0400270 }
Lei Zhangb36e7042015-10-28 13:40:52 -0400271#define CASE(NAME, CAP) \
272 { \
273 #NAME, SpvImageFormat##NAME, SPV_CAPABILITY_AS_MASK(SpvCapability##CAP), { \
274 SPV_OPERAND_TYPE_NONE \
275 } \
David Netob30a0c52015-09-16 15:56:43 -0400276 }
Dejan Mircevski50babb22015-09-29 10:56:32 -0400277 // clang-format off
David Netoddda85a2015-10-02 17:10:10 -0400278 CASE0(Unknown),
279 CASE(Rgba32f, Shader),
280 CASE(Rgba16f, Shader),
281 CASE(R32f, Shader),
282 CASE(Rgba8, Shader),
283 CASE(Rgba8Snorm, Shader),
David Netod02f68a2015-11-11 12:32:21 -0500284 CASE(Rg32f, StorageImageExtendedFormats),
285 CASE(Rg16f, StorageImageExtendedFormats),
286 CASE(R11fG11fB10f, StorageImageExtendedFormats),
287 CASE(R16f, StorageImageExtendedFormats),
288 CASE(Rgba16, StorageImageExtendedFormats),
289 CASE(Rgb10A2, StorageImageExtendedFormats),
290 CASE(Rg16, StorageImageExtendedFormats),
291 CASE(Rg8, StorageImageExtendedFormats),
292 CASE(R16, StorageImageExtendedFormats),
293 CASE(R8, StorageImageExtendedFormats),
294 CASE(Rgba16Snorm, StorageImageExtendedFormats),
295 CASE(Rg16Snorm, StorageImageExtendedFormats),
296 CASE(Rg8Snorm, StorageImageExtendedFormats),
297 CASE(R16Snorm, StorageImageExtendedFormats),
298 CASE(R8Snorm, StorageImageExtendedFormats),
David Netoddda85a2015-10-02 17:10:10 -0400299 CASE(Rgba32i, Shader),
300 CASE(Rgba16i, Shader),
301 CASE(Rgba8i, Shader),
302 CASE(R32i, Shader),
David Netod02f68a2015-11-11 12:32:21 -0500303 CASE(Rg32i, StorageImageExtendedFormats),
304 CASE(Rg16i, StorageImageExtendedFormats),
305 CASE(Rg8i, StorageImageExtendedFormats),
306 CASE(R16i, StorageImageExtendedFormats),
307 CASE(R8i, StorageImageExtendedFormats),
David Netoddda85a2015-10-02 17:10:10 -0400308 CASE(Rgba32ui, Shader),
309 CASE(Rgba16ui, Shader),
310 CASE(Rgba8ui, Shader),
311 CASE(R32ui, Shader),
David Netod02f68a2015-11-11 12:32:21 -0500312 CASE(Rgb10a2ui, StorageImageExtendedFormats),
313 CASE(Rg32ui, StorageImageExtendedFormats),
314 CASE(Rg16ui, StorageImageExtendedFormats),
315 CASE(Rg8ui, StorageImageExtendedFormats),
316 CASE(R16ui, StorageImageExtendedFormats),
317 CASE(R8ui, StorageImageExtendedFormats),
Dejan Mircevski50babb22015-09-29 10:56:32 -0400318// clang-format on
David Netob30a0c52015-09-16 15:56:43 -0400319#undef CASE
320};
321
David Netoddda85a2015-10-02 17:10:10 -0400322// All image channel orders depend on the Kernel capability.
Lei Zhang1a0334e2015-11-02 09:41:20 -0500323#define CASE(NAME) \
324 { \
325 #NAME, SpvImageChannelOrder##NAME, \
326 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel), { \
327 SPV_OPERAND_TYPE_NONE \
328 } \
David Netoddda85a2015-10-02 17:10:10 -0400329 }
330static const spv_operand_desc_t imageChannelOrderEntries[] = {
Lei Zhang1a0334e2015-11-02 09:41:20 -0500331 CASE(R), CASE(A), CASE(RG), CASE(RA), CASE(RGB),
332 CASE(RGBA), CASE(BGRA), CASE(ARGB), CASE(Intensity), CASE(Luminance),
333 CASE(Rx), CASE(RGx), CASE(RGBx), CASE(Depth), CASE(DepthStencil),
334 CASE(sRGB), CASE(sRGBx), CASE(sRGBA), CASE(sBGRA),
David Netoddda85a2015-10-02 17:10:10 -0400335};
336#undef CASE
337
338// All image channel data types depend on the Kernel capability.
Lei Zhangb36e7042015-10-28 13:40:52 -0400339#define CASE(NAME) \
340 { \
341 #NAME, SpvImageChannelDataType##NAME, \
342 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel), { \
343 SPV_OPERAND_TYPE_NONE \
344 } \
David Netoddda85a2015-10-02 17:10:10 -0400345 }
346static const spv_operand_desc_t imageChannelDataTypeEntries[] = {
David Netod02f68a2015-11-11 12:32:21 -0500347 CASE(SnormInt8), CASE(SnormInt16), CASE(UnormInt8),
348 CASE(UnormInt16), CASE(UnormShort565), CASE(UnormShort555),
349 CASE(UnormInt101010), CASE(SignedInt8), CASE(SignedInt16),
350 CASE(SignedInt32), CASE(UnsignedInt8), CASE(UnsignedInt16),
351 CASE(UnsignedInt32), CASE(HalfFloat), CASE(Float),
352 CASE(UnormInt24), CASE(UnormInt101010_2),
David Netoddda85a2015-10-02 17:10:10 -0400353};
354#undef CASE
355
David Netoee1b3bb2015-09-18 11:19:18 -0400356// Image operand definitions. Each enum value is a mask. When that mask
357// bit is set, the instruction should have further ID operands.
358// Some mask values depend on a capability.
359static const spv_operand_desc_t imageOperandEntries[] = {
360// Rev32 and later adds many more enums.
Lei Zhang1a0334e2015-11-02 09:41:20 -0500361#define CASE(NAME) #NAME, SpvImageOperands##NAME##Mask, 0
362#define CASE_CAP(NAME, CAP) #NAME, SpvImageOperands##NAME##Mask, CAP
David Netoee1b3bb2015-09-18 11:19:18 -0400363#define ID SPV_OPERAND_TYPE_ID
364#define NONE SPV_OPERAND_TYPE_NONE
Lei Zhangb36e7042015-10-28 13:40:52 -0400365 {"None", SpvImageOperandsMaskNone, 0, {NONE}},
366 {CASE_CAP(Bias, SPV_CAPABILITY_AS_MASK(SpvCapabilityShader)), {ID, NONE}},
David Netoee1b3bb2015-09-18 11:19:18 -0400367 {CASE(Lod), {ID, NONE}},
368 {CASE(Grad), {ID, ID, NONE}},
369 {CASE(ConstOffset), {ID, NONE}},
Lei Zhangb36e7042015-10-28 13:40:52 -0400370 {CASE_CAP(Offset, SPV_CAPABILITY_AS_MASK(SpvCapabilityImageGatherExtended)),
Dejan Mircevski205408b2015-09-30 16:42:34 -0400371 {ID, NONE}},
David Netoee1b3bb2015-09-18 11:19:18 -0400372 {CASE(ConstOffsets), {ID, NONE}},
373 {CASE(Sample), {ID, NONE}},
Lei Zhangb36e7042015-10-28 13:40:52 -0400374 {CASE_CAP(MinLod, SPV_CAPABILITY_AS_MASK(SpvCapabilityMinLod)), {ID, NONE}},
David Netoee1b3bb2015-09-18 11:19:18 -0400375#undef CASE
376#undef CASE_CAP
377#undef ID
378#undef NONE
379};
380
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100381static const spv_operand_desc_t fpFastMathModeEntries[] = {
Lei Zhang1a0334e2015-11-02 09:41:20 -0500382 {"None", SpvFPFastMathModeMaskNone, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100383 {"NotNaN",
Lei Zhangb36e7042015-10-28 13:40:52 -0400384 SpvFPFastMathModeNotNaNMask,
385 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100386 {SPV_OPERAND_TYPE_NONE}},
387 {"NotInf",
Lei Zhangb36e7042015-10-28 13:40:52 -0400388 SpvFPFastMathModeNotInfMask,
389 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100390 {SPV_OPERAND_TYPE_NONE}},
391 {"NSZ",
Lei Zhangb36e7042015-10-28 13:40:52 -0400392 SpvFPFastMathModeNSZMask,
393 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100394 {SPV_OPERAND_TYPE_NONE}},
395 {"AllowRecip",
Lei Zhangb36e7042015-10-28 13:40:52 -0400396 SpvFPFastMathModeAllowRecipMask,
397 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100398 {SPV_OPERAND_TYPE_NONE}},
399 {"Fast",
Lei Zhangb36e7042015-10-28 13:40:52 -0400400 SpvFPFastMathModeFastMask,
401 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100402 {SPV_OPERAND_TYPE_NONE}},
403};
404
405static const spv_operand_desc_t fpRoundingModeEntries[] = {
406 {"RTE",
Lei Zhangb36e7042015-10-28 13:40:52 -0400407 SpvFPRoundingModeRTE,
408 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100409 {SPV_OPERAND_TYPE_NONE}},
410 {"RTZ",
Lei Zhangb36e7042015-10-28 13:40:52 -0400411 SpvFPRoundingModeRTZ,
412 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100413 {SPV_OPERAND_TYPE_NONE}},
414 {"RTP",
Lei Zhangb36e7042015-10-28 13:40:52 -0400415 SpvFPRoundingModeRTP,
416 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100417 {SPV_OPERAND_TYPE_NONE}},
418 {"RTN",
Lei Zhangb36e7042015-10-28 13:40:52 -0400419 SpvFPRoundingModeRTN,
420 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100421 {SPV_OPERAND_TYPE_NONE}},
422};
423
424static const spv_operand_desc_t linkageTypeEntries[] = {
425 {"Export",
Lei Zhangb36e7042015-10-28 13:40:52 -0400426 SpvLinkageTypeExport,
427 SPV_CAPABILITY_AS_MASK(SpvCapabilityLinkage),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100428 {SPV_OPERAND_TYPE_NONE}},
429 {"Import",
Lei Zhangb36e7042015-10-28 13:40:52 -0400430 SpvLinkageTypeImport,
431 SPV_CAPABILITY_AS_MASK(SpvCapabilityLinkage),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100432 {SPV_OPERAND_TYPE_NONE}},
433};
434
435static const spv_operand_desc_t accessQualifierEntries[] = {
436 {"ReadOnly",
Lei Zhangb36e7042015-10-28 13:40:52 -0400437 SpvAccessQualifierReadOnly,
438 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100439 {SPV_OPERAND_TYPE_NONE}},
440 {"WriteOnly",
Lei Zhangb36e7042015-10-28 13:40:52 -0400441 SpvAccessQualifierWriteOnly,
442 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100443 {SPV_OPERAND_TYPE_NONE}},
444 {"ReadWrite",
Lei Zhangb36e7042015-10-28 13:40:52 -0400445 SpvAccessQualifierReadWrite,
446 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100447 {SPV_OPERAND_TYPE_NONE}},
448};
449
450static const spv_operand_desc_t functionParameterAttributeEntries[] = {
451 {"Zext",
Lei Zhangb36e7042015-10-28 13:40:52 -0400452 SpvFunctionParameterAttributeZext,
453 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100454 {SPV_OPERAND_TYPE_NONE}},
455 {"Sext",
Lei Zhangb36e7042015-10-28 13:40:52 -0400456 SpvFunctionParameterAttributeSext,
457 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100458 {SPV_OPERAND_TYPE_NONE}},
459 {"ByVal",
Lei Zhangb36e7042015-10-28 13:40:52 -0400460 SpvFunctionParameterAttributeByVal,
461 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100462 {SPV_OPERAND_TYPE_NONE}},
463 {"Sret",
Lei Zhangb36e7042015-10-28 13:40:52 -0400464 SpvFunctionParameterAttributeSret,
465 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100466 {SPV_OPERAND_TYPE_NONE}},
467 {"NoAlias",
Lei Zhangb36e7042015-10-28 13:40:52 -0400468 SpvFunctionParameterAttributeNoAlias,
469 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100470 {SPV_OPERAND_TYPE_NONE}},
David Neto37547b22015-09-10 13:23:11 -0400471 {"NoCapture",
Lei Zhangb36e7042015-10-28 13:40:52 -0400472 SpvFunctionParameterAttributeNoCapture,
473 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100474 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100475 {"NoWrite",
Lei Zhangb36e7042015-10-28 13:40:52 -0400476 SpvFunctionParameterAttributeNoWrite,
477 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100478 {SPV_OPERAND_TYPE_NONE}},
479 {"NoReadWrite",
Lei Zhangb36e7042015-10-28 13:40:52 -0400480 SpvFunctionParameterAttributeNoReadWrite,
481 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100482 {SPV_OPERAND_TYPE_NONE}},
483};
484
485static const spv_operand_desc_t decorationEntries[] = {
Lei Zhang604e5ce2015-08-14 14:46:43 -0400486 {"RelaxedPrecision",
Lei Zhangb36e7042015-10-28 13:40:52 -0400487 SpvDecorationRelaxedPrecision,
488 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100489 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400490 {
Dejan Mircevski50babb22015-09-29 10:56:32 -0400491 "SpecId",
Lei Zhangb36e7042015-10-28 13:40:52 -0400492 SpvDecorationSpecId,
493 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Lei Zhang6483bd72015-10-14 17:02:39 -0400494 {SPV_OPERAND_TYPE_LITERAL_INTEGER},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400495 },
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100496 {"Block",
Lei Zhangb36e7042015-10-28 13:40:52 -0400497 SpvDecorationBlock,
498 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100499 {SPV_OPERAND_TYPE_NONE}},
500 {"BufferBlock",
Lei Zhangb36e7042015-10-28 13:40:52 -0400501 SpvDecorationBufferBlock,
502 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100503 {SPV_OPERAND_TYPE_NONE}},
504 {"RowMajor",
Lei Zhangb36e7042015-10-28 13:40:52 -0400505 SpvDecorationRowMajor,
506 SPV_CAPABILITY_AS_MASK(SpvCapabilityMatrix),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100507 {SPV_OPERAND_TYPE_NONE}},
508 {"ColMajor",
Lei Zhangb36e7042015-10-28 13:40:52 -0400509 SpvDecorationColMajor,
510 SPV_CAPABILITY_AS_MASK(SpvCapabilityMatrix),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100511 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400512 {"ArrayStride",
Lei Zhangb36e7042015-10-28 13:40:52 -0400513 SpvDecorationArrayStride,
514 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Lei Zhang6483bd72015-10-14 17:02:39 -0400515 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400516 {"MatrixStride",
Lei Zhangb36e7042015-10-28 13:40:52 -0400517 SpvDecorationMatrixStride,
518 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Lei Zhang6483bd72015-10-14 17:02:39 -0400519 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100520 {"GLSLShared",
Lei Zhangb36e7042015-10-28 13:40:52 -0400521 SpvDecorationGLSLShared,
522 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100523 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100524 {"GLSLPacked",
Lei Zhangb36e7042015-10-28 13:40:52 -0400525 SpvDecorationGLSLPacked,
526 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100527 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400528 {"CPacked",
Lei Zhangb36e7042015-10-28 13:40:52 -0400529 SpvDecorationCPacked,
530 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Lei Zhang604e5ce2015-08-14 14:46:43 -0400531 {SPV_OPERAND_TYPE_NONE}},
532 {"BuiltIn",
Lei Zhangb36e7042015-10-28 13:40:52 -0400533 SpvDecorationBuiltIn,
534 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Lei Zhang604e5ce2015-08-14 14:46:43 -0400535 {SPV_OPERAND_TYPE_BUILT_IN, SPV_OPERAND_TYPE_NONE}},
David Netodbaf4072015-09-22 16:23:06 -0400536 {"NoPerspective",
Lei Zhangb36e7042015-10-28 13:40:52 -0400537 SpvDecorationNoPerspective,
538 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100539 {SPV_OPERAND_TYPE_NONE}},
540 {"Flat",
Lei Zhangb36e7042015-10-28 13:40:52 -0400541 SpvDecorationFlat,
542 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100543 {SPV_OPERAND_TYPE_NONE}},
544 {"Patch",
Lei Zhangb36e7042015-10-28 13:40:52 -0400545 SpvDecorationPatch,
546 SPV_CAPABILITY_AS_MASK(SpvCapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100547 {SPV_OPERAND_TYPE_NONE}},
548 {"Centroid",
Lei Zhangb36e7042015-10-28 13:40:52 -0400549 SpvDecorationCentroid,
550 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100551 {SPV_OPERAND_TYPE_NONE}},
552 {"Sample",
Lei Zhangb36e7042015-10-28 13:40:52 -0400553 SpvDecorationSample,
554 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100555 {SPV_OPERAND_TYPE_NONE}},
556 {"Invariant",
Lei Zhangb36e7042015-10-28 13:40:52 -0400557 SpvDecorationInvariant,
558 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100559 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang1a0334e2015-11-02 09:41:20 -0500560 {"Restrict", SpvDecorationRestrict, 0, {SPV_OPERAND_TYPE_NONE}},
561 {"Aliased", SpvDecorationAliased, 0, {SPV_OPERAND_TYPE_NONE}},
562 {"Volatile", SpvDecorationVolatile, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100563 {"Constant",
Lei Zhangb36e7042015-10-28 13:40:52 -0400564 SpvDecorationConstant,
565 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100566 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang1a0334e2015-11-02 09:41:20 -0500567 {"Coherent", SpvDecorationCoherent, 0, {SPV_OPERAND_TYPE_NONE}},
568 {"NonWritable", SpvDecorationNonWritable, 0, {SPV_OPERAND_TYPE_NONE}},
569 {"NonReadable", SpvDecorationNonReadable, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100570 {"Uniform",
Lei Zhangb36e7042015-10-28 13:40:52 -0400571 SpvDecorationUniform,
572 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100573 {SPV_OPERAND_TYPE_NONE}},
David Neto37547b22015-09-10 13:23:11 -0400574 {"SaturatedConversion",
Lei Zhangb36e7042015-10-28 13:40:52 -0400575 SpvDecorationSaturatedConversion,
576 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100577 {SPV_OPERAND_TYPE_NONE}},
578 {"Stream",
Lei Zhangb36e7042015-10-28 13:40:52 -0400579 SpvDecorationStream,
David Neto12511c82015-11-12 15:30:28 -0500580 SPV_CAPABILITY_AS_MASK(SpvCapabilityGeometryStreams),
Lei Zhang6483bd72015-10-14 17:02:39 -0400581 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100582 {"Location",
Lei Zhangb36e7042015-10-28 13:40:52 -0400583 SpvDecorationLocation,
584 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Lei Zhang6483bd72015-10-14 17:02:39 -0400585 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100586 {"Component",
Lei Zhangb36e7042015-10-28 13:40:52 -0400587 SpvDecorationComponent,
588 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Lei Zhang6483bd72015-10-14 17:02:39 -0400589 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100590 {"Index",
Lei Zhangb36e7042015-10-28 13:40:52 -0400591 SpvDecorationIndex,
592 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Lei Zhang6483bd72015-10-14 17:02:39 -0400593 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100594 {"Binding",
Lei Zhangb36e7042015-10-28 13:40:52 -0400595 SpvDecorationBinding,
596 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Lei Zhang6483bd72015-10-14 17:02:39 -0400597 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100598 {"DescriptorSet",
Lei Zhangb36e7042015-10-28 13:40:52 -0400599 SpvDecorationDescriptorSet,
600 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Lei Zhang6483bd72015-10-14 17:02:39 -0400601 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100602 {"Offset",
Lei Zhangb36e7042015-10-28 13:40:52 -0400603 SpvDecorationOffset,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100604 0,
Lei Zhang6483bd72015-10-14 17:02:39 -0400605 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100606 {"XfbBuffer",
Lei Zhangb36e7042015-10-28 13:40:52 -0400607 SpvDecorationXfbBuffer,
608 SPV_CAPABILITY_AS_MASK(SpvCapabilityTransformFeedback),
Lei Zhang6483bd72015-10-14 17:02:39 -0400609 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400610 {"XfbStride",
Lei Zhangb36e7042015-10-28 13:40:52 -0400611 SpvDecorationXfbStride,
612 SPV_CAPABILITY_AS_MASK(SpvCapabilityTransformFeedback),
Lei Zhang6483bd72015-10-14 17:02:39 -0400613 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100614 {"FuncParamAttr",
Lei Zhangb36e7042015-10-28 13:40:52 -0400615 SpvDecorationFuncParamAttr,
616 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100617 {SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE, SPV_OPERAND_TYPE_NONE}},
618 {"FPRoundingMode",
Lei Zhangb36e7042015-10-28 13:40:52 -0400619 SpvDecorationFPRoundingMode,
620 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100621 {SPV_OPERAND_TYPE_FP_ROUNDING_MODE, SPV_OPERAND_TYPE_NONE}},
622 {"FPFastMathMode",
Lei Zhangb36e7042015-10-28 13:40:52 -0400623 SpvDecorationFPFastMathMode,
624 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100625 {SPV_OPERAND_TYPE_FP_FAST_MATH_MODE, SPV_OPERAND_TYPE_NONE}},
626 {"LinkageAttributes",
Lei Zhangb36e7042015-10-28 13:40:52 -0400627 SpvDecorationLinkageAttributes,
628 SPV_CAPABILITY_AS_MASK(SpvCapabilityLinkage),
Dejan Mircevski50babb22015-09-29 10:56:32 -0400629 {SPV_OPERAND_TYPE_LITERAL_STRING, SPV_OPERAND_TYPE_LINKAGE_TYPE,
630 SPV_OPERAND_TYPE_NONE}},
David Netod7687982015-09-23 14:59:27 -0400631 {"NoContraction",
Lei Zhangb36e7042015-10-28 13:40:52 -0400632 SpvDecorationNoContraction,
633 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
David Netod7687982015-09-23 14:59:27 -0400634 {SPV_OPERAND_TYPE_NONE}},
David Netod02f68a2015-11-11 12:32:21 -0500635 {"InputAttachmentIndex",
636 SpvDecorationInputAttachmentIndex,
637 SPV_CAPABILITY_AS_MASK(SpvCapabilityInputAttachment),
638 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
David Netod7687982015-09-23 14:59:27 -0400639 {"Alignment",
Lei Zhangb36e7042015-10-28 13:40:52 -0400640 SpvDecorationAlignment,
641 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Lei Zhang6483bd72015-10-14 17:02:39 -0400642 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100643};
644
645static const spv_operand_desc_t builtInEntries[] = {
646 {"Position",
Lei Zhangb36e7042015-10-28 13:40:52 -0400647 SpvBuiltInPosition,
648 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100649 {SPV_OPERAND_TYPE_NONE}},
650 {"PointSize",
Lei Zhangb36e7042015-10-28 13:40:52 -0400651 SpvBuiltInPointSize,
652 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100653 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100654 {"ClipDistance",
Lei Zhangb36e7042015-10-28 13:40:52 -0400655 SpvBuiltInClipDistance,
656 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100657 {SPV_OPERAND_TYPE_NONE}},
658 {"CullDistance",
Lei Zhangb36e7042015-10-28 13:40:52 -0400659 SpvBuiltInCullDistance,
660 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100661 {SPV_OPERAND_TYPE_NONE}},
662 {"VertexId",
Lei Zhangb36e7042015-10-28 13:40:52 -0400663 SpvBuiltInVertexId,
664 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100665 {SPV_OPERAND_TYPE_NONE}},
666 {"InstanceId",
Lei Zhangb36e7042015-10-28 13:40:52 -0400667 SpvBuiltInInstanceId,
668 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100669 {SPV_OPERAND_TYPE_NONE}},
670 {"PrimitiveId",
Lei Zhangb36e7042015-10-28 13:40:52 -0400671 SpvBuiltInPrimitiveId,
672 SPV_CAPABILITY_AS_MASK(SpvCapabilityGeometry) |
673 SPV_CAPABILITY_AS_MASK(SpvCapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100674 {SPV_OPERAND_TYPE_NONE}},
675 {"InvocationId",
Lei Zhangb36e7042015-10-28 13:40:52 -0400676 SpvBuiltInInvocationId,
677 SPV_CAPABILITY_AS_MASK(SpvCapabilityGeometry) |
678 SPV_CAPABILITY_AS_MASK(SpvCapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100679 {SPV_OPERAND_TYPE_NONE}},
680 {"Layer",
Lei Zhangb36e7042015-10-28 13:40:52 -0400681 SpvBuiltInLayer,
682 SPV_CAPABILITY_AS_MASK(SpvCapabilityGeometry),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100683 {SPV_OPERAND_TYPE_NONE}},
684 {"ViewportIndex",
Lei Zhangb36e7042015-10-28 13:40:52 -0400685 SpvBuiltInViewportIndex,
686 SPV_CAPABILITY_AS_MASK(SpvCapabilityGeometry),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100687 {SPV_OPERAND_TYPE_NONE}},
688 {"TessLevelOuter",
Lei Zhangb36e7042015-10-28 13:40:52 -0400689 SpvBuiltInTessLevelOuter,
690 SPV_CAPABILITY_AS_MASK(SpvCapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100691 {SPV_OPERAND_TYPE_NONE}},
692 {"TessLevelInner",
Lei Zhangb36e7042015-10-28 13:40:52 -0400693 SpvBuiltInTessLevelInner,
694 SPV_CAPABILITY_AS_MASK(SpvCapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100695 {SPV_OPERAND_TYPE_NONE}},
696 {"TessCoord",
Lei Zhangb36e7042015-10-28 13:40:52 -0400697 SpvBuiltInTessCoord,
698 SPV_CAPABILITY_AS_MASK(SpvCapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100699 {SPV_OPERAND_TYPE_NONE}},
700 {"PatchVertices",
Lei Zhangb36e7042015-10-28 13:40:52 -0400701 SpvBuiltInPatchVertices,
702 SPV_CAPABILITY_AS_MASK(SpvCapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100703 {SPV_OPERAND_TYPE_NONE}},
704 {"FragCoord",
Lei Zhangb36e7042015-10-28 13:40:52 -0400705 SpvBuiltInFragCoord,
706 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100707 {SPV_OPERAND_TYPE_NONE}},
708 {"PointCoord",
Lei Zhangb36e7042015-10-28 13:40:52 -0400709 SpvBuiltInPointCoord,
710 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100711 {SPV_OPERAND_TYPE_NONE}},
712 {"FrontFacing",
Lei Zhangb36e7042015-10-28 13:40:52 -0400713 SpvBuiltInFrontFacing,
714 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100715 {SPV_OPERAND_TYPE_NONE}},
716 {"SampleId",
Lei Zhangb36e7042015-10-28 13:40:52 -0400717 SpvBuiltInSampleId,
718 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100719 {SPV_OPERAND_TYPE_NONE}},
720 {"SamplePosition",
Lei Zhangb36e7042015-10-28 13:40:52 -0400721 SpvBuiltInSamplePosition,
722 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100723 {SPV_OPERAND_TYPE_NONE}},
724 {"SampleMask",
Lei Zhangb36e7042015-10-28 13:40:52 -0400725 SpvBuiltInSampleMask,
726 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100727 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100728 {"FragDepth",
Lei Zhangb36e7042015-10-28 13:40:52 -0400729 SpvBuiltInFragDepth,
730 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100731 {SPV_OPERAND_TYPE_NONE}},
732 {"HelperInvocation",
Lei Zhangb36e7042015-10-28 13:40:52 -0400733 SpvBuiltInHelperInvocation,
734 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100735 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang1a0334e2015-11-02 09:41:20 -0500736 {"NumWorkgroups", SpvBuiltInNumWorkgroups, 0, {SPV_OPERAND_TYPE_NONE}},
737 {"WorkgroupSize", SpvBuiltInWorkgroupSize, 0, {SPV_OPERAND_TYPE_NONE}},
738 {"WorkgroupId", SpvBuiltInWorkgroupId, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100739 {"LocalInvocationId",
Lei Zhangb36e7042015-10-28 13:40:52 -0400740 SpvBuiltInLocalInvocationId,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100741 0,
742 {SPV_OPERAND_TYPE_NONE}},
743 {"GlobalInvocationId",
Lei Zhangb36e7042015-10-28 13:40:52 -0400744 SpvBuiltInGlobalInvocationId,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100745 0,
746 {SPV_OPERAND_TYPE_NONE}},
747 {"LocalInvocationIndex",
Lei Zhangb36e7042015-10-28 13:40:52 -0400748 SpvBuiltInLocalInvocationIndex,
749 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100750 {SPV_OPERAND_TYPE_NONE}},
751 {"WorkDim",
Lei Zhangb36e7042015-10-28 13:40:52 -0400752 SpvBuiltInWorkDim,
753 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100754 {SPV_OPERAND_TYPE_NONE}},
755 {"GlobalSize",
Lei Zhangb36e7042015-10-28 13:40:52 -0400756 SpvBuiltInGlobalSize,
757 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100758 {SPV_OPERAND_TYPE_NONE}},
759 {"EnqueuedWorkgroupSize",
Lei Zhangb36e7042015-10-28 13:40:52 -0400760 SpvBuiltInEnqueuedWorkgroupSize,
761 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100762 {SPV_OPERAND_TYPE_NONE}},
763 {"GlobalOffset",
Lei Zhangb36e7042015-10-28 13:40:52 -0400764 SpvBuiltInGlobalOffset,
765 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100766 {SPV_OPERAND_TYPE_NONE}},
767 {"GlobalLinearId",
Lei Zhangb36e7042015-10-28 13:40:52 -0400768 SpvBuiltInGlobalLinearId,
769 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100770 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100771 {"SubgroupSize",
Lei Zhangb36e7042015-10-28 13:40:52 -0400772 SpvBuiltInSubgroupSize,
773 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100774 {SPV_OPERAND_TYPE_NONE}},
775 {"SubgroupMaxSize",
Lei Zhangb36e7042015-10-28 13:40:52 -0400776 SpvBuiltInSubgroupMaxSize,
777 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100778 {SPV_OPERAND_TYPE_NONE}},
779 {"NumSubgroups",
Lei Zhangb36e7042015-10-28 13:40:52 -0400780 SpvBuiltInNumSubgroups,
781 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100782 {SPV_OPERAND_TYPE_NONE}},
783 {"NumEnqueuedSubgroups",
Lei Zhangb36e7042015-10-28 13:40:52 -0400784 SpvBuiltInNumEnqueuedSubgroups,
785 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100786 {SPV_OPERAND_TYPE_NONE}},
787 {"SubgroupId",
Lei Zhangb36e7042015-10-28 13:40:52 -0400788 SpvBuiltInSubgroupId,
789 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100790 {SPV_OPERAND_TYPE_NONE}},
791 {"SubgroupLocalInvocationId",
Lei Zhangb36e7042015-10-28 13:40:52 -0400792 SpvBuiltInSubgroupLocalInvocationId,
793 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100794 {SPV_OPERAND_TYPE_NONE}},
David Neto2d1b5e52015-09-23 15:35:27 -0400795 {"VertexIndex",
Lei Zhangb36e7042015-10-28 13:40:52 -0400796 SpvBuiltInVertexIndex,
797 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
David Neto2d1b5e52015-09-23 15:35:27 -0400798 {SPV_OPERAND_TYPE_NONE}},
799 {"InstanceIndex",
Lei Zhangb36e7042015-10-28 13:40:52 -0400800 SpvBuiltInInstanceIndex,
801 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
David Neto2d1b5e52015-09-23 15:35:27 -0400802 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100803};
804
805static const spv_operand_desc_t selectionControlEntries[] = {
Lei Zhang1a0334e2015-11-02 09:41:20 -0500806 {"None", SpvSelectionControlMaskNone, 0, {SPV_OPERAND_TYPE_NONE}},
807 {"Flatten", SpvSelectionControlFlattenMask, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100808 {"DontFlatten",
Lei Zhangb36e7042015-10-28 13:40:52 -0400809 SpvSelectionControlDontFlattenMask,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100810 0,
811 {SPV_OPERAND_TYPE_NONE}},
812};
813
814static const spv_operand_desc_t loopControlEntries[] = {
Lei Zhang1a0334e2015-11-02 09:41:20 -0500815 {"None", SpvLoopControlMaskNone, 0, {SPV_OPERAND_TYPE_NONE}},
816 {"Unroll", SpvLoopControlUnrollMask, 0, {SPV_OPERAND_TYPE_NONE}},
817 {"DontUnroll", SpvLoopControlDontUnrollMask, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100818};
819
820static const spv_operand_desc_t functionControlEntries[] = {
Lei Zhang1a0334e2015-11-02 09:41:20 -0500821 {"None", SpvFunctionControlMaskNone, 0, {SPV_OPERAND_TYPE_NONE}},
822 {"Inline", SpvFunctionControlInlineMask, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100823 {"DontInline",
Lei Zhangb36e7042015-10-28 13:40:52 -0400824 SpvFunctionControlDontInlineMask,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100825 0,
826 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang1a0334e2015-11-02 09:41:20 -0500827 {"Pure", SpvFunctionControlPureMask, 0, {SPV_OPERAND_TYPE_NONE}},
828 {"Const", SpvFunctionControlConstMask, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100829};
830
831static const spv_operand_desc_t memorySemanticsEntries[] = {
David Netobfa3d862015-09-25 10:30:27 -0400832 // "Relaxed" should be a synonym for "None".
833 // Put the Relaxed entry first so that the disassembler
834 // will prefer to emit "Relaxed".
Lei Zhang1a0334e2015-11-02 09:41:20 -0500835 {"Relaxed", SpvMemorySemanticsMaskNone, 0, {SPV_OPERAND_TYPE_NONE}},
836 {"None", SpvMemorySemanticsMaskNone, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100837 {"SequentiallyConsistent",
Lei Zhangb36e7042015-10-28 13:40:52 -0400838 SpvMemorySemanticsSequentiallyConsistentMask,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100839 0,
840 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang1a0334e2015-11-02 09:41:20 -0500841 {"Acquire", SpvMemorySemanticsAcquireMask, 0, {SPV_OPERAND_TYPE_NONE}},
842 {"Release", SpvMemorySemanticsReleaseMask, 0, {SPV_OPERAND_TYPE_NONE}},
David Netod02f68a2015-11-11 12:32:21 -0500843 {"AcquireRelease",
844 SpvMemorySemanticsAcquireReleaseMask,
845 0,
846 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100847 {"UniformMemory",
Lei Zhangb36e7042015-10-28 13:40:52 -0400848 SpvMemorySemanticsUniformMemoryMask,
849 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100850 {SPV_OPERAND_TYPE_NONE}},
851 {"SubgroupMemory",
Lei Zhangb36e7042015-10-28 13:40:52 -0400852 SpvMemorySemanticsSubgroupMemoryMask,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100853 0,
854 {SPV_OPERAND_TYPE_NONE}},
David Netod02f68a2015-11-11 12:32:21 -0500855 {"WorkgroupMemory",
856 SpvMemorySemanticsWorkgroupMemoryMask,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100857 0,
858 {SPV_OPERAND_TYPE_NONE}},
David Netod02f68a2015-11-11 12:32:21 -0500859 {"CrossWorkgroupMemory",
860 SpvMemorySemanticsCrossWorkgroupMemoryMask,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100861 0,
862 {SPV_OPERAND_TYPE_NONE}},
863 {"AtomicCounterMemory",
Lei Zhangb36e7042015-10-28 13:40:52 -0400864 SpvMemorySemanticsAtomicCounterMemoryMask,
865 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100866 {SPV_OPERAND_TYPE_NONE}},
867 {
Dejan Mircevski50babb22015-09-29 10:56:32 -0400868 "ImageMemory",
Lei Zhangb36e7042015-10-28 13:40:52 -0400869 SpvMemorySemanticsImageMemoryMask,
Dejan Mircevski50babb22015-09-29 10:56:32 -0400870 0,
871 {SPV_OPERAND_TYPE_NONE},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100872 },
873};
874
875static const spv_operand_desc_t memoryAccessEntries[] = {
Lei Zhang1a0334e2015-11-02 09:41:20 -0500876 {"None", SpvMemoryAccessMaskNone, 0, {SPV_OPERAND_TYPE_NONE}},
877 {"Volatile", SpvMemoryAccessVolatileMask, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100878 {
Dejan Mircevski50babb22015-09-29 10:56:32 -0400879 "Aligned",
Lei Zhangb36e7042015-10-28 13:40:52 -0400880 SpvMemoryAccessAlignedMask,
Dejan Mircevski50babb22015-09-29 10:56:32 -0400881 0,
Lei Zhang6483bd72015-10-14 17:02:39 -0400882 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100883 },
Lei Zhang1a0334e2015-11-02 09:41:20 -0500884 {"Nontemporal", SpvMemoryAccessNontemporalMask, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100885};
886
887static const spv_operand_desc_t scopeEntries[] = {
Lei Zhang1a0334e2015-11-02 09:41:20 -0500888 {"CrossDevice", SpvScopeCrossDevice, 0, {SPV_OPERAND_TYPE_NONE}},
Lei Zhangb36e7042015-10-28 13:40:52 -0400889 {"Device", SpvScopeDevice, 0, {SPV_OPERAND_TYPE_NONE}},
Lei Zhang1a0334e2015-11-02 09:41:20 -0500890 {"Workgroup", SpvScopeWorkgroup, 0, {SPV_OPERAND_TYPE_NONE}},
891 {"Subgroup", SpvScopeSubgroup, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100892 {
Lei Zhang1a0334e2015-11-02 09:41:20 -0500893 "Invocation", SpvScopeInvocation, 0, {SPV_OPERAND_TYPE_NONE},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100894 },
895};
896
897static const spv_operand_desc_t groupOperationEntries[] = {
898 {"Reduce",
Lei Zhangb36e7042015-10-28 13:40:52 -0400899 SpvGroupOperationReduce,
900 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100901 {SPV_OPERAND_TYPE_NONE}},
902 {"InclusiveScan",
Lei Zhangb36e7042015-10-28 13:40:52 -0400903 SpvGroupOperationInclusiveScan,
904 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100905 {SPV_OPERAND_TYPE_NONE}},
906 {"ExclusiveScan",
Lei Zhangb36e7042015-10-28 13:40:52 -0400907 SpvGroupOperationExclusiveScan,
908 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100909 {SPV_OPERAND_TYPE_NONE}},
910};
911
912static const spv_operand_desc_t kernelKernelEnqueueFlagssEntries[] = {
913 {"NoWait",
Lei Zhangb36e7042015-10-28 13:40:52 -0400914 SpvKernelEnqueueFlagsNoWait,
915 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100916 {SPV_OPERAND_TYPE_NONE}},
917 {"WaitKernel",
Lei Zhangb36e7042015-10-28 13:40:52 -0400918 SpvKernelEnqueueFlagsWaitKernel,
919 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100920 {SPV_OPERAND_TYPE_NONE}},
921 {"WaitWorkGroup",
Lei Zhangb36e7042015-10-28 13:40:52 -0400922 SpvKernelEnqueueFlagsWaitWorkGroup,
923 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100924 {SPV_OPERAND_TYPE_NONE}},
925};
926
927static const spv_operand_desc_t kernelProfilingInfoEntries[] = {
Lei Zhang1a0334e2015-11-02 09:41:20 -0500928 {"None", SpvKernelProfilingInfoMaskNone, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100929 {"CmdExecTime",
Lei Zhangb36e7042015-10-28 13:40:52 -0400930 SpvKernelProfilingInfoCmdExecTimeMask,
931 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100932 {SPV_OPERAND_TYPE_NONE}},
933};
934
David Netod30b2332015-09-23 16:04:24 -0400935// A macro for defining a capability that doesn't depend on another capability.
Lei Zhangb36e7042015-10-28 13:40:52 -0400936#define CASE(NAME) \
937 { \
938 #NAME, SpvCapability##NAME, 0, { SPV_OPERAND_TYPE_NONE } \
David Netod30b2332015-09-23 16:04:24 -0400939 }
940
941// A macro for defining a capability that depends on another.
Lei Zhangb36e7042015-10-28 13:40:52 -0400942#define CASE_CAP(NAME, CAP) \
943 { \
944 #NAME, SpvCapability##NAME, SPV_CAPABILITY_AS_MASK(SpvCapability##CAP), { \
945 SPV_OPERAND_TYPE_NONE \
946 } \
David Netod30b2332015-09-23 16:04:24 -0400947 }
948
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100949static const spv_operand_desc_t capabilityInfoEntries[] = {
David Netod30b2332015-09-23 16:04:24 -0400950 CASE(Matrix),
951 CASE_CAP(Shader, Matrix),
952 CASE_CAP(Geometry, Shader),
953 CASE_CAP(Tessellation, Shader),
954 CASE(Addresses),
955 CASE(Linkage),
956 CASE(Kernel),
957 CASE_CAP(Vector16, Kernel),
958 CASE_CAP(Float16Buffer, Kernel),
959 CASE_CAP(Float16, Float16Buffer),
960 CASE(Float64),
961 CASE(Int64),
962 CASE_CAP(Int64Atomics, Int64),
963 CASE_CAP(ImageBasic, Kernel),
964 CASE_CAP(ImageReadWrite, Kernel),
965 CASE_CAP(ImageMipmap, Kernel),
David Netod02f68a2015-11-11 12:32:21 -0500966 // Value 16 intentionally missing.
David Netod30b2332015-09-23 16:04:24 -0400967 CASE_CAP(Pipes, Kernel),
968 CASE(Groups),
969 CASE_CAP(DeviceEnqueue, Kernel),
970 CASE_CAP(LiteralSampler, Kernel),
971 CASE_CAP(AtomicStorage, Shader),
972 CASE(Int16),
973 CASE_CAP(TessellationPointSize, Tessellation),
974 CASE_CAP(GeometryPointSize, Geometry),
975 CASE_CAP(ImageGatherExtended, Shader),
David Netod02f68a2015-11-11 12:32:21 -0500976 // Value 26 intentionally missing.
David Netod30b2332015-09-23 16:04:24 -0400977 CASE_CAP(StorageImageMultisample, Shader),
978 CASE_CAP(UniformBufferArrayDynamicIndexing, Shader),
979 CASE_CAP(SampledImageArrayDynamicIndexing, Shader),
980 CASE_CAP(StorageBufferArrayDynamicIndexing, Shader),
981 CASE_CAP(StorageImageArrayDynamicIndexing, Shader),
982 CASE_CAP(ClipDistance, Shader),
983 CASE_CAP(CullDistance, Shader),
984 CASE_CAP(ImageCubeArray, SampledCubeArray),
985 CASE_CAP(SampleRateShading, Shader),
986 CASE_CAP(ImageRect, SampledRect),
987 CASE_CAP(SampledRect, Shader),
988 CASE_CAP(GenericPointer, Addresses),
989 CASE_CAP(Int8, Kernel),
David Netod02f68a2015-11-11 12:32:21 -0500990 CASE_CAP(InputAttachment, Shader),
David Netod30b2332015-09-23 16:04:24 -0400991 CASE_CAP(SparseResidency, Shader),
992 CASE_CAP(MinLod, Shader),
993 CASE_CAP(Sampled1D, Shader),
994 CASE_CAP(Image1D, Sampled1D),
995 CASE_CAP(SampledCubeArray, Shader),
996 CASE_CAP(SampledBuffer, Shader),
997 CASE_CAP(ImageBuffer, SampledBuffer),
998 CASE_CAP(ImageMSArray, Shader),
David Netod02f68a2015-11-11 12:32:21 -0500999 CASE_CAP(StorageImageExtendedFormats, Shader),
David Netod30b2332015-09-23 16:04:24 -04001000 CASE_CAP(ImageQuery, Shader),
1001 CASE_CAP(DerivativeControl, Shader),
1002 CASE_CAP(InterpolationFunction, Shader),
1003 CASE_CAP(TransformFeedback, Shader),
David Neto12511c82015-11-12 15:30:28 -05001004 CASE_CAP(GeometryStreams, Geometry),
David Neto5f7ed912015-11-12 15:44:25 -05001005 CASE_CAP(StorageImageReadWithoutFormat, Shader),
1006 CASE_CAP(StorageImageWriteWithoutFormat, Shader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001007};
David Netod30b2332015-09-23 16:04:24 -04001008#undef CASE
1009#undef CASE_CAP
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001010
1011static const spv_operand_desc_group_t opcodeEntryTypes[] = {
1012 {SPV_OPERAND_TYPE_SOURCE_LANGUAGE,
1013 sizeof(sourceLanguageEntries) / sizeof(spv_operand_desc_t),
1014 sourceLanguageEntries},
1015 {SPV_OPERAND_TYPE_EXECUTION_MODEL,
1016 sizeof(executionModelEntries) / sizeof(spv_operand_desc_t),
1017 executionModelEntries},
1018 {SPV_OPERAND_TYPE_ADDRESSING_MODEL,
1019 sizeof(addressingModelEntries) / sizeof(spv_operand_desc_t),
1020 addressingModelEntries},
1021 {SPV_OPERAND_TYPE_MEMORY_MODEL,
1022 sizeof(memoryModelEntries) / sizeof(spv_operand_desc_t),
1023 memoryModelEntries},
1024 {SPV_OPERAND_TYPE_EXECUTION_MODE,
1025 sizeof(executionModeEntries) / sizeof(spv_operand_desc_t),
1026 executionModeEntries},
1027 {SPV_OPERAND_TYPE_STORAGE_CLASS,
1028 sizeof(storageClassEntries) / sizeof(spv_operand_desc_t),
1029 storageClassEntries},
1030 {SPV_OPERAND_TYPE_DIMENSIONALITY,
1031 sizeof(dimensionalityEntries) / sizeof(spv_operand_desc_t),
1032 dimensionalityEntries},
1033 {SPV_OPERAND_TYPE_SAMPLER_ADDRESSING_MODE,
1034 sizeof(samplerAddressingModeEntries) / sizeof(spv_operand_desc_t),
1035 samplerAddressingModeEntries},
1036 {SPV_OPERAND_TYPE_SAMPLER_FILTER_MODE,
1037 sizeof(samplerFilterModeEntries) / sizeof(spv_operand_desc_t),
1038 samplerFilterModeEntries},
David Netob30a0c52015-09-16 15:56:43 -04001039 {SPV_OPERAND_TYPE_SAMPLER_IMAGE_FORMAT,
1040 sizeof(samplerImageFormatEntries) / sizeof(spv_operand_desc_t),
1041 samplerImageFormatEntries},
David Netoddda85a2015-10-02 17:10:10 -04001042 {SPV_OPERAND_TYPE_IMAGE_CHANNEL_ORDER,
1043 sizeof(imageChannelOrderEntries) / sizeof(spv_operand_desc_t),
1044 imageChannelOrderEntries},
1045 {SPV_OPERAND_TYPE_IMAGE_CHANNEL_DATA_TYPE,
1046 sizeof(imageChannelDataTypeEntries) / sizeof(spv_operand_desc_t),
1047 imageChannelDataTypeEntries},
David Neto201caf72015-11-04 17:38:17 -05001048 {SPV_OPERAND_TYPE_IMAGE,
1049 sizeof(imageOperandEntries) / sizeof(spv_operand_desc_t),
1050 imageOperandEntries},
1051 {SPV_OPERAND_TYPE_OPTIONAL_IMAGE, // Same as *_IMAGE
David Netoee1b3bb2015-09-18 11:19:18 -04001052 sizeof(imageOperandEntries) / sizeof(spv_operand_desc_t),
1053 imageOperandEntries},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001054 {SPV_OPERAND_TYPE_FP_FAST_MATH_MODE,
1055 sizeof(fpFastMathModeEntries) / sizeof(spv_operand_desc_t),
1056 fpFastMathModeEntries},
1057 {SPV_OPERAND_TYPE_FP_ROUNDING_MODE,
1058 sizeof(fpRoundingModeEntries) / sizeof(spv_operand_desc_t),
1059 fpRoundingModeEntries},
1060 {SPV_OPERAND_TYPE_LINKAGE_TYPE,
1061 sizeof(linkageTypeEntries) / sizeof(spv_operand_desc_t),
1062 linkageTypeEntries},
1063 {SPV_OPERAND_TYPE_ACCESS_QUALIFIER,
1064 sizeof(accessQualifierEntries) / sizeof(spv_operand_desc_t),
1065 accessQualifierEntries},
1066 {SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE,
1067 sizeof(functionParameterAttributeEntries) / sizeof(spv_operand_desc_t),
1068 functionParameterAttributeEntries},
1069 {SPV_OPERAND_TYPE_DECORATION,
1070 sizeof(decorationEntries) / sizeof(spv_operand_desc_t), decorationEntries},
1071 {SPV_OPERAND_TYPE_BUILT_IN,
1072 sizeof(builtInEntries) / sizeof(spv_operand_desc_t), builtInEntries},
1073 {SPV_OPERAND_TYPE_SELECTION_CONTROL,
1074 sizeof(selectionControlEntries) / sizeof(spv_operand_desc_t),
1075 selectionControlEntries},
1076 {SPV_OPERAND_TYPE_LOOP_CONTROL,
1077 sizeof(loopControlEntries) / sizeof(spv_operand_desc_t),
1078 loopControlEntries},
1079 {SPV_OPERAND_TYPE_FUNCTION_CONTROL,
1080 sizeof(functionControlEntries) / sizeof(spv_operand_desc_t),
1081 functionControlEntries},
1082 {SPV_OPERAND_TYPE_MEMORY_SEMANTICS,
1083 sizeof(memorySemanticsEntries) / sizeof(spv_operand_desc_t),
1084 memorySemanticsEntries},
David Neto201caf72015-11-04 17:38:17 -05001085 {SPV_OPERAND_TYPE_MEMORY_ACCESS,
1086 sizeof(memoryAccessEntries) / sizeof(spv_operand_desc_t),
1087 memoryAccessEntries},
1088 {SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS, // Same as *_MEMORY_ACCESS
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001089 sizeof(memoryAccessEntries) / sizeof(spv_operand_desc_t),
1090 memoryAccessEntries},
1091 {SPV_OPERAND_TYPE_EXECUTION_SCOPE,
1092 sizeof(scopeEntries) / sizeof(spv_operand_desc_t), scopeEntries},
1093 {SPV_OPERAND_TYPE_GROUP_OPERATION,
1094 sizeof(groupOperationEntries) / sizeof(spv_operand_desc_t),
1095 groupOperationEntries},
1096 {SPV_OPERAND_TYPE_KERNEL_ENQ_FLAGS,
1097 sizeof(kernelKernelEnqueueFlagssEntries) / sizeof(spv_operand_desc_t),
1098 kernelKernelEnqueueFlagssEntries},
David Neto47994822015-08-27 13:11:01 -04001099 {SPV_OPERAND_TYPE_KERNEL_PROFILING_INFO,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001100 sizeof(kernelProfilingInfoEntries) / sizeof(spv_operand_desc_t),
1101 kernelProfilingInfoEntries},
1102 {SPV_OPERAND_TYPE_CAPABILITY,
1103 sizeof(capabilityInfoEntries) / sizeof(spv_operand_desc_t),
1104 capabilityInfoEntries},
1105};
1106
Dejan Mircevski50babb22015-09-29 10:56:32 -04001107spv_result_t spvOperandTableGet(spv_operand_table* pOperandTable) {
Lei Zhang40056702015-09-11 14:31:27 -04001108 if (!pOperandTable) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001109
1110 static const spv_operand_table_t table = {
1111 sizeof(opcodeEntryTypes) / sizeof(spv_operand_desc_group_t),
1112 opcodeEntryTypes};
1113
1114 *pOperandTable = &table;
1115
1116 return SPV_SUCCESS;
1117}
1118
1119spv_result_t spvOperandTableNameLookup(const spv_operand_table table,
1120 const spv_operand_type_t type,
David Neto388c40d2015-09-16 16:42:56 -04001121 const char* name,
1122 const size_t nameLength,
1123 spv_operand_desc* pEntry) {
Lei Zhang40056702015-09-11 14:31:27 -04001124 if (!table) return SPV_ERROR_INVALID_TABLE;
1125 if (!name || !pEntry) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001126
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001127 for (uint64_t typeIndex = 0; typeIndex < table->count; ++typeIndex) {
1128 if (type == table->types[typeIndex].type) {
1129 for (uint64_t operandIndex = 0;
1130 operandIndex < table->types[typeIndex].count; ++operandIndex) {
1131 if (nameLength ==
1132 strlen(table->types[typeIndex].entries[operandIndex].name) &&
1133 !strncmp(table->types[typeIndex].entries[operandIndex].name, name,
David Neto388c40d2015-09-16 16:42:56 -04001134 nameLength)) {
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001135 *pEntry = &table->types[typeIndex].entries[operandIndex];
1136 return SPV_SUCCESS;
1137 }
1138 }
1139 }
1140 }
1141
1142 return SPV_ERROR_INVALID_LOOKUP;
1143}
1144
1145spv_result_t spvOperandTableValueLookup(const spv_operand_table table,
1146 const spv_operand_type_t type,
1147 const uint32_t value,
Dejan Mircevski50babb22015-09-29 10:56:32 -04001148 spv_operand_desc* pEntry) {
Lei Zhang40056702015-09-11 14:31:27 -04001149 if (!table) return SPV_ERROR_INVALID_TABLE;
1150 if (!pEntry) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001151
1152 for (uint64_t typeIndex = 0; typeIndex < table->count; ++typeIndex) {
1153 if (type == table->types[typeIndex].type) {
1154 for (uint64_t operandIndex = 0;
1155 operandIndex < table->types[typeIndex].count; ++operandIndex) {
1156 if (value == table->types[typeIndex].entries[operandIndex].value) {
1157 *pEntry = &table->types[typeIndex].entries[operandIndex];
1158 return SPV_SUCCESS;
1159 }
1160 }
1161 }
1162 }
1163
1164 return SPV_ERROR_INVALID_LOOKUP;
1165}
1166
Dejan Mircevski50babb22015-09-29 10:56:32 -04001167const char* spvOperandTypeStr(spv_operand_type_t type) {
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001168 switch (type) {
1169 case SPV_OPERAND_TYPE_ID:
David Netofadbf622015-09-14 17:07:11 -04001170 case SPV_OPERAND_TYPE_OPTIONAL_ID:
David Netofadbf622015-09-14 17:07:11 -04001171 return "ID";
David Neto201caf72015-11-04 17:38:17 -05001172 case SPV_OPERAND_TYPE_TYPE_ID:
1173 return "type ID";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001174 case SPV_OPERAND_TYPE_RESULT_ID:
1175 return "result ID";
Lei Zhang6483bd72015-10-14 17:02:39 -04001176 case SPV_OPERAND_TYPE_LITERAL_INTEGER:
David Neto201caf72015-11-04 17:38:17 -05001177 case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_INTEGER:
1178 case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_NUMBER:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001179 return "literal number";
David Neto201caf72015-11-04 17:38:17 -05001180 case SPV_OPERAND_TYPE_OPTIONAL_TYPED_LITERAL_INTEGER:
1181 return "possibly multi-word literal integer";
1182 case SPV_OPERAND_TYPE_TYPED_LITERAL_NUMBER:
1183 return "possibly multi-word literal number";
1184 case SPV_OPERAND_TYPE_EXTENSION_INSTRUCTION_NUMBER:
1185 return "extension instruction number";
David Neto0f166be2015-11-11 01:56:49 -05001186 case SPV_OPERAND_TYPE_SPEC_CONSTANT_OP_NUMBER:
1187 return "OpSpecConstantOp opcode";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001188 case SPV_OPERAND_TYPE_LITERAL_STRING:
David Neto201caf72015-11-04 17:38:17 -05001189 case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_STRING:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001190 return "literal string";
1191 case SPV_OPERAND_TYPE_SOURCE_LANGUAGE:
Dejan Mircevskid2c81cf2015-10-09 11:06:10 -04001192 return "source language";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001193 case SPV_OPERAND_TYPE_EXECUTION_MODEL:
1194 return "execution model";
1195 case SPV_OPERAND_TYPE_ADDRESSING_MODEL:
1196 return "addressing model";
1197 case SPV_OPERAND_TYPE_MEMORY_MODEL:
1198 return "memory model";
1199 case SPV_OPERAND_TYPE_EXECUTION_MODE:
David Neto201caf72015-11-04 17:38:17 -05001200 case SPV_OPERAND_TYPE_OPTIONAL_EXECUTION_MODE:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001201 return "execution mode";
1202 case SPV_OPERAND_TYPE_STORAGE_CLASS:
1203 return "storage class";
1204 case SPV_OPERAND_TYPE_DIMENSIONALITY:
1205 return "dimensionality";
1206 case SPV_OPERAND_TYPE_SAMPLER_ADDRESSING_MODE:
1207 return "addressing mode";
1208 case SPV_OPERAND_TYPE_SAMPLER_FILTER_MODE:
1209 return "sampler filter mode";
David Netob30a0c52015-09-16 15:56:43 -04001210 case SPV_OPERAND_TYPE_SAMPLER_IMAGE_FORMAT:
Dejan Mircevski971b3442015-10-13 12:54:47 -04001211 return "image format";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001212 case SPV_OPERAND_TYPE_FP_FAST_MATH_MODE:
Dejan Mircevski355cc0c2015-10-13 15:02:03 -04001213 return "floating-point fast math mode";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001214 case SPV_OPERAND_TYPE_FP_ROUNDING_MODE:
Dejan Mircevski355cc0c2015-10-13 15:02:03 -04001215 return "floating-point rounding mode";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001216 case SPV_OPERAND_TYPE_LINKAGE_TYPE:
1217 return "linkage type";
1218 case SPV_OPERAND_TYPE_ACCESS_QUALIFIER:
1219 return "access qualifier";
1220 case SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE:
1221 return "function parameter attribute";
1222 case SPV_OPERAND_TYPE_DECORATION:
1223 return "decoration";
1224 case SPV_OPERAND_TYPE_BUILT_IN:
Dejan Mircevskid7b0f832015-10-13 15:39:38 -04001225 return "built-in";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001226 case SPV_OPERAND_TYPE_SELECTION_CONTROL:
1227 return "selection control";
1228 case SPV_OPERAND_TYPE_LOOP_CONTROL:
1229 return "loop control";
1230 case SPV_OPERAND_TYPE_FUNCTION_CONTROL:
1231 return "function control";
1232 case SPV_OPERAND_TYPE_MEMORY_SEMANTICS:
1233 return "memory semantics";
David Neto201caf72015-11-04 17:38:17 -05001234 case SPV_OPERAND_TYPE_MEMORY_ACCESS:
David Neto78c3b432015-08-27 13:03:52 -04001235 case SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001236 return "memory access";
1237 case SPV_OPERAND_TYPE_EXECUTION_SCOPE:
David Netofadbf622015-09-14 17:07:11 -04001238 return "execution scope ID";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001239 case SPV_OPERAND_TYPE_GROUP_OPERATION:
1240 return "group operation";
1241 case SPV_OPERAND_TYPE_KERNEL_ENQ_FLAGS:
1242 return "kernel enqeue flags";
David Neto47994822015-08-27 13:11:01 -04001243 case SPV_OPERAND_TYPE_KERNEL_PROFILING_INFO:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001244 return "kernel profiling info";
1245 case SPV_OPERAND_TYPE_CAPABILITY:
1246 return "capability";
David Neto201caf72015-11-04 17:38:17 -05001247 case SPV_OPERAND_TYPE_IMAGE:
David Netoee1b3bb2015-09-18 11:19:18 -04001248 case SPV_OPERAND_TYPE_OPTIONAL_IMAGE:
1249 return "image operand";
David Neto201caf72015-11-04 17:38:17 -05001250 case SPV_OPERAND_TYPE_OPTIONAL_CIV:
1251 return "context-insensitive value";
1252
1253 // The next values are for values returned from an instruction, not actually
1254 // an operand. So the specific strings don't matter. But let's add them
1255 // for completeness and ease of testing.
1256 case SPV_OPERAND_TYPE_IMAGE_CHANNEL_ORDER:
1257 return "image channel order";
1258 case SPV_OPERAND_TYPE_IMAGE_CHANNEL_DATA_TYPE:
1259 return "image channel data type";
1260
David Neto78c3b432015-08-27 13:03:52 -04001261 case SPV_OPERAND_TYPE_NONE:
1262 return "NONE";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001263 default:
1264 assert(0 && "Unhandled operand type!");
1265 break;
1266 }
1267 return "unknown";
1268}
David Neto78c3b432015-08-27 13:03:52 -04001269
1270void spvPrependOperandTypes(const spv_operand_type_t* types,
1271 spv_operand_pattern_t* pattern) {
1272 const spv_operand_type_t* endTypes;
Dejan Mircevski50babb22015-09-29 10:56:32 -04001273 for (endTypes = types; *endTypes != SPV_OPERAND_TYPE_NONE; ++endTypes)
David Neto78c3b432015-08-27 13:03:52 -04001274 ;
1275 pattern->insert(pattern->begin(), types, endTypes);
1276}
1277
David Neto5bf88fc2015-09-17 17:06:10 -04001278void spvPrependOperandTypesForMask(const spv_operand_table operandTable,
1279 const spv_operand_type_t type,
1280 const uint32_t mask,
1281 spv_operand_pattern_t* pattern) {
1282 // Scan from highest bits to lowest bits because we will prepend in LIFO
1283 // fashion, and we need the operands for lower order bits to appear first.
1284 for (uint32_t candidate_bit = (1 << 31); candidate_bit; candidate_bit >>= 1) {
1285 if (candidate_bit & mask) {
1286 spv_operand_desc entry = nullptr;
1287 if (SPV_SUCCESS == spvOperandTableValueLookup(operandTable, type,
1288 candidate_bit, &entry)) {
1289 spvPrependOperandTypes(entry->operandTypes, pattern);
1290 }
1291 }
1292 }
1293}
1294
David Neto78c3b432015-08-27 13:03:52 -04001295bool spvOperandIsOptional(spv_operand_type_t type) {
David Neto201caf72015-11-04 17:38:17 -05001296 return SPV_OPERAND_TYPE_FIRST_OPTIONAL_TYPE <= type &&
1297 type <= SPV_OPERAND_TYPE_LAST_OPTIONAL_TYPE;
David Neto78c3b432015-08-27 13:03:52 -04001298}
1299
1300bool spvOperandIsVariable(spv_operand_type_t type) {
David Neto201caf72015-11-04 17:38:17 -05001301 return SPV_OPERAND_TYPE_FIRST_VARIABLE_TYPE <= type &&
1302 type <= SPV_OPERAND_TYPE_LAST_VARIABLE_TYPE;
David Neto78c3b432015-08-27 13:03:52 -04001303}
1304
David Neto78c3b432015-08-27 13:03:52 -04001305bool spvExpandOperandSequenceOnce(spv_operand_type_t type,
1306 spv_operand_pattern_t* pattern) {
1307 switch (type) {
1308 case SPV_OPERAND_TYPE_VARIABLE_ID:
1309 pattern->insert(pattern->begin(), {SPV_OPERAND_TYPE_OPTIONAL_ID, type});
1310 return true;
Lei Zhang6483bd72015-10-14 17:02:39 -04001311 case SPV_OPERAND_TYPE_VARIABLE_LITERAL_INTEGER:
David Neto78c3b432015-08-27 13:03:52 -04001312 pattern->insert(pattern->begin(),
Lei Zhang6483bd72015-10-14 17:02:39 -04001313 {SPV_OPERAND_TYPE_OPTIONAL_LITERAL_INTEGER, type});
David Neto78c3b432015-08-27 13:03:52 -04001314 return true;
Lei Zhang6483bd72015-10-14 17:02:39 -04001315 case SPV_OPERAND_TYPE_VARIABLE_LITERAL_INTEGER_ID:
David Neto201caf72015-11-04 17:38:17 -05001316 // Represents Zero or more (Literal number, Id) pairs,
1317 // where the literal number must be a scalar integer.
David Neto78c3b432015-08-27 13:03:52 -04001318 pattern->insert(pattern->begin(),
David Neto201caf72015-11-04 17:38:17 -05001319 {SPV_OPERAND_TYPE_OPTIONAL_TYPED_LITERAL_INTEGER,
1320 SPV_OPERAND_TYPE_ID, type});
David Neto78c3b432015-08-27 13:03:52 -04001321 return true;
Lei Zhang6483bd72015-10-14 17:02:39 -04001322 case SPV_OPERAND_TYPE_VARIABLE_ID_LITERAL_INTEGER:
David Neto561dc4e2015-09-25 14:23:29 -04001323 // Represents Zero or more (Id, Literal number) pairs.
David Neto201caf72015-11-04 17:38:17 -05001324 pattern->insert(pattern->begin(),
1325 {SPV_OPERAND_TYPE_OPTIONAL_ID,
1326 SPV_OPERAND_TYPE_LITERAL_INTEGER, type});
David Neto78c3b432015-08-27 13:03:52 -04001327 return true;
David Neto78c3b432015-08-27 13:03:52 -04001328 case SPV_OPERAND_TYPE_VARIABLE_EXECUTION_MODE:
Dejan Mircevski50babb22015-09-29 10:56:32 -04001329 pattern->insert(pattern->begin(),
1330 {SPV_OPERAND_TYPE_OPTIONAL_EXECUTION_MODE, type});
David Neto78c3b432015-08-27 13:03:52 -04001331 return true;
1332 default:
1333 break;
1334 }
1335 return false;
1336}
1337
Dejan Mircevski50babb22015-09-29 10:56:32 -04001338spv_operand_type_t spvTakeFirstMatchableOperand(
1339 spv_operand_pattern_t* pattern) {
David Neto78c3b432015-08-27 13:03:52 -04001340 assert(!pattern->empty());
1341 spv_operand_type_t result;
1342 do {
1343 result = pattern->front();
1344 pattern->pop_front();
Dejan Mircevski50babb22015-09-29 10:56:32 -04001345 } while (spvExpandOperandSequenceOnce(result, pattern));
David Neto78c3b432015-08-27 13:03:52 -04001346 return result;
1347}
Dejan Mircevski903f9d62015-09-28 17:04:39 -04001348
Dejan Mircevski897bff92015-09-29 10:38:18 -04001349spv_operand_pattern_t spvAlternatePatternFollowingImmediate(
1350 const spv_operand_pattern_t& pattern) {
1351 spv_operand_pattern_t alternatePattern;
1352 for (const auto& operand : pattern) {
1353 if (operand == SPV_OPERAND_TYPE_RESULT_ID) {
1354 alternatePattern.push_back(operand);
1355 alternatePattern.push_back(SPV_OPERAND_TYPE_OPTIONAL_CIV);
1356 return alternatePattern;
Dejan Mircevski903f9d62015-09-28 17:04:39 -04001357 }
Dejan Mircevski897bff92015-09-29 10:38:18 -04001358 alternatePattern.push_back(SPV_OPERAND_TYPE_OPTIONAL_CIV);
Dejan Mircevski903f9d62015-09-28 17:04:39 -04001359 }
Dejan Mircevski897bff92015-09-29 10:38:18 -04001360 // No result-id found, so just expect CIVs.
1361 return {SPV_OPERAND_TYPE_OPTIONAL_CIV};
Dejan Mircevski903f9d62015-09-28 17:04:39 -04001362}