blob: bcb372a5dfd365acca319524210b4199560ae057 [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 Netod9ad0502015-11-24 18:37:24 -0500179 {"Workgroup", SpvStorageClassWorkgroup, 0, {SPV_OPERAND_TYPE_NONE}},
David Netod02f68a2015-11-11 12:32:21 -0500180 {"CrossWorkgroup",
181 SpvStorageClassCrossWorkgroup,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100182 0,
183 {SPV_OPERAND_TYPE_NONE}},
David Netod02f68a2015-11-11 12:32:21 -0500184 {"Private",
185 SpvStorageClassPrivate,
Lei Zhangb36e7042015-10-28 13:40:52 -0400186 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100187 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang1a0334e2015-11-02 09:41:20 -0500188 {"Function", SpvStorageClassFunction, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100189 {"Generic",
Lei Zhangb36e7042015-10-28 13:40:52 -0400190 SpvStorageClassGeneric,
191 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100192 {SPV_OPERAND_TYPE_NONE}},
David Neto9819adf2015-09-23 10:19:57 -0400193 {"PushConstant",
Lei Zhangb36e7042015-10-28 13:40:52 -0400194 SpvStorageClassPushConstant,
195 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
David Neto9819adf2015-09-23 10:19:57 -0400196 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100197 {"AtomicCounter",
Lei Zhangb36e7042015-10-28 13:40:52 -0400198 SpvStorageClassAtomicCounter,
199 SPV_CAPABILITY_AS_MASK(SpvCapabilityAtomicStorage),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100200 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang1a0334e2015-11-02 09:41:20 -0500201 {"Image", SpvStorageClassImage, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100202};
203
204static const spv_operand_desc_t dimensionalityEntries[] = {
David Netoddda85a2015-10-02 17:10:10 -0400205 {"1D",
Lei Zhangb36e7042015-10-28 13:40:52 -0400206 SpvDim1D,
207 SPV_CAPABILITY_AS_MASK(SpvCapabilitySampled1D),
David Netoddda85a2015-10-02 17:10:10 -0400208 {SPV_OPERAND_TYPE_NONE}},
Lei Zhangb36e7042015-10-28 13:40:52 -0400209 {"2D", SpvDim2D, 0, {SPV_OPERAND_TYPE_NONE}},
210 {"3D", SpvDim3D, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100211 {"Cube",
Lei Zhangb36e7042015-10-28 13:40:52 -0400212 SpvDimCube,
213 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100214 {SPV_OPERAND_TYPE_NONE}},
215 {"Rect",
Lei Zhangb36e7042015-10-28 13:40:52 -0400216 SpvDimRect,
217 SPV_CAPABILITY_AS_MASK(SpvCapabilitySampledRect),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100218 {SPV_OPERAND_TYPE_NONE}},
David Netoddda85a2015-10-02 17:10:10 -0400219 {"Buffer",
Lei Zhangb36e7042015-10-28 13:40:52 -0400220 SpvDimBuffer,
221 SPV_CAPABILITY_AS_MASK(SpvCapabilitySampledBuffer),
David Netoddda85a2015-10-02 17:10:10 -0400222 {SPV_OPERAND_TYPE_NONE}},
David Netod02f68a2015-11-11 12:32:21 -0500223 {"SubpassData",
224 SpvDimSubpassData,
225 SPV_CAPABILITY_AS_MASK(SpvCapabilityInputAttachment),
David Netoaa0c3a52015-09-23 10:30:06 -0400226 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100227};
228
229static const spv_operand_desc_t samplerAddressingModeEntries[] = {
230 {"None",
Lei Zhangb36e7042015-10-28 13:40:52 -0400231 SpvSamplerAddressingModeNone,
232 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100233 {SPV_OPERAND_TYPE_NONE}},
234 {"ClampToEdge",
Lei Zhangb36e7042015-10-28 13:40:52 -0400235 SpvSamplerAddressingModeClampToEdge,
236 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100237 {SPV_OPERAND_TYPE_NONE}},
238 {"Clamp",
Lei Zhangb36e7042015-10-28 13:40:52 -0400239 SpvSamplerAddressingModeClamp,
240 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100241 {SPV_OPERAND_TYPE_NONE}},
242 {"Repeat",
Lei Zhangb36e7042015-10-28 13:40:52 -0400243 SpvSamplerAddressingModeRepeat,
244 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100245 {SPV_OPERAND_TYPE_NONE}},
246 {"RepeatMirrored",
Lei Zhangb36e7042015-10-28 13:40:52 -0400247 SpvSamplerAddressingModeRepeatMirrored,
248 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100249 {SPV_OPERAND_TYPE_NONE}},
250};
251
252static const spv_operand_desc_t samplerFilterModeEntries[] = {
253 {"Nearest",
Lei Zhangb36e7042015-10-28 13:40:52 -0400254 SpvSamplerFilterModeNearest,
255 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100256 {SPV_OPERAND_TYPE_NONE}},
257 {"Linear",
Lei Zhangb36e7042015-10-28 13:40:52 -0400258 SpvSamplerFilterModeLinear,
259 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100260 {SPV_OPERAND_TYPE_NONE}},
261};
262
David Netob30a0c52015-09-16 15:56:43 -0400263static const spv_operand_desc_t samplerImageFormatEntries[] = {
Lei Zhangb36e7042015-10-28 13:40:52 -0400264#define CASE0(NAME) \
265 { \
266 #NAME, SpvImageFormat##NAME, 0, { SPV_OPERAND_TYPE_NONE } \
David Netoddda85a2015-10-02 17:10:10 -0400267 }
Lei Zhangb36e7042015-10-28 13:40:52 -0400268#define CASE(NAME, CAP) \
269 { \
270 #NAME, SpvImageFormat##NAME, SPV_CAPABILITY_AS_MASK(SpvCapability##CAP), { \
271 SPV_OPERAND_TYPE_NONE \
272 } \
David Netob30a0c52015-09-16 15:56:43 -0400273 }
Dejan Mircevski50babb22015-09-29 10:56:32 -0400274 // clang-format off
David Netoddda85a2015-10-02 17:10:10 -0400275 CASE0(Unknown),
276 CASE(Rgba32f, Shader),
277 CASE(Rgba16f, Shader),
278 CASE(R32f, Shader),
279 CASE(Rgba8, Shader),
280 CASE(Rgba8Snorm, Shader),
David Netod02f68a2015-11-11 12:32:21 -0500281 CASE(Rg32f, StorageImageExtendedFormats),
282 CASE(Rg16f, StorageImageExtendedFormats),
283 CASE(R11fG11fB10f, StorageImageExtendedFormats),
284 CASE(R16f, StorageImageExtendedFormats),
285 CASE(Rgba16, StorageImageExtendedFormats),
286 CASE(Rgb10A2, StorageImageExtendedFormats),
287 CASE(Rg16, StorageImageExtendedFormats),
288 CASE(Rg8, StorageImageExtendedFormats),
289 CASE(R16, StorageImageExtendedFormats),
290 CASE(R8, StorageImageExtendedFormats),
291 CASE(Rgba16Snorm, StorageImageExtendedFormats),
292 CASE(Rg16Snorm, StorageImageExtendedFormats),
293 CASE(Rg8Snorm, StorageImageExtendedFormats),
294 CASE(R16Snorm, StorageImageExtendedFormats),
295 CASE(R8Snorm, StorageImageExtendedFormats),
David Netoddda85a2015-10-02 17:10:10 -0400296 CASE(Rgba32i, Shader),
297 CASE(Rgba16i, Shader),
298 CASE(Rgba8i, Shader),
299 CASE(R32i, Shader),
David Netod02f68a2015-11-11 12:32:21 -0500300 CASE(Rg32i, StorageImageExtendedFormats),
301 CASE(Rg16i, StorageImageExtendedFormats),
302 CASE(Rg8i, StorageImageExtendedFormats),
303 CASE(R16i, StorageImageExtendedFormats),
304 CASE(R8i, StorageImageExtendedFormats),
David Netoddda85a2015-10-02 17:10:10 -0400305 CASE(Rgba32ui, Shader),
306 CASE(Rgba16ui, Shader),
307 CASE(Rgba8ui, Shader),
308 CASE(R32ui, Shader),
David Netod02f68a2015-11-11 12:32:21 -0500309 CASE(Rgb10a2ui, StorageImageExtendedFormats),
310 CASE(Rg32ui, StorageImageExtendedFormats),
311 CASE(Rg16ui, StorageImageExtendedFormats),
312 CASE(Rg8ui, StorageImageExtendedFormats),
313 CASE(R16ui, StorageImageExtendedFormats),
314 CASE(R8ui, StorageImageExtendedFormats),
Dejan Mircevski50babb22015-09-29 10:56:32 -0400315// clang-format on
David Netob30a0c52015-09-16 15:56:43 -0400316#undef CASE
317};
318
David Netoddda85a2015-10-02 17:10:10 -0400319// All image channel orders depend on the Kernel capability.
Lei Zhang1a0334e2015-11-02 09:41:20 -0500320#define CASE(NAME) \
321 { \
322 #NAME, SpvImageChannelOrder##NAME, \
323 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel), { \
324 SPV_OPERAND_TYPE_NONE \
325 } \
David Netoddda85a2015-10-02 17:10:10 -0400326 }
327static const spv_operand_desc_t imageChannelOrderEntries[] = {
Lei Zhang1a0334e2015-11-02 09:41:20 -0500328 CASE(R), CASE(A), CASE(RG), CASE(RA), CASE(RGB),
329 CASE(RGBA), CASE(BGRA), CASE(ARGB), CASE(Intensity), CASE(Luminance),
330 CASE(Rx), CASE(RGx), CASE(RGBx), CASE(Depth), CASE(DepthStencil),
331 CASE(sRGB), CASE(sRGBx), CASE(sRGBA), CASE(sBGRA),
David Netoddda85a2015-10-02 17:10:10 -0400332};
333#undef CASE
334
335// All image channel data types depend on the Kernel capability.
Lei Zhangb36e7042015-10-28 13:40:52 -0400336#define CASE(NAME) \
337 { \
338 #NAME, SpvImageChannelDataType##NAME, \
339 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel), { \
340 SPV_OPERAND_TYPE_NONE \
341 } \
David Netoddda85a2015-10-02 17:10:10 -0400342 }
343static const spv_operand_desc_t imageChannelDataTypeEntries[] = {
David Netod02f68a2015-11-11 12:32:21 -0500344 CASE(SnormInt8), CASE(SnormInt16), CASE(UnormInt8),
345 CASE(UnormInt16), CASE(UnormShort565), CASE(UnormShort555),
346 CASE(UnormInt101010), CASE(SignedInt8), CASE(SignedInt16),
347 CASE(SignedInt32), CASE(UnsignedInt8), CASE(UnsignedInt16),
348 CASE(UnsignedInt32), CASE(HalfFloat), CASE(Float),
349 CASE(UnormInt24), CASE(UnormInt101010_2),
David Netoddda85a2015-10-02 17:10:10 -0400350};
351#undef CASE
352
David Netoee1b3bb2015-09-18 11:19:18 -0400353// Image operand definitions. Each enum value is a mask. When that mask
354// bit is set, the instruction should have further ID operands.
355// Some mask values depend on a capability.
356static const spv_operand_desc_t imageOperandEntries[] = {
357// Rev32 and later adds many more enums.
Lei Zhang1a0334e2015-11-02 09:41:20 -0500358#define CASE(NAME) #NAME, SpvImageOperands##NAME##Mask, 0
359#define CASE_CAP(NAME, CAP) #NAME, SpvImageOperands##NAME##Mask, CAP
David Netoee1b3bb2015-09-18 11:19:18 -0400360#define ID SPV_OPERAND_TYPE_ID
361#define NONE SPV_OPERAND_TYPE_NONE
Lei Zhangb36e7042015-10-28 13:40:52 -0400362 {"None", SpvImageOperandsMaskNone, 0, {NONE}},
363 {CASE_CAP(Bias, SPV_CAPABILITY_AS_MASK(SpvCapabilityShader)), {ID, NONE}},
David Netoee1b3bb2015-09-18 11:19:18 -0400364 {CASE(Lod), {ID, NONE}},
365 {CASE(Grad), {ID, ID, NONE}},
366 {CASE(ConstOffset), {ID, NONE}},
Lei Zhangb36e7042015-10-28 13:40:52 -0400367 {CASE_CAP(Offset, SPV_CAPABILITY_AS_MASK(SpvCapabilityImageGatherExtended)),
Dejan Mircevski205408b2015-09-30 16:42:34 -0400368 {ID, NONE}},
David Netoee1b3bb2015-09-18 11:19:18 -0400369 {CASE(ConstOffsets), {ID, NONE}},
370 {CASE(Sample), {ID, NONE}},
Lei Zhangb36e7042015-10-28 13:40:52 -0400371 {CASE_CAP(MinLod, SPV_CAPABILITY_AS_MASK(SpvCapabilityMinLod)), {ID, NONE}},
David Netoee1b3bb2015-09-18 11:19:18 -0400372#undef CASE
373#undef CASE_CAP
374#undef ID
375#undef NONE
376};
377
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100378static const spv_operand_desc_t fpFastMathModeEntries[] = {
Lei Zhang1a0334e2015-11-02 09:41:20 -0500379 {"None", SpvFPFastMathModeMaskNone, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100380 {"NotNaN",
Lei Zhangb36e7042015-10-28 13:40:52 -0400381 SpvFPFastMathModeNotNaNMask,
382 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100383 {SPV_OPERAND_TYPE_NONE}},
384 {"NotInf",
Lei Zhangb36e7042015-10-28 13:40:52 -0400385 SpvFPFastMathModeNotInfMask,
386 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100387 {SPV_OPERAND_TYPE_NONE}},
388 {"NSZ",
Lei Zhangb36e7042015-10-28 13:40:52 -0400389 SpvFPFastMathModeNSZMask,
390 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100391 {SPV_OPERAND_TYPE_NONE}},
392 {"AllowRecip",
Lei Zhangb36e7042015-10-28 13:40:52 -0400393 SpvFPFastMathModeAllowRecipMask,
394 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100395 {SPV_OPERAND_TYPE_NONE}},
396 {"Fast",
Lei Zhangb36e7042015-10-28 13:40:52 -0400397 SpvFPFastMathModeFastMask,
398 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100399 {SPV_OPERAND_TYPE_NONE}},
400};
401
402static const spv_operand_desc_t fpRoundingModeEntries[] = {
403 {"RTE",
Lei Zhangb36e7042015-10-28 13:40:52 -0400404 SpvFPRoundingModeRTE,
405 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100406 {SPV_OPERAND_TYPE_NONE}},
407 {"RTZ",
Lei Zhangb36e7042015-10-28 13:40:52 -0400408 SpvFPRoundingModeRTZ,
409 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100410 {SPV_OPERAND_TYPE_NONE}},
411 {"RTP",
Lei Zhangb36e7042015-10-28 13:40:52 -0400412 SpvFPRoundingModeRTP,
413 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100414 {SPV_OPERAND_TYPE_NONE}},
415 {"RTN",
Lei Zhangb36e7042015-10-28 13:40:52 -0400416 SpvFPRoundingModeRTN,
417 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100418 {SPV_OPERAND_TYPE_NONE}},
419};
420
421static const spv_operand_desc_t linkageTypeEntries[] = {
422 {"Export",
Lei Zhangb36e7042015-10-28 13:40:52 -0400423 SpvLinkageTypeExport,
424 SPV_CAPABILITY_AS_MASK(SpvCapabilityLinkage),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100425 {SPV_OPERAND_TYPE_NONE}},
426 {"Import",
Lei Zhangb36e7042015-10-28 13:40:52 -0400427 SpvLinkageTypeImport,
428 SPV_CAPABILITY_AS_MASK(SpvCapabilityLinkage),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100429 {SPV_OPERAND_TYPE_NONE}},
430};
431
432static const spv_operand_desc_t accessQualifierEntries[] = {
433 {"ReadOnly",
Lei Zhangb36e7042015-10-28 13:40:52 -0400434 SpvAccessQualifierReadOnly,
435 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100436 {SPV_OPERAND_TYPE_NONE}},
437 {"WriteOnly",
Lei Zhangb36e7042015-10-28 13:40:52 -0400438 SpvAccessQualifierWriteOnly,
439 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100440 {SPV_OPERAND_TYPE_NONE}},
441 {"ReadWrite",
Lei Zhangb36e7042015-10-28 13:40:52 -0400442 SpvAccessQualifierReadWrite,
443 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100444 {SPV_OPERAND_TYPE_NONE}},
445};
446
447static const spv_operand_desc_t functionParameterAttributeEntries[] = {
448 {"Zext",
Lei Zhangb36e7042015-10-28 13:40:52 -0400449 SpvFunctionParameterAttributeZext,
450 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100451 {SPV_OPERAND_TYPE_NONE}},
452 {"Sext",
Lei Zhangb36e7042015-10-28 13:40:52 -0400453 SpvFunctionParameterAttributeSext,
454 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100455 {SPV_OPERAND_TYPE_NONE}},
456 {"ByVal",
Lei Zhangb36e7042015-10-28 13:40:52 -0400457 SpvFunctionParameterAttributeByVal,
458 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100459 {SPV_OPERAND_TYPE_NONE}},
460 {"Sret",
Lei Zhangb36e7042015-10-28 13:40:52 -0400461 SpvFunctionParameterAttributeSret,
462 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100463 {SPV_OPERAND_TYPE_NONE}},
464 {"NoAlias",
Lei Zhangb36e7042015-10-28 13:40:52 -0400465 SpvFunctionParameterAttributeNoAlias,
466 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100467 {SPV_OPERAND_TYPE_NONE}},
David Neto37547b22015-09-10 13:23:11 -0400468 {"NoCapture",
Lei Zhangb36e7042015-10-28 13:40:52 -0400469 SpvFunctionParameterAttributeNoCapture,
470 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100471 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100472 {"NoWrite",
Lei Zhangb36e7042015-10-28 13:40:52 -0400473 SpvFunctionParameterAttributeNoWrite,
474 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100475 {SPV_OPERAND_TYPE_NONE}},
476 {"NoReadWrite",
Lei Zhangb36e7042015-10-28 13:40:52 -0400477 SpvFunctionParameterAttributeNoReadWrite,
478 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100479 {SPV_OPERAND_TYPE_NONE}},
480};
481
482static const spv_operand_desc_t decorationEntries[] = {
Lei Zhang604e5ce2015-08-14 14:46:43 -0400483 {"RelaxedPrecision",
Lei Zhangb36e7042015-10-28 13:40:52 -0400484 SpvDecorationRelaxedPrecision,
485 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100486 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400487 {
Dejan Mircevski50babb22015-09-29 10:56:32 -0400488 "SpecId",
Lei Zhangb36e7042015-10-28 13:40:52 -0400489 SpvDecorationSpecId,
490 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Lei Zhang6483bd72015-10-14 17:02:39 -0400491 {SPV_OPERAND_TYPE_LITERAL_INTEGER},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400492 },
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100493 {"Block",
Lei Zhangb36e7042015-10-28 13:40:52 -0400494 SpvDecorationBlock,
495 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100496 {SPV_OPERAND_TYPE_NONE}},
497 {"BufferBlock",
Lei Zhangb36e7042015-10-28 13:40:52 -0400498 SpvDecorationBufferBlock,
499 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100500 {SPV_OPERAND_TYPE_NONE}},
501 {"RowMajor",
Lei Zhangb36e7042015-10-28 13:40:52 -0400502 SpvDecorationRowMajor,
503 SPV_CAPABILITY_AS_MASK(SpvCapabilityMatrix),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100504 {SPV_OPERAND_TYPE_NONE}},
505 {"ColMajor",
Lei Zhangb36e7042015-10-28 13:40:52 -0400506 SpvDecorationColMajor,
507 SPV_CAPABILITY_AS_MASK(SpvCapabilityMatrix),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100508 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400509 {"ArrayStride",
Lei Zhangb36e7042015-10-28 13:40:52 -0400510 SpvDecorationArrayStride,
511 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Lei Zhang6483bd72015-10-14 17:02:39 -0400512 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400513 {"MatrixStride",
Lei Zhangb36e7042015-10-28 13:40:52 -0400514 SpvDecorationMatrixStride,
515 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Lei Zhang6483bd72015-10-14 17:02:39 -0400516 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100517 {"GLSLShared",
Lei Zhangb36e7042015-10-28 13:40:52 -0400518 SpvDecorationGLSLShared,
519 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100520 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100521 {"GLSLPacked",
Lei Zhangb36e7042015-10-28 13:40:52 -0400522 SpvDecorationGLSLPacked,
523 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100524 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400525 {"CPacked",
Lei Zhangb36e7042015-10-28 13:40:52 -0400526 SpvDecorationCPacked,
527 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Lei Zhang604e5ce2015-08-14 14:46:43 -0400528 {SPV_OPERAND_TYPE_NONE}},
529 {"BuiltIn",
Lei Zhangb36e7042015-10-28 13:40:52 -0400530 SpvDecorationBuiltIn,
531 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Lei Zhang604e5ce2015-08-14 14:46:43 -0400532 {SPV_OPERAND_TYPE_BUILT_IN, SPV_OPERAND_TYPE_NONE}},
David Netodbaf4072015-09-22 16:23:06 -0400533 {"NoPerspective",
Lei Zhangb36e7042015-10-28 13:40:52 -0400534 SpvDecorationNoPerspective,
535 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100536 {SPV_OPERAND_TYPE_NONE}},
537 {"Flat",
Lei Zhangb36e7042015-10-28 13:40:52 -0400538 SpvDecorationFlat,
539 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100540 {SPV_OPERAND_TYPE_NONE}},
541 {"Patch",
Lei Zhangb36e7042015-10-28 13:40:52 -0400542 SpvDecorationPatch,
543 SPV_CAPABILITY_AS_MASK(SpvCapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100544 {SPV_OPERAND_TYPE_NONE}},
545 {"Centroid",
Lei Zhangb36e7042015-10-28 13:40:52 -0400546 SpvDecorationCentroid,
547 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100548 {SPV_OPERAND_TYPE_NONE}},
549 {"Sample",
Lei Zhangb36e7042015-10-28 13:40:52 -0400550 SpvDecorationSample,
551 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100552 {SPV_OPERAND_TYPE_NONE}},
553 {"Invariant",
Lei Zhangb36e7042015-10-28 13:40:52 -0400554 SpvDecorationInvariant,
555 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100556 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang1a0334e2015-11-02 09:41:20 -0500557 {"Restrict", SpvDecorationRestrict, 0, {SPV_OPERAND_TYPE_NONE}},
558 {"Aliased", SpvDecorationAliased, 0, {SPV_OPERAND_TYPE_NONE}},
559 {"Volatile", SpvDecorationVolatile, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100560 {"Constant",
Lei Zhangb36e7042015-10-28 13:40:52 -0400561 SpvDecorationConstant,
562 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100563 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang1a0334e2015-11-02 09:41:20 -0500564 {"Coherent", SpvDecorationCoherent, 0, {SPV_OPERAND_TYPE_NONE}},
565 {"NonWritable", SpvDecorationNonWritable, 0, {SPV_OPERAND_TYPE_NONE}},
566 {"NonReadable", SpvDecorationNonReadable, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100567 {"Uniform",
Lei Zhangb36e7042015-10-28 13:40:52 -0400568 SpvDecorationUniform,
569 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100570 {SPV_OPERAND_TYPE_NONE}},
David Neto37547b22015-09-10 13:23:11 -0400571 {"SaturatedConversion",
Lei Zhangb36e7042015-10-28 13:40:52 -0400572 SpvDecorationSaturatedConversion,
573 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100574 {SPV_OPERAND_TYPE_NONE}},
575 {"Stream",
Lei Zhangb36e7042015-10-28 13:40:52 -0400576 SpvDecorationStream,
David Neto12511c82015-11-12 15:30:28 -0500577 SPV_CAPABILITY_AS_MASK(SpvCapabilityGeometryStreams),
Lei Zhang6483bd72015-10-14 17:02:39 -0400578 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100579 {"Location",
Lei Zhangb36e7042015-10-28 13:40:52 -0400580 SpvDecorationLocation,
581 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Lei Zhang6483bd72015-10-14 17:02:39 -0400582 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100583 {"Component",
Lei Zhangb36e7042015-10-28 13:40:52 -0400584 SpvDecorationComponent,
585 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Lei Zhang6483bd72015-10-14 17:02:39 -0400586 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100587 {"Index",
Lei Zhangb36e7042015-10-28 13:40:52 -0400588 SpvDecorationIndex,
589 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Lei Zhang6483bd72015-10-14 17:02:39 -0400590 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100591 {"Binding",
Lei Zhangb36e7042015-10-28 13:40:52 -0400592 SpvDecorationBinding,
593 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Lei Zhang6483bd72015-10-14 17:02:39 -0400594 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100595 {"DescriptorSet",
Lei Zhangb36e7042015-10-28 13:40:52 -0400596 SpvDecorationDescriptorSet,
597 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Lei Zhang6483bd72015-10-14 17:02:39 -0400598 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100599 {"Offset",
Lei Zhangb36e7042015-10-28 13:40:52 -0400600 SpvDecorationOffset,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100601 0,
Lei Zhang6483bd72015-10-14 17:02:39 -0400602 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100603 {"XfbBuffer",
Lei Zhangb36e7042015-10-28 13:40:52 -0400604 SpvDecorationXfbBuffer,
605 SPV_CAPABILITY_AS_MASK(SpvCapabilityTransformFeedback),
Lei Zhang6483bd72015-10-14 17:02:39 -0400606 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400607 {"XfbStride",
Lei Zhangb36e7042015-10-28 13:40:52 -0400608 SpvDecorationXfbStride,
609 SPV_CAPABILITY_AS_MASK(SpvCapabilityTransformFeedback),
Lei Zhang6483bd72015-10-14 17:02:39 -0400610 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100611 {"FuncParamAttr",
Lei Zhangb36e7042015-10-28 13:40:52 -0400612 SpvDecorationFuncParamAttr,
613 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100614 {SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE, SPV_OPERAND_TYPE_NONE}},
615 {"FPRoundingMode",
Lei Zhangb36e7042015-10-28 13:40:52 -0400616 SpvDecorationFPRoundingMode,
617 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100618 {SPV_OPERAND_TYPE_FP_ROUNDING_MODE, SPV_OPERAND_TYPE_NONE}},
619 {"FPFastMathMode",
Lei Zhangb36e7042015-10-28 13:40:52 -0400620 SpvDecorationFPFastMathMode,
621 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100622 {SPV_OPERAND_TYPE_FP_FAST_MATH_MODE, SPV_OPERAND_TYPE_NONE}},
623 {"LinkageAttributes",
Lei Zhangb36e7042015-10-28 13:40:52 -0400624 SpvDecorationLinkageAttributes,
625 SPV_CAPABILITY_AS_MASK(SpvCapabilityLinkage),
Dejan Mircevski50babb22015-09-29 10:56:32 -0400626 {SPV_OPERAND_TYPE_LITERAL_STRING, SPV_OPERAND_TYPE_LINKAGE_TYPE,
627 SPV_OPERAND_TYPE_NONE}},
David Netod7687982015-09-23 14:59:27 -0400628 {"NoContraction",
Lei Zhangb36e7042015-10-28 13:40:52 -0400629 SpvDecorationNoContraction,
630 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
David Netod7687982015-09-23 14:59:27 -0400631 {SPV_OPERAND_TYPE_NONE}},
David Netod02f68a2015-11-11 12:32:21 -0500632 {"InputAttachmentIndex",
633 SpvDecorationInputAttachmentIndex,
634 SPV_CAPABILITY_AS_MASK(SpvCapabilityInputAttachment),
635 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
David Netod7687982015-09-23 14:59:27 -0400636 {"Alignment",
Lei Zhangb36e7042015-10-28 13:40:52 -0400637 SpvDecorationAlignment,
638 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Lei Zhang6483bd72015-10-14 17:02:39 -0400639 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100640};
641
642static const spv_operand_desc_t builtInEntries[] = {
643 {"Position",
Lei Zhangb36e7042015-10-28 13:40:52 -0400644 SpvBuiltInPosition,
645 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100646 {SPV_OPERAND_TYPE_NONE}},
647 {"PointSize",
Lei Zhangb36e7042015-10-28 13:40:52 -0400648 SpvBuiltInPointSize,
649 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100650 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100651 {"ClipDistance",
Lei Zhangb36e7042015-10-28 13:40:52 -0400652 SpvBuiltInClipDistance,
653 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100654 {SPV_OPERAND_TYPE_NONE}},
655 {"CullDistance",
Lei Zhangb36e7042015-10-28 13:40:52 -0400656 SpvBuiltInCullDistance,
657 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100658 {SPV_OPERAND_TYPE_NONE}},
659 {"VertexId",
Lei Zhangb36e7042015-10-28 13:40:52 -0400660 SpvBuiltInVertexId,
661 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100662 {SPV_OPERAND_TYPE_NONE}},
663 {"InstanceId",
Lei Zhangb36e7042015-10-28 13:40:52 -0400664 SpvBuiltInInstanceId,
665 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100666 {SPV_OPERAND_TYPE_NONE}},
667 {"PrimitiveId",
Lei Zhangb36e7042015-10-28 13:40:52 -0400668 SpvBuiltInPrimitiveId,
669 SPV_CAPABILITY_AS_MASK(SpvCapabilityGeometry) |
670 SPV_CAPABILITY_AS_MASK(SpvCapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100671 {SPV_OPERAND_TYPE_NONE}},
672 {"InvocationId",
Lei Zhangb36e7042015-10-28 13:40:52 -0400673 SpvBuiltInInvocationId,
674 SPV_CAPABILITY_AS_MASK(SpvCapabilityGeometry) |
675 SPV_CAPABILITY_AS_MASK(SpvCapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100676 {SPV_OPERAND_TYPE_NONE}},
677 {"Layer",
Lei Zhangb36e7042015-10-28 13:40:52 -0400678 SpvBuiltInLayer,
679 SPV_CAPABILITY_AS_MASK(SpvCapabilityGeometry),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100680 {SPV_OPERAND_TYPE_NONE}},
681 {"ViewportIndex",
Lei Zhangb36e7042015-10-28 13:40:52 -0400682 SpvBuiltInViewportIndex,
683 SPV_CAPABILITY_AS_MASK(SpvCapabilityGeometry),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100684 {SPV_OPERAND_TYPE_NONE}},
685 {"TessLevelOuter",
Lei Zhangb36e7042015-10-28 13:40:52 -0400686 SpvBuiltInTessLevelOuter,
687 SPV_CAPABILITY_AS_MASK(SpvCapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100688 {SPV_OPERAND_TYPE_NONE}},
689 {"TessLevelInner",
Lei Zhangb36e7042015-10-28 13:40:52 -0400690 SpvBuiltInTessLevelInner,
691 SPV_CAPABILITY_AS_MASK(SpvCapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100692 {SPV_OPERAND_TYPE_NONE}},
693 {"TessCoord",
Lei Zhangb36e7042015-10-28 13:40:52 -0400694 SpvBuiltInTessCoord,
695 SPV_CAPABILITY_AS_MASK(SpvCapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100696 {SPV_OPERAND_TYPE_NONE}},
697 {"PatchVertices",
Lei Zhangb36e7042015-10-28 13:40:52 -0400698 SpvBuiltInPatchVertices,
699 SPV_CAPABILITY_AS_MASK(SpvCapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100700 {SPV_OPERAND_TYPE_NONE}},
701 {"FragCoord",
Lei Zhangb36e7042015-10-28 13:40:52 -0400702 SpvBuiltInFragCoord,
703 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100704 {SPV_OPERAND_TYPE_NONE}},
705 {"PointCoord",
Lei Zhangb36e7042015-10-28 13:40:52 -0400706 SpvBuiltInPointCoord,
707 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100708 {SPV_OPERAND_TYPE_NONE}},
709 {"FrontFacing",
Lei Zhangb36e7042015-10-28 13:40:52 -0400710 SpvBuiltInFrontFacing,
711 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100712 {SPV_OPERAND_TYPE_NONE}},
713 {"SampleId",
Lei Zhangb36e7042015-10-28 13:40:52 -0400714 SpvBuiltInSampleId,
715 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100716 {SPV_OPERAND_TYPE_NONE}},
717 {"SamplePosition",
Lei Zhangb36e7042015-10-28 13:40:52 -0400718 SpvBuiltInSamplePosition,
719 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100720 {SPV_OPERAND_TYPE_NONE}},
721 {"SampleMask",
Lei Zhangb36e7042015-10-28 13:40:52 -0400722 SpvBuiltInSampleMask,
723 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100724 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100725 {"FragDepth",
Lei Zhangb36e7042015-10-28 13:40:52 -0400726 SpvBuiltInFragDepth,
727 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100728 {SPV_OPERAND_TYPE_NONE}},
729 {"HelperInvocation",
Lei Zhangb36e7042015-10-28 13:40:52 -0400730 SpvBuiltInHelperInvocation,
731 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100732 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang1a0334e2015-11-02 09:41:20 -0500733 {"NumWorkgroups", SpvBuiltInNumWorkgroups, 0, {SPV_OPERAND_TYPE_NONE}},
734 {"WorkgroupSize", SpvBuiltInWorkgroupSize, 0, {SPV_OPERAND_TYPE_NONE}},
735 {"WorkgroupId", SpvBuiltInWorkgroupId, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100736 {"LocalInvocationId",
Lei Zhangb36e7042015-10-28 13:40:52 -0400737 SpvBuiltInLocalInvocationId,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100738 0,
739 {SPV_OPERAND_TYPE_NONE}},
740 {"GlobalInvocationId",
Lei Zhangb36e7042015-10-28 13:40:52 -0400741 SpvBuiltInGlobalInvocationId,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100742 0,
743 {SPV_OPERAND_TYPE_NONE}},
744 {"LocalInvocationIndex",
Lei Zhangb36e7042015-10-28 13:40:52 -0400745 SpvBuiltInLocalInvocationIndex,
746 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100747 {SPV_OPERAND_TYPE_NONE}},
748 {"WorkDim",
Lei Zhangb36e7042015-10-28 13:40:52 -0400749 SpvBuiltInWorkDim,
750 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100751 {SPV_OPERAND_TYPE_NONE}},
752 {"GlobalSize",
Lei Zhangb36e7042015-10-28 13:40:52 -0400753 SpvBuiltInGlobalSize,
754 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100755 {SPV_OPERAND_TYPE_NONE}},
756 {"EnqueuedWorkgroupSize",
Lei Zhangb36e7042015-10-28 13:40:52 -0400757 SpvBuiltInEnqueuedWorkgroupSize,
758 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100759 {SPV_OPERAND_TYPE_NONE}},
760 {"GlobalOffset",
Lei Zhangb36e7042015-10-28 13:40:52 -0400761 SpvBuiltInGlobalOffset,
762 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100763 {SPV_OPERAND_TYPE_NONE}},
764 {"GlobalLinearId",
Lei Zhangb36e7042015-10-28 13:40:52 -0400765 SpvBuiltInGlobalLinearId,
766 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100767 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100768 {"SubgroupSize",
Lei Zhangb36e7042015-10-28 13:40:52 -0400769 SpvBuiltInSubgroupSize,
770 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100771 {SPV_OPERAND_TYPE_NONE}},
772 {"SubgroupMaxSize",
Lei Zhangb36e7042015-10-28 13:40:52 -0400773 SpvBuiltInSubgroupMaxSize,
774 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100775 {SPV_OPERAND_TYPE_NONE}},
776 {"NumSubgroups",
Lei Zhangb36e7042015-10-28 13:40:52 -0400777 SpvBuiltInNumSubgroups,
778 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100779 {SPV_OPERAND_TYPE_NONE}},
780 {"NumEnqueuedSubgroups",
Lei Zhangb36e7042015-10-28 13:40:52 -0400781 SpvBuiltInNumEnqueuedSubgroups,
782 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100783 {SPV_OPERAND_TYPE_NONE}},
784 {"SubgroupId",
Lei Zhangb36e7042015-10-28 13:40:52 -0400785 SpvBuiltInSubgroupId,
786 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100787 {SPV_OPERAND_TYPE_NONE}},
788 {"SubgroupLocalInvocationId",
Lei Zhangb36e7042015-10-28 13:40:52 -0400789 SpvBuiltInSubgroupLocalInvocationId,
790 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100791 {SPV_OPERAND_TYPE_NONE}},
David Neto2d1b5e52015-09-23 15:35:27 -0400792 {"VertexIndex",
Lei Zhangb36e7042015-10-28 13:40:52 -0400793 SpvBuiltInVertexIndex,
794 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
David Neto2d1b5e52015-09-23 15:35:27 -0400795 {SPV_OPERAND_TYPE_NONE}},
796 {"InstanceIndex",
Lei Zhangb36e7042015-10-28 13:40:52 -0400797 SpvBuiltInInstanceIndex,
798 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
David Neto2d1b5e52015-09-23 15:35:27 -0400799 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100800};
801
802static const spv_operand_desc_t selectionControlEntries[] = {
Lei Zhang1a0334e2015-11-02 09:41:20 -0500803 {"None", SpvSelectionControlMaskNone, 0, {SPV_OPERAND_TYPE_NONE}},
804 {"Flatten", SpvSelectionControlFlattenMask, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100805 {"DontFlatten",
Lei Zhangb36e7042015-10-28 13:40:52 -0400806 SpvSelectionControlDontFlattenMask,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100807 0,
808 {SPV_OPERAND_TYPE_NONE}},
809};
810
811static const spv_operand_desc_t loopControlEntries[] = {
Lei Zhang1a0334e2015-11-02 09:41:20 -0500812 {"None", SpvLoopControlMaskNone, 0, {SPV_OPERAND_TYPE_NONE}},
813 {"Unroll", SpvLoopControlUnrollMask, 0, {SPV_OPERAND_TYPE_NONE}},
814 {"DontUnroll", SpvLoopControlDontUnrollMask, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100815};
816
817static const spv_operand_desc_t functionControlEntries[] = {
Lei Zhang1a0334e2015-11-02 09:41:20 -0500818 {"None", SpvFunctionControlMaskNone, 0, {SPV_OPERAND_TYPE_NONE}},
819 {"Inline", SpvFunctionControlInlineMask, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100820 {"DontInline",
Lei Zhangb36e7042015-10-28 13:40:52 -0400821 SpvFunctionControlDontInlineMask,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100822 0,
823 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang1a0334e2015-11-02 09:41:20 -0500824 {"Pure", SpvFunctionControlPureMask, 0, {SPV_OPERAND_TYPE_NONE}},
825 {"Const", SpvFunctionControlConstMask, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100826};
827
828static const spv_operand_desc_t memorySemanticsEntries[] = {
David Netobfa3d862015-09-25 10:30:27 -0400829 // "Relaxed" should be a synonym for "None".
830 // Put the Relaxed entry first so that the disassembler
831 // will prefer to emit "Relaxed".
Lei Zhang1a0334e2015-11-02 09:41:20 -0500832 {"Relaxed", SpvMemorySemanticsMaskNone, 0, {SPV_OPERAND_TYPE_NONE}},
833 {"None", SpvMemorySemanticsMaskNone, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100834 {"SequentiallyConsistent",
Lei Zhangb36e7042015-10-28 13:40:52 -0400835 SpvMemorySemanticsSequentiallyConsistentMask,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100836 0,
837 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang1a0334e2015-11-02 09:41:20 -0500838 {"Acquire", SpvMemorySemanticsAcquireMask, 0, {SPV_OPERAND_TYPE_NONE}},
839 {"Release", SpvMemorySemanticsReleaseMask, 0, {SPV_OPERAND_TYPE_NONE}},
David Netod02f68a2015-11-11 12:32:21 -0500840 {"AcquireRelease",
841 SpvMemorySemanticsAcquireReleaseMask,
842 0,
843 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100844 {"UniformMemory",
Lei Zhangb36e7042015-10-28 13:40:52 -0400845 SpvMemorySemanticsUniformMemoryMask,
846 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100847 {SPV_OPERAND_TYPE_NONE}},
848 {"SubgroupMemory",
Lei Zhangb36e7042015-10-28 13:40:52 -0400849 SpvMemorySemanticsSubgroupMemoryMask,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100850 0,
851 {SPV_OPERAND_TYPE_NONE}},
David Netod02f68a2015-11-11 12:32:21 -0500852 {"WorkgroupMemory",
853 SpvMemorySemanticsWorkgroupMemoryMask,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100854 0,
855 {SPV_OPERAND_TYPE_NONE}},
David Netod02f68a2015-11-11 12:32:21 -0500856 {"CrossWorkgroupMemory",
857 SpvMemorySemanticsCrossWorkgroupMemoryMask,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100858 0,
859 {SPV_OPERAND_TYPE_NONE}},
860 {"AtomicCounterMemory",
Lei Zhangb36e7042015-10-28 13:40:52 -0400861 SpvMemorySemanticsAtomicCounterMemoryMask,
862 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100863 {SPV_OPERAND_TYPE_NONE}},
864 {
Dejan Mircevski50babb22015-09-29 10:56:32 -0400865 "ImageMemory",
Lei Zhangb36e7042015-10-28 13:40:52 -0400866 SpvMemorySemanticsImageMemoryMask,
Dejan Mircevski50babb22015-09-29 10:56:32 -0400867 0,
868 {SPV_OPERAND_TYPE_NONE},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100869 },
870};
871
872static const spv_operand_desc_t memoryAccessEntries[] = {
Lei Zhang1a0334e2015-11-02 09:41:20 -0500873 {"None", SpvMemoryAccessMaskNone, 0, {SPV_OPERAND_TYPE_NONE}},
874 {"Volatile", SpvMemoryAccessVolatileMask, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100875 {
Dejan Mircevski50babb22015-09-29 10:56:32 -0400876 "Aligned",
Lei Zhangb36e7042015-10-28 13:40:52 -0400877 SpvMemoryAccessAlignedMask,
Dejan Mircevski50babb22015-09-29 10:56:32 -0400878 0,
Lei Zhang6483bd72015-10-14 17:02:39 -0400879 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100880 },
Lei Zhang1a0334e2015-11-02 09:41:20 -0500881 {"Nontemporal", SpvMemoryAccessNontemporalMask, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100882};
883
884static const spv_operand_desc_t scopeEntries[] = {
Lei Zhang1a0334e2015-11-02 09:41:20 -0500885 {"CrossDevice", SpvScopeCrossDevice, 0, {SPV_OPERAND_TYPE_NONE}},
Lei Zhangb36e7042015-10-28 13:40:52 -0400886 {"Device", SpvScopeDevice, 0, {SPV_OPERAND_TYPE_NONE}},
Lei Zhang1a0334e2015-11-02 09:41:20 -0500887 {"Workgroup", SpvScopeWorkgroup, 0, {SPV_OPERAND_TYPE_NONE}},
888 {"Subgroup", SpvScopeSubgroup, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100889 {
Lei Zhang1a0334e2015-11-02 09:41:20 -0500890 "Invocation", SpvScopeInvocation, 0, {SPV_OPERAND_TYPE_NONE},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100891 },
892};
893
894static const spv_operand_desc_t groupOperationEntries[] = {
895 {"Reduce",
Lei Zhangb36e7042015-10-28 13:40:52 -0400896 SpvGroupOperationReduce,
897 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100898 {SPV_OPERAND_TYPE_NONE}},
899 {"InclusiveScan",
Lei Zhangb36e7042015-10-28 13:40:52 -0400900 SpvGroupOperationInclusiveScan,
901 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100902 {SPV_OPERAND_TYPE_NONE}},
903 {"ExclusiveScan",
Lei Zhangb36e7042015-10-28 13:40:52 -0400904 SpvGroupOperationExclusiveScan,
905 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100906 {SPV_OPERAND_TYPE_NONE}},
907};
908
909static const spv_operand_desc_t kernelKernelEnqueueFlagssEntries[] = {
910 {"NoWait",
Lei Zhangb36e7042015-10-28 13:40:52 -0400911 SpvKernelEnqueueFlagsNoWait,
912 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100913 {SPV_OPERAND_TYPE_NONE}},
914 {"WaitKernel",
Lei Zhangb36e7042015-10-28 13:40:52 -0400915 SpvKernelEnqueueFlagsWaitKernel,
916 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100917 {SPV_OPERAND_TYPE_NONE}},
918 {"WaitWorkGroup",
Lei Zhangb36e7042015-10-28 13:40:52 -0400919 SpvKernelEnqueueFlagsWaitWorkGroup,
920 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100921 {SPV_OPERAND_TYPE_NONE}},
922};
923
924static const spv_operand_desc_t kernelProfilingInfoEntries[] = {
Lei Zhang1a0334e2015-11-02 09:41:20 -0500925 {"None", SpvKernelProfilingInfoMaskNone, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100926 {"CmdExecTime",
Lei Zhangb36e7042015-10-28 13:40:52 -0400927 SpvKernelProfilingInfoCmdExecTimeMask,
928 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100929 {SPV_OPERAND_TYPE_NONE}},
930};
931
David Netod30b2332015-09-23 16:04:24 -0400932// A macro for defining a capability that doesn't depend on another capability.
Lei Zhangb36e7042015-10-28 13:40:52 -0400933#define CASE(NAME) \
934 { \
935 #NAME, SpvCapability##NAME, 0, { SPV_OPERAND_TYPE_NONE } \
David Netod30b2332015-09-23 16:04:24 -0400936 }
937
938// A macro for defining a capability that depends on another.
Lei Zhangb36e7042015-10-28 13:40:52 -0400939#define CASE_CAP(NAME, CAP) \
940 { \
941 #NAME, SpvCapability##NAME, SPV_CAPABILITY_AS_MASK(SpvCapability##CAP), { \
942 SPV_OPERAND_TYPE_NONE \
943 } \
David Netod30b2332015-09-23 16:04:24 -0400944 }
945
David Neto64a9be92015-11-18 15:48:32 -0500946// clang-format off
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100947static const spv_operand_desc_t capabilityInfoEntries[] = {
David Netod30b2332015-09-23 16:04:24 -0400948 CASE(Matrix),
949 CASE_CAP(Shader, Matrix),
950 CASE_CAP(Geometry, Shader),
951 CASE_CAP(Tessellation, Shader),
952 CASE(Addresses),
953 CASE(Linkage),
954 CASE(Kernel),
955 CASE_CAP(Vector16, Kernel),
956 CASE_CAP(Float16Buffer, Kernel),
957 CASE_CAP(Float16, Float16Buffer),
958 CASE(Float64),
959 CASE(Int64),
960 CASE_CAP(Int64Atomics, Int64),
961 CASE_CAP(ImageBasic, Kernel),
962 CASE_CAP(ImageReadWrite, Kernel),
963 CASE_CAP(ImageMipmap, Kernel),
David Netod02f68a2015-11-11 12:32:21 -0500964 // Value 16 intentionally missing.
David Netod30b2332015-09-23 16:04:24 -0400965 CASE_CAP(Pipes, Kernel),
966 CASE(Groups),
967 CASE_CAP(DeviceEnqueue, Kernel),
968 CASE_CAP(LiteralSampler, Kernel),
969 CASE_CAP(AtomicStorage, Shader),
970 CASE(Int16),
971 CASE_CAP(TessellationPointSize, Tessellation),
972 CASE_CAP(GeometryPointSize, Geometry),
973 CASE_CAP(ImageGatherExtended, Shader),
David Netod02f68a2015-11-11 12:32:21 -0500974 // Value 26 intentionally missing.
David Netod30b2332015-09-23 16:04:24 -0400975 CASE_CAP(StorageImageMultisample, Shader),
976 CASE_CAP(UniformBufferArrayDynamicIndexing, Shader),
977 CASE_CAP(SampledImageArrayDynamicIndexing, Shader),
978 CASE_CAP(StorageBufferArrayDynamicIndexing, Shader),
979 CASE_CAP(StorageImageArrayDynamicIndexing, Shader),
980 CASE_CAP(ClipDistance, Shader),
981 CASE_CAP(CullDistance, Shader),
982 CASE_CAP(ImageCubeArray, SampledCubeArray),
983 CASE_CAP(SampleRateShading, Shader),
984 CASE_CAP(ImageRect, SampledRect),
985 CASE_CAP(SampledRect, Shader),
986 CASE_CAP(GenericPointer, Addresses),
987 CASE_CAP(Int8, Kernel),
David Netod02f68a2015-11-11 12:32:21 -0500988 CASE_CAP(InputAttachment, Shader),
David Netod30b2332015-09-23 16:04:24 -0400989 CASE_CAP(SparseResidency, Shader),
990 CASE_CAP(MinLod, Shader),
991 CASE_CAP(Sampled1D, Shader),
992 CASE_CAP(Image1D, Sampled1D),
993 CASE_CAP(SampledCubeArray, Shader),
994 CASE_CAP(SampledBuffer, Shader),
995 CASE_CAP(ImageBuffer, SampledBuffer),
996 CASE_CAP(ImageMSArray, Shader),
David Netod02f68a2015-11-11 12:32:21 -0500997 CASE_CAP(StorageImageExtendedFormats, Shader),
David Netod30b2332015-09-23 16:04:24 -0400998 CASE_CAP(ImageQuery, Shader),
999 CASE_CAP(DerivativeControl, Shader),
1000 CASE_CAP(InterpolationFunction, Shader),
1001 CASE_CAP(TransformFeedback, Shader),
David Neto12511c82015-11-12 15:30:28 -05001002 CASE_CAP(GeometryStreams, Geometry),
David Neto5f7ed912015-11-12 15:44:25 -05001003 CASE_CAP(StorageImageReadWithoutFormat, Shader),
1004 CASE_CAP(StorageImageWriteWithoutFormat, Shader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001005};
David Neto64a9be92015-11-18 15:48:32 -05001006// clang-format on
David Netod30b2332015-09-23 16:04:24 -04001007#undef CASE
1008#undef CASE_CAP
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001009
David Netoba73a7c2016-01-06 13:08:39 -05001010// Evaluates to the number of elements of array A.
1011// If we could use constexpr, then we could make this a template function.
1012// If the source arrays were std::array, then we could have used
1013// std::array::size.
1014#define ARRAY_SIZE(A) (static_cast<uint32_t>(sizeof(A)/sizeof(A[0])))
1015
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001016static const spv_operand_desc_group_t opcodeEntryTypes[] = {
David Netoba73a7c2016-01-06 13:08:39 -05001017 // TODO(dneto): Reformat this table.
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001018 {SPV_OPERAND_TYPE_SOURCE_LANGUAGE,
David Netoba73a7c2016-01-06 13:08:39 -05001019 ARRAY_SIZE(sourceLanguageEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001020 sourceLanguageEntries},
1021 {SPV_OPERAND_TYPE_EXECUTION_MODEL,
David Netoba73a7c2016-01-06 13:08:39 -05001022 ARRAY_SIZE(executionModelEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001023 executionModelEntries},
1024 {SPV_OPERAND_TYPE_ADDRESSING_MODEL,
David Netoba73a7c2016-01-06 13:08:39 -05001025 ARRAY_SIZE(addressingModelEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001026 addressingModelEntries},
1027 {SPV_OPERAND_TYPE_MEMORY_MODEL,
David Netoba73a7c2016-01-06 13:08:39 -05001028 ARRAY_SIZE(memoryModelEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001029 memoryModelEntries},
1030 {SPV_OPERAND_TYPE_EXECUTION_MODE,
David Netoba73a7c2016-01-06 13:08:39 -05001031 ARRAY_SIZE(executionModeEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001032 executionModeEntries},
1033 {SPV_OPERAND_TYPE_STORAGE_CLASS,
David Netoba73a7c2016-01-06 13:08:39 -05001034 ARRAY_SIZE(storageClassEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001035 storageClassEntries},
1036 {SPV_OPERAND_TYPE_DIMENSIONALITY,
David Netoba73a7c2016-01-06 13:08:39 -05001037 ARRAY_SIZE(dimensionalityEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001038 dimensionalityEntries},
1039 {SPV_OPERAND_TYPE_SAMPLER_ADDRESSING_MODE,
David Netoba73a7c2016-01-06 13:08:39 -05001040 ARRAY_SIZE(samplerAddressingModeEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001041 samplerAddressingModeEntries},
1042 {SPV_OPERAND_TYPE_SAMPLER_FILTER_MODE,
David Netoba73a7c2016-01-06 13:08:39 -05001043 ARRAY_SIZE(samplerFilterModeEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001044 samplerFilterModeEntries},
David Netob30a0c52015-09-16 15:56:43 -04001045 {SPV_OPERAND_TYPE_SAMPLER_IMAGE_FORMAT,
David Netoba73a7c2016-01-06 13:08:39 -05001046 ARRAY_SIZE(samplerImageFormatEntries),
David Netob30a0c52015-09-16 15:56:43 -04001047 samplerImageFormatEntries},
David Netoddda85a2015-10-02 17:10:10 -04001048 {SPV_OPERAND_TYPE_IMAGE_CHANNEL_ORDER,
David Netoba73a7c2016-01-06 13:08:39 -05001049 ARRAY_SIZE(imageChannelOrderEntries),
David Netoddda85a2015-10-02 17:10:10 -04001050 imageChannelOrderEntries},
1051 {SPV_OPERAND_TYPE_IMAGE_CHANNEL_DATA_TYPE,
David Netoba73a7c2016-01-06 13:08:39 -05001052 ARRAY_SIZE(imageChannelDataTypeEntries),
David Netoddda85a2015-10-02 17:10:10 -04001053 imageChannelDataTypeEntries},
David Neto201caf72015-11-04 17:38:17 -05001054 {SPV_OPERAND_TYPE_IMAGE,
David Netoba73a7c2016-01-06 13:08:39 -05001055 ARRAY_SIZE(imageOperandEntries),
David Neto201caf72015-11-04 17:38:17 -05001056 imageOperandEntries},
1057 {SPV_OPERAND_TYPE_OPTIONAL_IMAGE, // Same as *_IMAGE
David Netoba73a7c2016-01-06 13:08:39 -05001058 ARRAY_SIZE(imageOperandEntries),
David Netoee1b3bb2015-09-18 11:19:18 -04001059 imageOperandEntries},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001060 {SPV_OPERAND_TYPE_FP_FAST_MATH_MODE,
David Netoba73a7c2016-01-06 13:08:39 -05001061 ARRAY_SIZE(fpFastMathModeEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001062 fpFastMathModeEntries},
1063 {SPV_OPERAND_TYPE_FP_ROUNDING_MODE,
David Netoba73a7c2016-01-06 13:08:39 -05001064 ARRAY_SIZE(fpRoundingModeEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001065 fpRoundingModeEntries},
1066 {SPV_OPERAND_TYPE_LINKAGE_TYPE,
David Netoba73a7c2016-01-06 13:08:39 -05001067 ARRAY_SIZE(linkageTypeEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001068 linkageTypeEntries},
1069 {SPV_OPERAND_TYPE_ACCESS_QUALIFIER,
David Netoba73a7c2016-01-06 13:08:39 -05001070 ARRAY_SIZE(accessQualifierEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001071 accessQualifierEntries},
1072 {SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE,
David Netoba73a7c2016-01-06 13:08:39 -05001073 ARRAY_SIZE(functionParameterAttributeEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001074 functionParameterAttributeEntries},
1075 {SPV_OPERAND_TYPE_DECORATION,
David Netoba73a7c2016-01-06 13:08:39 -05001076 ARRAY_SIZE(decorationEntries), decorationEntries},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001077 {SPV_OPERAND_TYPE_BUILT_IN,
David Netoba73a7c2016-01-06 13:08:39 -05001078 ARRAY_SIZE(builtInEntries), builtInEntries},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001079 {SPV_OPERAND_TYPE_SELECTION_CONTROL,
David Netoba73a7c2016-01-06 13:08:39 -05001080 ARRAY_SIZE(selectionControlEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001081 selectionControlEntries},
1082 {SPV_OPERAND_TYPE_LOOP_CONTROL,
David Netoba73a7c2016-01-06 13:08:39 -05001083 ARRAY_SIZE(loopControlEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001084 loopControlEntries},
1085 {SPV_OPERAND_TYPE_FUNCTION_CONTROL,
David Netoba73a7c2016-01-06 13:08:39 -05001086 ARRAY_SIZE(functionControlEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001087 functionControlEntries},
David Neto64a9be92015-11-18 15:48:32 -05001088 {SPV_OPERAND_TYPE_MEMORY_SEMANTICS_ID,
David Netoba73a7c2016-01-06 13:08:39 -05001089 ARRAY_SIZE(memorySemanticsEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001090 memorySemanticsEntries},
David Neto201caf72015-11-04 17:38:17 -05001091 {SPV_OPERAND_TYPE_MEMORY_ACCESS,
David Netoba73a7c2016-01-06 13:08:39 -05001092 ARRAY_SIZE(memoryAccessEntries),
David Neto201caf72015-11-04 17:38:17 -05001093 memoryAccessEntries},
1094 {SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS, // Same as *_MEMORY_ACCESS
David Netoba73a7c2016-01-06 13:08:39 -05001095 ARRAY_SIZE(memoryAccessEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001096 memoryAccessEntries},
David Neto64a9be92015-11-18 15:48:32 -05001097 {SPV_OPERAND_TYPE_SCOPE_ID,
David Netoba73a7c2016-01-06 13:08:39 -05001098 ARRAY_SIZE(scopeEntries), scopeEntries},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001099 {SPV_OPERAND_TYPE_GROUP_OPERATION,
David Netoba73a7c2016-01-06 13:08:39 -05001100 ARRAY_SIZE(groupOperationEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001101 groupOperationEntries},
1102 {SPV_OPERAND_TYPE_KERNEL_ENQ_FLAGS,
David Netoba73a7c2016-01-06 13:08:39 -05001103 ARRAY_SIZE(kernelKernelEnqueueFlagssEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001104 kernelKernelEnqueueFlagssEntries},
David Neto47994822015-08-27 13:11:01 -04001105 {SPV_OPERAND_TYPE_KERNEL_PROFILING_INFO,
David Netoba73a7c2016-01-06 13:08:39 -05001106 ARRAY_SIZE(kernelProfilingInfoEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001107 kernelProfilingInfoEntries},
1108 {SPV_OPERAND_TYPE_CAPABILITY,
David Netoba73a7c2016-01-06 13:08:39 -05001109 ARRAY_SIZE(capabilityInfoEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001110 capabilityInfoEntries},
1111};
1112
Dejan Mircevski50babb22015-09-29 10:56:32 -04001113spv_result_t spvOperandTableGet(spv_operand_table* pOperandTable) {
Lei Zhang40056702015-09-11 14:31:27 -04001114 if (!pOperandTable) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001115
David Netoba73a7c2016-01-06 13:08:39 -05001116 static const spv_operand_table_t table = {ARRAY_SIZE(opcodeEntryTypes),
1117 opcodeEntryTypes};
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001118
1119 *pOperandTable = &table;
1120
1121 return SPV_SUCCESS;
1122}
1123
1124spv_result_t spvOperandTableNameLookup(const spv_operand_table table,
1125 const spv_operand_type_t type,
David Neto388c40d2015-09-16 16:42:56 -04001126 const char* name,
1127 const size_t nameLength,
1128 spv_operand_desc* pEntry) {
Lei Zhang40056702015-09-11 14:31:27 -04001129 if (!table) return SPV_ERROR_INVALID_TABLE;
1130 if (!name || !pEntry) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001131
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001132 for (uint64_t typeIndex = 0; typeIndex < table->count; ++typeIndex) {
1133 if (type == table->types[typeIndex].type) {
1134 for (uint64_t operandIndex = 0;
1135 operandIndex < table->types[typeIndex].count; ++operandIndex) {
1136 if (nameLength ==
1137 strlen(table->types[typeIndex].entries[operandIndex].name) &&
1138 !strncmp(table->types[typeIndex].entries[operandIndex].name, name,
David Neto388c40d2015-09-16 16:42:56 -04001139 nameLength)) {
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001140 *pEntry = &table->types[typeIndex].entries[operandIndex];
1141 return SPV_SUCCESS;
1142 }
1143 }
1144 }
1145 }
1146
1147 return SPV_ERROR_INVALID_LOOKUP;
1148}
1149
1150spv_result_t spvOperandTableValueLookup(const spv_operand_table table,
1151 const spv_operand_type_t type,
1152 const uint32_t value,
Dejan Mircevski50babb22015-09-29 10:56:32 -04001153 spv_operand_desc* pEntry) {
Lei Zhang40056702015-09-11 14:31:27 -04001154 if (!table) return SPV_ERROR_INVALID_TABLE;
1155 if (!pEntry) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001156
1157 for (uint64_t typeIndex = 0; typeIndex < table->count; ++typeIndex) {
1158 if (type == table->types[typeIndex].type) {
1159 for (uint64_t operandIndex = 0;
1160 operandIndex < table->types[typeIndex].count; ++operandIndex) {
1161 if (value == table->types[typeIndex].entries[operandIndex].value) {
1162 *pEntry = &table->types[typeIndex].entries[operandIndex];
1163 return SPV_SUCCESS;
1164 }
1165 }
1166 }
1167 }
1168
1169 return SPV_ERROR_INVALID_LOOKUP;
1170}
1171
Dejan Mircevski50babb22015-09-29 10:56:32 -04001172const char* spvOperandTypeStr(spv_operand_type_t type) {
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001173 switch (type) {
1174 case SPV_OPERAND_TYPE_ID:
David Netofadbf622015-09-14 17:07:11 -04001175 case SPV_OPERAND_TYPE_OPTIONAL_ID:
David Netofadbf622015-09-14 17:07:11 -04001176 return "ID";
David Neto201caf72015-11-04 17:38:17 -05001177 case SPV_OPERAND_TYPE_TYPE_ID:
1178 return "type ID";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001179 case SPV_OPERAND_TYPE_RESULT_ID:
1180 return "result ID";
Lei Zhang6483bd72015-10-14 17:02:39 -04001181 case SPV_OPERAND_TYPE_LITERAL_INTEGER:
David Neto201caf72015-11-04 17:38:17 -05001182 case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_INTEGER:
1183 case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_NUMBER:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001184 return "literal number";
David Neto201caf72015-11-04 17:38:17 -05001185 case SPV_OPERAND_TYPE_OPTIONAL_TYPED_LITERAL_INTEGER:
1186 return "possibly multi-word literal integer";
1187 case SPV_OPERAND_TYPE_TYPED_LITERAL_NUMBER:
1188 return "possibly multi-word literal number";
1189 case SPV_OPERAND_TYPE_EXTENSION_INSTRUCTION_NUMBER:
1190 return "extension instruction number";
David Neto0f166be2015-11-11 01:56:49 -05001191 case SPV_OPERAND_TYPE_SPEC_CONSTANT_OP_NUMBER:
1192 return "OpSpecConstantOp opcode";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001193 case SPV_OPERAND_TYPE_LITERAL_STRING:
David Neto201caf72015-11-04 17:38:17 -05001194 case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_STRING:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001195 return "literal string";
1196 case SPV_OPERAND_TYPE_SOURCE_LANGUAGE:
Dejan Mircevskid2c81cf2015-10-09 11:06:10 -04001197 return "source language";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001198 case SPV_OPERAND_TYPE_EXECUTION_MODEL:
1199 return "execution model";
1200 case SPV_OPERAND_TYPE_ADDRESSING_MODEL:
1201 return "addressing model";
1202 case SPV_OPERAND_TYPE_MEMORY_MODEL:
1203 return "memory model";
1204 case SPV_OPERAND_TYPE_EXECUTION_MODE:
David Neto201caf72015-11-04 17:38:17 -05001205 case SPV_OPERAND_TYPE_OPTIONAL_EXECUTION_MODE:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001206 return "execution mode";
1207 case SPV_OPERAND_TYPE_STORAGE_CLASS:
1208 return "storage class";
1209 case SPV_OPERAND_TYPE_DIMENSIONALITY:
1210 return "dimensionality";
1211 case SPV_OPERAND_TYPE_SAMPLER_ADDRESSING_MODE:
David Netod9ad0502015-11-24 18:37:24 -05001212 return "sampler addressing mode";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001213 case SPV_OPERAND_TYPE_SAMPLER_FILTER_MODE:
1214 return "sampler filter mode";
David Netob30a0c52015-09-16 15:56:43 -04001215 case SPV_OPERAND_TYPE_SAMPLER_IMAGE_FORMAT:
Dejan Mircevski971b3442015-10-13 12:54:47 -04001216 return "image format";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001217 case SPV_OPERAND_TYPE_FP_FAST_MATH_MODE:
Dejan Mircevski355cc0c2015-10-13 15:02:03 -04001218 return "floating-point fast math mode";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001219 case SPV_OPERAND_TYPE_FP_ROUNDING_MODE:
Dejan Mircevski355cc0c2015-10-13 15:02:03 -04001220 return "floating-point rounding mode";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001221 case SPV_OPERAND_TYPE_LINKAGE_TYPE:
1222 return "linkage type";
1223 case SPV_OPERAND_TYPE_ACCESS_QUALIFIER:
1224 return "access qualifier";
1225 case SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE:
1226 return "function parameter attribute";
1227 case SPV_OPERAND_TYPE_DECORATION:
1228 return "decoration";
1229 case SPV_OPERAND_TYPE_BUILT_IN:
Dejan Mircevskid7b0f832015-10-13 15:39:38 -04001230 return "built-in";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001231 case SPV_OPERAND_TYPE_SELECTION_CONTROL:
1232 return "selection control";
1233 case SPV_OPERAND_TYPE_LOOP_CONTROL:
1234 return "loop control";
1235 case SPV_OPERAND_TYPE_FUNCTION_CONTROL:
1236 return "function control";
David Neto64a9be92015-11-18 15:48:32 -05001237 case SPV_OPERAND_TYPE_MEMORY_SEMANTICS_ID:
David Netod9ad0502015-11-24 18:37:24 -05001238 return "memory semantics ID";
David Neto201caf72015-11-04 17:38:17 -05001239 case SPV_OPERAND_TYPE_MEMORY_ACCESS:
David Neto78c3b432015-08-27 13:03:52 -04001240 case SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001241 return "memory access";
David Neto64a9be92015-11-18 15:48:32 -05001242 case SPV_OPERAND_TYPE_SCOPE_ID:
David Netod9ad0502015-11-24 18:37:24 -05001243 return "scope ID";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001244 case SPV_OPERAND_TYPE_GROUP_OPERATION:
1245 return "group operation";
1246 case SPV_OPERAND_TYPE_KERNEL_ENQ_FLAGS:
1247 return "kernel enqeue flags";
David Neto47994822015-08-27 13:11:01 -04001248 case SPV_OPERAND_TYPE_KERNEL_PROFILING_INFO:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001249 return "kernel profiling info";
1250 case SPV_OPERAND_TYPE_CAPABILITY:
1251 return "capability";
David Neto201caf72015-11-04 17:38:17 -05001252 case SPV_OPERAND_TYPE_IMAGE:
David Netoee1b3bb2015-09-18 11:19:18 -04001253 case SPV_OPERAND_TYPE_OPTIONAL_IMAGE:
David Netod9ad0502015-11-24 18:37:24 -05001254 return "image";
David Neto201caf72015-11-04 17:38:17 -05001255 case SPV_OPERAND_TYPE_OPTIONAL_CIV:
1256 return "context-insensitive value";
1257
1258 // The next values are for values returned from an instruction, not actually
1259 // an operand. So the specific strings don't matter. But let's add them
1260 // for completeness and ease of testing.
1261 case SPV_OPERAND_TYPE_IMAGE_CHANNEL_ORDER:
1262 return "image channel order";
1263 case SPV_OPERAND_TYPE_IMAGE_CHANNEL_DATA_TYPE:
1264 return "image channel data type";
1265
David Neto78c3b432015-08-27 13:03:52 -04001266 case SPV_OPERAND_TYPE_NONE:
1267 return "NONE";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001268 default:
1269 assert(0 && "Unhandled operand type!");
1270 break;
1271 }
1272 return "unknown";
1273}
David Neto78c3b432015-08-27 13:03:52 -04001274
1275void spvPrependOperandTypes(const spv_operand_type_t* types,
1276 spv_operand_pattern_t* pattern) {
1277 const spv_operand_type_t* endTypes;
Dejan Mircevski50babb22015-09-29 10:56:32 -04001278 for (endTypes = types; *endTypes != SPV_OPERAND_TYPE_NONE; ++endTypes)
David Neto78c3b432015-08-27 13:03:52 -04001279 ;
1280 pattern->insert(pattern->begin(), types, endTypes);
1281}
1282
David Neto5bf88fc2015-09-17 17:06:10 -04001283void spvPrependOperandTypesForMask(const spv_operand_table operandTable,
1284 const spv_operand_type_t type,
1285 const uint32_t mask,
1286 spv_operand_pattern_t* pattern) {
1287 // Scan from highest bits to lowest bits because we will prepend in LIFO
1288 // fashion, and we need the operands for lower order bits to appear first.
1289 for (uint32_t candidate_bit = (1 << 31); candidate_bit; candidate_bit >>= 1) {
1290 if (candidate_bit & mask) {
1291 spv_operand_desc entry = nullptr;
1292 if (SPV_SUCCESS == spvOperandTableValueLookup(operandTable, type,
1293 candidate_bit, &entry)) {
1294 spvPrependOperandTypes(entry->operandTypes, pattern);
1295 }
1296 }
1297 }
1298}
1299
David Neto78c3b432015-08-27 13:03:52 -04001300bool spvOperandIsOptional(spv_operand_type_t type) {
David Neto201caf72015-11-04 17:38:17 -05001301 return SPV_OPERAND_TYPE_FIRST_OPTIONAL_TYPE <= type &&
1302 type <= SPV_OPERAND_TYPE_LAST_OPTIONAL_TYPE;
David Neto78c3b432015-08-27 13:03:52 -04001303}
1304
1305bool spvOperandIsVariable(spv_operand_type_t type) {
David Neto201caf72015-11-04 17:38:17 -05001306 return SPV_OPERAND_TYPE_FIRST_VARIABLE_TYPE <= type &&
1307 type <= SPV_OPERAND_TYPE_LAST_VARIABLE_TYPE;
David Neto78c3b432015-08-27 13:03:52 -04001308}
1309
David Neto78c3b432015-08-27 13:03:52 -04001310bool spvExpandOperandSequenceOnce(spv_operand_type_t type,
1311 spv_operand_pattern_t* pattern) {
1312 switch (type) {
1313 case SPV_OPERAND_TYPE_VARIABLE_ID:
1314 pattern->insert(pattern->begin(), {SPV_OPERAND_TYPE_OPTIONAL_ID, type});
1315 return true;
Lei Zhang6483bd72015-10-14 17:02:39 -04001316 case SPV_OPERAND_TYPE_VARIABLE_LITERAL_INTEGER:
David Neto78c3b432015-08-27 13:03:52 -04001317 pattern->insert(pattern->begin(),
Lei Zhang6483bd72015-10-14 17:02:39 -04001318 {SPV_OPERAND_TYPE_OPTIONAL_LITERAL_INTEGER, type});
David Neto78c3b432015-08-27 13:03:52 -04001319 return true;
Lei Zhang6483bd72015-10-14 17:02:39 -04001320 case SPV_OPERAND_TYPE_VARIABLE_LITERAL_INTEGER_ID:
David Neto201caf72015-11-04 17:38:17 -05001321 // Represents Zero or more (Literal number, Id) pairs,
1322 // where the literal number must be a scalar integer.
David Neto78c3b432015-08-27 13:03:52 -04001323 pattern->insert(pattern->begin(),
David Neto201caf72015-11-04 17:38:17 -05001324 {SPV_OPERAND_TYPE_OPTIONAL_TYPED_LITERAL_INTEGER,
1325 SPV_OPERAND_TYPE_ID, type});
David Neto78c3b432015-08-27 13:03:52 -04001326 return true;
Lei Zhang6483bd72015-10-14 17:02:39 -04001327 case SPV_OPERAND_TYPE_VARIABLE_ID_LITERAL_INTEGER:
David Neto561dc4e2015-09-25 14:23:29 -04001328 // Represents Zero or more (Id, Literal number) pairs.
David Neto201caf72015-11-04 17:38:17 -05001329 pattern->insert(pattern->begin(),
1330 {SPV_OPERAND_TYPE_OPTIONAL_ID,
1331 SPV_OPERAND_TYPE_LITERAL_INTEGER, type});
David Neto78c3b432015-08-27 13:03:52 -04001332 return true;
David Neto78c3b432015-08-27 13:03:52 -04001333 case SPV_OPERAND_TYPE_VARIABLE_EXECUTION_MODE:
Dejan Mircevski50babb22015-09-29 10:56:32 -04001334 pattern->insert(pattern->begin(),
1335 {SPV_OPERAND_TYPE_OPTIONAL_EXECUTION_MODE, type});
David Neto78c3b432015-08-27 13:03:52 -04001336 return true;
1337 default:
1338 break;
1339 }
1340 return false;
1341}
1342
Dejan Mircevski50babb22015-09-29 10:56:32 -04001343spv_operand_type_t spvTakeFirstMatchableOperand(
1344 spv_operand_pattern_t* pattern) {
David Neto78c3b432015-08-27 13:03:52 -04001345 assert(!pattern->empty());
1346 spv_operand_type_t result;
1347 do {
1348 result = pattern->front();
1349 pattern->pop_front();
Dejan Mircevski50babb22015-09-29 10:56:32 -04001350 } while (spvExpandOperandSequenceOnce(result, pattern));
David Neto78c3b432015-08-27 13:03:52 -04001351 return result;
1352}
Dejan Mircevski903f9d62015-09-28 17:04:39 -04001353
Dejan Mircevski897bff92015-09-29 10:38:18 -04001354spv_operand_pattern_t spvAlternatePatternFollowingImmediate(
1355 const spv_operand_pattern_t& pattern) {
1356 spv_operand_pattern_t alternatePattern;
1357 for (const auto& operand : pattern) {
1358 if (operand == SPV_OPERAND_TYPE_RESULT_ID) {
1359 alternatePattern.push_back(operand);
1360 alternatePattern.push_back(SPV_OPERAND_TYPE_OPTIONAL_CIV);
1361 return alternatePattern;
Dejan Mircevski903f9d62015-09-28 17:04:39 -04001362 }
Dejan Mircevski897bff92015-09-29 10:38:18 -04001363 alternatePattern.push_back(SPV_OPERAND_TYPE_OPTIONAL_CIV);
Dejan Mircevski903f9d62015-09-28 17:04:39 -04001364 }
Dejan Mircevski897bff92015-09-29 10:38:18 -04001365 // No result-id found, so just expect CIVs.
1366 return {SPV_OPERAND_TYPE_OPTIONAL_CIV};
Dejan Mircevski903f9d62015-09-28 17:04:39 -04001367}