blob: 6870657c72d17306f3af9887a8184f6caebe8d02 [file] [log] [blame]
Dejan Mircevskib6fe02f2016-01-07 13:44:22 -05001// Copyright (c) 2015-2016 The Khronos Group Inc.
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01002//
3// Permission is hereby granted, free of charge, to any person obtaining a
4// copy of this software and/or associated documentation files (the
5// "Materials"), to deal in the Materials without restriction, including
6// without limitation the rights to use, copy, modify, merge, publish,
7// distribute, sublicense, and/or sell copies of the Materials, and to
8// permit persons to whom the Materials are furnished to do so, subject to
9// the following conditions:
10//
11// The above copyright notice and this permission notice shall be included
12// in all copies or substantial portions of the Materials.
13//
14// MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS
15// KHRONOS STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS
16// SPECIFICATIONS AND HEADER INFORMATION ARE LOCATED AT
17// https://www.khronos.org/registry/
18//
19// THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
20// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
22// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
23// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
24// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
25// MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
26
27#include "operand.h"
28
29#include <assert.h>
30#include <string.h>
31
32static const spv_operand_desc_t sourceLanguageEntries[] = {
Lei Zhang1a0334e2015-11-02 09:41:20 -050033 {"Unknown", SpvSourceLanguageUnknown, 0, {SPV_OPERAND_TYPE_NONE}},
34 {"ESSL", SpvSourceLanguageESSL, 0, {SPV_OPERAND_TYPE_NONE}},
35 {"GLSL", SpvSourceLanguageGLSL, 0, {SPV_OPERAND_TYPE_NONE}},
David Netod02f68a2015-11-11 12:32:21 -050036 {"OpenCL_C", SpvSourceLanguageOpenCL_C, 0, {SPV_OPERAND_TYPE_NONE}},
37 {"OpenCL_CPP", SpvSourceLanguageOpenCL_CPP, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010038};
39
40static const spv_operand_desc_t executionModelEntries[] = {
41 {"Vertex",
Lei Zhangb36e7042015-10-28 13:40:52 -040042 SpvExecutionModelVertex,
43 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010044 {SPV_OPERAND_TYPE_NONE}},
45 {"TessellationControl",
Lei Zhangb36e7042015-10-28 13:40:52 -040046 SpvExecutionModelTessellationControl,
47 SPV_CAPABILITY_AS_MASK(SpvCapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010048 {SPV_OPERAND_TYPE_NONE}},
49 {"TessellationEvaluation",
Lei Zhangb36e7042015-10-28 13:40:52 -040050 SpvExecutionModelTessellationEvaluation,
51 SPV_CAPABILITY_AS_MASK(SpvCapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010052 {SPV_OPERAND_TYPE_NONE}},
53 {"Geometry",
Lei Zhangb36e7042015-10-28 13:40:52 -040054 SpvExecutionModelGeometry,
55 SPV_CAPABILITY_AS_MASK(SpvCapabilityGeometry),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010056 {SPV_OPERAND_TYPE_NONE}},
57 {"Fragment",
Lei Zhangb36e7042015-10-28 13:40:52 -040058 SpvExecutionModelFragment,
59 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010060 {SPV_OPERAND_TYPE_NONE}},
61 {"GLCompute",
Lei Zhangb36e7042015-10-28 13:40:52 -040062 SpvExecutionModelGLCompute,
63 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010064 {SPV_OPERAND_TYPE_NONE}},
65 {"Kernel",
Lei Zhangb36e7042015-10-28 13:40:52 -040066 SpvExecutionModelKernel,
67 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010068 {SPV_OPERAND_TYPE_NONE}},
69};
70
71static const spv_operand_desc_t addressingModelEntries[] = {
Lei Zhang1a0334e2015-11-02 09:41:20 -050072 {"Logical", SpvAddressingModelLogical, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010073 {"Physical32",
Lei Zhangb36e7042015-10-28 13:40:52 -040074 SpvAddressingModelPhysical32,
75 SPV_CAPABILITY_AS_MASK(SpvCapabilityAddresses),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010076 {SPV_OPERAND_TYPE_NONE}},
77 {"Physical64",
Lei Zhangb36e7042015-10-28 13:40:52 -040078 SpvAddressingModelPhysical64,
79 SPV_CAPABILITY_AS_MASK(SpvCapabilityAddresses),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010080 {SPV_OPERAND_TYPE_NONE}},
81};
82
83static const spv_operand_desc_t memoryModelEntries[] = {
84 {"Simple",
Lei Zhangb36e7042015-10-28 13:40:52 -040085 SpvMemoryModelSimple,
86 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010087 {SPV_OPERAND_TYPE_NONE}},
88 {"GLSL450",
Lei Zhangb36e7042015-10-28 13:40:52 -040089 SpvMemoryModelGLSL450,
90 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010091 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -040092 {"OpenCL",
Lei Zhangb36e7042015-10-28 13:40:52 -040093 SpvMemoryModelOpenCL,
94 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010095 {SPV_OPERAND_TYPE_NONE}},
96};
97
Lei Zhang85c6f792015-09-23 15:42:18 -040098// Execution mode requiring the given capability and having no operands.
Lei Zhangb36e7042015-10-28 13:40:52 -040099#define ExecMode0(mode, cap) \
100 #mode, SpvExecutionMode##mode, SPV_CAPABILITY_AS_MASK(SpvCapability##cap), { \
101 SPV_OPERAND_TYPE_NONE \
Lei Zhang85c6f792015-09-23 15:42:18 -0400102 }
103// Execution mode requiring the given capability and having one literal number
104// operand.
Lei Zhangb36e7042015-10-28 13:40:52 -0400105#define ExecMode1(mode, cap) \
106 #mode, SpvExecutionMode##mode, SPV_CAPABILITY_AS_MASK(SpvCapability##cap), { \
107 SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE \
Lei Zhang85c6f792015-09-23 15:42:18 -0400108 }
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100109static const spv_operand_desc_t executionModeEntries[] = {
Lei Zhang85c6f792015-09-23 15:42:18 -0400110 {ExecMode1(Invocations, Geometry)},
111 {ExecMode0(SpacingEqual, Tessellation)},
112 {ExecMode0(SpacingFractionalEven, Tessellation)},
113 {ExecMode0(SpacingFractionalOdd, Tessellation)},
114 {ExecMode0(VertexOrderCw, Tessellation)},
115 {ExecMode0(VertexOrderCcw, Tessellation)},
116 {ExecMode0(PixelCenterInteger, Shader)},
117 {ExecMode0(OriginUpperLeft, Shader)},
118 {ExecMode0(OriginLowerLeft, Shader)},
119 {ExecMode0(EarlyFragmentTests, Shader)},
120 {ExecMode0(PointMode, Tessellation)},
Lei Zhang863ddbe2015-09-23 17:09:01 -0400121 {ExecMode0(Xfb, TransformFeedback)},
Lei Zhang85c6f792015-09-23 15:42:18 -0400122 {ExecMode0(DepthReplacing, Shader)},
Lei Zhang85c6f792015-09-23 15:42:18 -0400123 {ExecMode0(DepthGreater, Shader)},
124 {ExecMode0(DepthLess, Shader)},
125 {ExecMode0(DepthUnchanged, Shader)},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100126 {"LocalSize",
Lei Zhangb36e7042015-10-28 13:40:52 -0400127 SpvExecutionModeLocalSize,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100128 0,
Lei Zhang6483bd72015-10-14 17:02:39 -0400129 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_LITERAL_INTEGER,
130 SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100131 {"LocalSizeHint",
Lei Zhangb36e7042015-10-28 13:40:52 -0400132 SpvExecutionModeLocalSizeHint,
133 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Lei Zhang6483bd72015-10-14 17:02:39 -0400134 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_LITERAL_INTEGER,
135 SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Lei Zhang85c6f792015-09-23 15:42:18 -0400136 {ExecMode0(InputPoints, Geometry)},
137 {ExecMode0(InputLines, Geometry)},
138 {ExecMode0(InputLinesAdjacency, Geometry)},
David Netod02f68a2015-11-11 12:32:21 -0500139 {"Triangles",
140 SpvExecutionModeTriangles,
Lei Zhangb36e7042015-10-28 13:40:52 -0400141 SPV_CAPABILITY_AS_MASK(SpvCapabilityGeometry) |
142 SPV_CAPABILITY_AS_MASK(SpvCapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100143 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang85c6f792015-09-23 15:42:18 -0400144 {ExecMode0(InputTrianglesAdjacency, Geometry)},
David Netod02f68a2015-11-11 12:32:21 -0500145 {ExecMode0(Quads, Tessellation)},
146 {ExecMode0(Isolines, Tessellation)},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100147 {"OutputVertices",
Lei Zhangb36e7042015-10-28 13:40:52 -0400148 SpvExecutionModeOutputVertices,
149 SPV_CAPABILITY_AS_MASK(SpvCapabilityGeometry) |
150 SPV_CAPABILITY_AS_MASK(SpvCapabilityTessellation),
Lei Zhang6483bd72015-10-14 17:02:39 -0400151 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Lei Zhang85c6f792015-09-23 15:42:18 -0400152 {ExecMode0(OutputPoints, Geometry)},
153 {ExecMode0(OutputLineStrip, Geometry)},
154 {ExecMode0(OutputTriangleStrip, Geometry)},
155 {ExecMode1(VecTypeHint, Kernel)},
156 {ExecMode0(ContractionOff, Kernel)},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100157};
Lei Zhang85c6f792015-09-23 15:42:18 -0400158#undef ExecMode0
159#undef ExecMode1
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100160
161static const spv_operand_desc_t storageClassEntries[] = {
Dejan Mircevski50babb22015-09-29 10:56:32 -0400162 // TODO(dneto): There are more storage classes in Rev32 and later.
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100163 {"UniformConstant",
Lei Zhangb36e7042015-10-28 13:40:52 -0400164 SpvStorageClassUniformConstant,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100165 0,
166 {SPV_OPERAND_TYPE_NONE}},
167 {"Input",
Lei Zhangb36e7042015-10-28 13:40:52 -0400168 SpvStorageClassInput,
169 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100170 {SPV_OPERAND_TYPE_NONE}},
171 {"Uniform",
Lei Zhangb36e7042015-10-28 13:40:52 -0400172 SpvStorageClassUniform,
173 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100174 {SPV_OPERAND_TYPE_NONE}},
175 {"Output",
Lei Zhangb36e7042015-10-28 13:40:52 -0400176 SpvStorageClassOutput,
177 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100178 {SPV_OPERAND_TYPE_NONE}},
David Netod9ad0502015-11-24 18:37:24 -0500179 {"Workgroup", SpvStorageClassWorkgroup, 0, {SPV_OPERAND_TYPE_NONE}},
David Netod02f68a2015-11-11 12:32:21 -0500180 {"CrossWorkgroup",
181 SpvStorageClassCrossWorkgroup,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100182 0,
183 {SPV_OPERAND_TYPE_NONE}},
David Netod02f68a2015-11-11 12:32:21 -0500184 {"Private",
185 SpvStorageClassPrivate,
Lei Zhangb36e7042015-10-28 13:40:52 -0400186 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100187 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang1a0334e2015-11-02 09:41:20 -0500188 {"Function", SpvStorageClassFunction, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100189 {"Generic",
Lei Zhangb36e7042015-10-28 13:40:52 -0400190 SpvStorageClassGeneric,
David Netodd8a6612016-02-14 13:55:50 -0500191 SPV_CAPABILITY_AS_MASK(SpvCapabilityGenericPointer),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100192 {SPV_OPERAND_TYPE_NONE}},
David Neto9819adf2015-09-23 10:19:57 -0400193 {"PushConstant",
Lei Zhangb36e7042015-10-28 13:40:52 -0400194 SpvStorageClassPushConstant,
195 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
David Neto9819adf2015-09-23 10:19:57 -0400196 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100197 {"AtomicCounter",
Lei Zhangb36e7042015-10-28 13:40:52 -0400198 SpvStorageClassAtomicCounter,
199 SPV_CAPABILITY_AS_MASK(SpvCapabilityAtomicStorage),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100200 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang1a0334e2015-11-02 09:41:20 -0500201 {"Image", SpvStorageClassImage, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100202};
203
204static const spv_operand_desc_t dimensionalityEntries[] = {
David Netoddda85a2015-10-02 17:10:10 -0400205 {"1D",
Lei Zhangb36e7042015-10-28 13:40:52 -0400206 SpvDim1D,
207 SPV_CAPABILITY_AS_MASK(SpvCapabilitySampled1D),
David Netoddda85a2015-10-02 17:10:10 -0400208 {SPV_OPERAND_TYPE_NONE}},
Lei Zhangb36e7042015-10-28 13:40:52 -0400209 {"2D", SpvDim2D, 0, {SPV_OPERAND_TYPE_NONE}},
210 {"3D", SpvDim3D, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100211 {"Cube",
Lei Zhangb36e7042015-10-28 13:40:52 -0400212 SpvDimCube,
213 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100214 {SPV_OPERAND_TYPE_NONE}},
215 {"Rect",
Lei Zhangb36e7042015-10-28 13:40:52 -0400216 SpvDimRect,
217 SPV_CAPABILITY_AS_MASK(SpvCapabilitySampledRect),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100218 {SPV_OPERAND_TYPE_NONE}},
David Netoddda85a2015-10-02 17:10:10 -0400219 {"Buffer",
Lei Zhangb36e7042015-10-28 13:40:52 -0400220 SpvDimBuffer,
221 SPV_CAPABILITY_AS_MASK(SpvCapabilitySampledBuffer),
David Netoddda85a2015-10-02 17:10:10 -0400222 {SPV_OPERAND_TYPE_NONE}},
David Netod02f68a2015-11-11 12:32:21 -0500223 {"SubpassData",
224 SpvDimSubpassData,
225 SPV_CAPABILITY_AS_MASK(SpvCapabilityInputAttachment),
David Netoaa0c3a52015-09-23 10:30:06 -0400226 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100227};
228
229static const spv_operand_desc_t samplerAddressingModeEntries[] = {
230 {"None",
Lei Zhangb36e7042015-10-28 13:40:52 -0400231 SpvSamplerAddressingModeNone,
232 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100233 {SPV_OPERAND_TYPE_NONE}},
234 {"ClampToEdge",
Lei Zhangb36e7042015-10-28 13:40:52 -0400235 SpvSamplerAddressingModeClampToEdge,
236 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100237 {SPV_OPERAND_TYPE_NONE}},
238 {"Clamp",
Lei Zhangb36e7042015-10-28 13:40:52 -0400239 SpvSamplerAddressingModeClamp,
240 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100241 {SPV_OPERAND_TYPE_NONE}},
242 {"Repeat",
Lei Zhangb36e7042015-10-28 13:40:52 -0400243 SpvSamplerAddressingModeRepeat,
244 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100245 {SPV_OPERAND_TYPE_NONE}},
246 {"RepeatMirrored",
Lei Zhangb36e7042015-10-28 13:40:52 -0400247 SpvSamplerAddressingModeRepeatMirrored,
248 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100249 {SPV_OPERAND_TYPE_NONE}},
250};
251
252static const spv_operand_desc_t samplerFilterModeEntries[] = {
253 {"Nearest",
Lei Zhangb36e7042015-10-28 13:40:52 -0400254 SpvSamplerFilterModeNearest,
255 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100256 {SPV_OPERAND_TYPE_NONE}},
257 {"Linear",
Lei Zhangb36e7042015-10-28 13:40:52 -0400258 SpvSamplerFilterModeLinear,
259 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100260 {SPV_OPERAND_TYPE_NONE}},
261};
262
David Netob30a0c52015-09-16 15:56:43 -0400263static const spv_operand_desc_t samplerImageFormatEntries[] = {
Lei Zhangb36e7042015-10-28 13:40:52 -0400264#define CASE0(NAME) \
265 { \
266 #NAME, SpvImageFormat##NAME, 0, { SPV_OPERAND_TYPE_NONE } \
David Netoddda85a2015-10-02 17:10:10 -0400267 }
Lei Zhangb36e7042015-10-28 13:40:52 -0400268#define CASE(NAME, CAP) \
269 { \
270 #NAME, SpvImageFormat##NAME, SPV_CAPABILITY_AS_MASK(SpvCapability##CAP), { \
271 SPV_OPERAND_TYPE_NONE \
272 } \
David Netob30a0c52015-09-16 15:56:43 -0400273 }
Dejan Mircevski50babb22015-09-29 10:56:32 -0400274 // clang-format off
David Netoddda85a2015-10-02 17:10:10 -0400275 CASE0(Unknown),
276 CASE(Rgba32f, Shader),
277 CASE(Rgba16f, Shader),
278 CASE(R32f, Shader),
279 CASE(Rgba8, Shader),
280 CASE(Rgba8Snorm, Shader),
David Netod02f68a2015-11-11 12:32:21 -0500281 CASE(Rg32f, StorageImageExtendedFormats),
282 CASE(Rg16f, StorageImageExtendedFormats),
283 CASE(R11fG11fB10f, StorageImageExtendedFormats),
284 CASE(R16f, StorageImageExtendedFormats),
285 CASE(Rgba16, StorageImageExtendedFormats),
286 CASE(Rgb10A2, StorageImageExtendedFormats),
287 CASE(Rg16, StorageImageExtendedFormats),
288 CASE(Rg8, StorageImageExtendedFormats),
289 CASE(R16, StorageImageExtendedFormats),
290 CASE(R8, StorageImageExtendedFormats),
291 CASE(Rgba16Snorm, StorageImageExtendedFormats),
292 CASE(Rg16Snorm, StorageImageExtendedFormats),
293 CASE(Rg8Snorm, StorageImageExtendedFormats),
294 CASE(R16Snorm, StorageImageExtendedFormats),
295 CASE(R8Snorm, StorageImageExtendedFormats),
David Netoddda85a2015-10-02 17:10:10 -0400296 CASE(Rgba32i, Shader),
297 CASE(Rgba16i, Shader),
298 CASE(Rgba8i, Shader),
299 CASE(R32i, Shader),
David Netod02f68a2015-11-11 12:32:21 -0500300 CASE(Rg32i, StorageImageExtendedFormats),
301 CASE(Rg16i, StorageImageExtendedFormats),
302 CASE(Rg8i, StorageImageExtendedFormats),
303 CASE(R16i, StorageImageExtendedFormats),
304 CASE(R8i, StorageImageExtendedFormats),
David Netoddda85a2015-10-02 17:10:10 -0400305 CASE(Rgba32ui, Shader),
306 CASE(Rgba16ui, Shader),
307 CASE(Rgba8ui, Shader),
308 CASE(R32ui, Shader),
David Netod02f68a2015-11-11 12:32:21 -0500309 CASE(Rgb10a2ui, StorageImageExtendedFormats),
310 CASE(Rg32ui, StorageImageExtendedFormats),
311 CASE(Rg16ui, StorageImageExtendedFormats),
312 CASE(Rg8ui, StorageImageExtendedFormats),
313 CASE(R16ui, StorageImageExtendedFormats),
314 CASE(R8ui, StorageImageExtendedFormats),
Dejan Mircevski50babb22015-09-29 10:56:32 -0400315// clang-format on
David Netob30a0c52015-09-16 15:56:43 -0400316#undef CASE
317};
318
David Netoddda85a2015-10-02 17:10:10 -0400319// All image channel orders depend on the Kernel capability.
Lei Zhang1a0334e2015-11-02 09:41:20 -0500320#define CASE(NAME) \
321 { \
322 #NAME, SpvImageChannelOrder##NAME, \
323 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel), { \
324 SPV_OPERAND_TYPE_NONE \
325 } \
David Netoddda85a2015-10-02 17:10:10 -0400326 }
327static const spv_operand_desc_t imageChannelOrderEntries[] = {
Lei Zhang1a0334e2015-11-02 09:41:20 -0500328 CASE(R), CASE(A), CASE(RG), CASE(RA), CASE(RGB),
329 CASE(RGBA), CASE(BGRA), CASE(ARGB), CASE(Intensity), CASE(Luminance),
330 CASE(Rx), CASE(RGx), CASE(RGBx), CASE(Depth), CASE(DepthStencil),
331 CASE(sRGB), CASE(sRGBx), CASE(sRGBA), CASE(sBGRA),
David Netoddda85a2015-10-02 17:10:10 -0400332};
333#undef CASE
334
335// All image channel data types depend on the Kernel capability.
Lei Zhangb36e7042015-10-28 13:40:52 -0400336#define CASE(NAME) \
337 { \
338 #NAME, SpvImageChannelDataType##NAME, \
339 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel), { \
340 SPV_OPERAND_TYPE_NONE \
341 } \
David Netoddda85a2015-10-02 17:10:10 -0400342 }
343static const spv_operand_desc_t imageChannelDataTypeEntries[] = {
David Netod02f68a2015-11-11 12:32:21 -0500344 CASE(SnormInt8), CASE(SnormInt16), CASE(UnormInt8),
345 CASE(UnormInt16), CASE(UnormShort565), CASE(UnormShort555),
346 CASE(UnormInt101010), CASE(SignedInt8), CASE(SignedInt16),
347 CASE(SignedInt32), CASE(UnsignedInt8), CASE(UnsignedInt16),
348 CASE(UnsignedInt32), CASE(HalfFloat), CASE(Float),
349 CASE(UnormInt24), CASE(UnormInt101010_2),
David Netoddda85a2015-10-02 17:10:10 -0400350};
351#undef CASE
352
David Netoee1b3bb2015-09-18 11:19:18 -0400353// Image operand definitions. Each enum value is a mask. When that mask
354// bit is set, the instruction should have further ID operands.
355// Some mask values depend on a capability.
356static const spv_operand_desc_t imageOperandEntries[] = {
357// Rev32 and later adds many more enums.
Lei Zhang1a0334e2015-11-02 09:41:20 -0500358#define CASE(NAME) #NAME, SpvImageOperands##NAME##Mask, 0
359#define CASE_CAP(NAME, CAP) #NAME, SpvImageOperands##NAME##Mask, CAP
David Netoee1b3bb2015-09-18 11:19:18 -0400360#define ID SPV_OPERAND_TYPE_ID
361#define NONE SPV_OPERAND_TYPE_NONE
Lei Zhangb36e7042015-10-28 13:40:52 -0400362 {"None", SpvImageOperandsMaskNone, 0, {NONE}},
363 {CASE_CAP(Bias, SPV_CAPABILITY_AS_MASK(SpvCapabilityShader)), {ID, NONE}},
David Netoee1b3bb2015-09-18 11:19:18 -0400364 {CASE(Lod), {ID, NONE}},
365 {CASE(Grad), {ID, ID, NONE}},
366 {CASE(ConstOffset), {ID, NONE}},
Lei Zhangb36e7042015-10-28 13:40:52 -0400367 {CASE_CAP(Offset, SPV_CAPABILITY_AS_MASK(SpvCapabilityImageGatherExtended)),
Dejan Mircevski205408b2015-09-30 16:42:34 -0400368 {ID, NONE}},
David Netoee1b3bb2015-09-18 11:19:18 -0400369 {CASE(ConstOffsets), {ID, NONE}},
370 {CASE(Sample), {ID, NONE}},
Lei Zhangb36e7042015-10-28 13:40:52 -0400371 {CASE_CAP(MinLod, SPV_CAPABILITY_AS_MASK(SpvCapabilityMinLod)), {ID, NONE}},
David Netoee1b3bb2015-09-18 11:19:18 -0400372#undef CASE
373#undef CASE_CAP
374#undef ID
375#undef NONE
376};
377
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100378static const spv_operand_desc_t fpFastMathModeEntries[] = {
Lei Zhang1a0334e2015-11-02 09:41:20 -0500379 {"None", SpvFPFastMathModeMaskNone, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100380 {"NotNaN",
Lei Zhangb36e7042015-10-28 13:40:52 -0400381 SpvFPFastMathModeNotNaNMask,
382 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100383 {SPV_OPERAND_TYPE_NONE}},
384 {"NotInf",
Lei Zhangb36e7042015-10-28 13:40:52 -0400385 SpvFPFastMathModeNotInfMask,
386 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100387 {SPV_OPERAND_TYPE_NONE}},
388 {"NSZ",
Lei Zhangb36e7042015-10-28 13:40:52 -0400389 SpvFPFastMathModeNSZMask,
390 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100391 {SPV_OPERAND_TYPE_NONE}},
392 {"AllowRecip",
Lei Zhangb36e7042015-10-28 13:40:52 -0400393 SpvFPFastMathModeAllowRecipMask,
394 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100395 {SPV_OPERAND_TYPE_NONE}},
396 {"Fast",
Lei Zhangb36e7042015-10-28 13:40:52 -0400397 SpvFPFastMathModeFastMask,
398 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100399 {SPV_OPERAND_TYPE_NONE}},
400};
401
402static const spv_operand_desc_t fpRoundingModeEntries[] = {
403 {"RTE",
Lei Zhangb36e7042015-10-28 13:40:52 -0400404 SpvFPRoundingModeRTE,
405 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100406 {SPV_OPERAND_TYPE_NONE}},
407 {"RTZ",
Lei Zhangb36e7042015-10-28 13:40:52 -0400408 SpvFPRoundingModeRTZ,
409 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100410 {SPV_OPERAND_TYPE_NONE}},
411 {"RTP",
Lei Zhangb36e7042015-10-28 13:40:52 -0400412 SpvFPRoundingModeRTP,
413 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100414 {SPV_OPERAND_TYPE_NONE}},
415 {"RTN",
Lei Zhangb36e7042015-10-28 13:40:52 -0400416 SpvFPRoundingModeRTN,
417 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100418 {SPV_OPERAND_TYPE_NONE}},
419};
420
421static const spv_operand_desc_t linkageTypeEntries[] = {
422 {"Export",
Lei Zhangb36e7042015-10-28 13:40:52 -0400423 SpvLinkageTypeExport,
424 SPV_CAPABILITY_AS_MASK(SpvCapabilityLinkage),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100425 {SPV_OPERAND_TYPE_NONE}},
426 {"Import",
Lei Zhangb36e7042015-10-28 13:40:52 -0400427 SpvLinkageTypeImport,
428 SPV_CAPABILITY_AS_MASK(SpvCapabilityLinkage),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100429 {SPV_OPERAND_TYPE_NONE}},
430};
431
432static const spv_operand_desc_t accessQualifierEntries[] = {
433 {"ReadOnly",
Lei Zhangb36e7042015-10-28 13:40:52 -0400434 SpvAccessQualifierReadOnly,
435 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100436 {SPV_OPERAND_TYPE_NONE}},
437 {"WriteOnly",
Lei Zhangb36e7042015-10-28 13:40:52 -0400438 SpvAccessQualifierWriteOnly,
439 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100440 {SPV_OPERAND_TYPE_NONE}},
441 {"ReadWrite",
Lei Zhangb36e7042015-10-28 13:40:52 -0400442 SpvAccessQualifierReadWrite,
443 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100444 {SPV_OPERAND_TYPE_NONE}},
445};
446
447static const spv_operand_desc_t functionParameterAttributeEntries[] = {
448 {"Zext",
Lei Zhangb36e7042015-10-28 13:40:52 -0400449 SpvFunctionParameterAttributeZext,
450 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100451 {SPV_OPERAND_TYPE_NONE}},
452 {"Sext",
Lei Zhangb36e7042015-10-28 13:40:52 -0400453 SpvFunctionParameterAttributeSext,
454 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100455 {SPV_OPERAND_TYPE_NONE}},
456 {"ByVal",
Lei Zhangb36e7042015-10-28 13:40:52 -0400457 SpvFunctionParameterAttributeByVal,
458 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100459 {SPV_OPERAND_TYPE_NONE}},
460 {"Sret",
Lei Zhangb36e7042015-10-28 13:40:52 -0400461 SpvFunctionParameterAttributeSret,
462 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100463 {SPV_OPERAND_TYPE_NONE}},
464 {"NoAlias",
Lei Zhangb36e7042015-10-28 13:40:52 -0400465 SpvFunctionParameterAttributeNoAlias,
466 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100467 {SPV_OPERAND_TYPE_NONE}},
David Neto37547b22015-09-10 13:23:11 -0400468 {"NoCapture",
Lei Zhangb36e7042015-10-28 13:40:52 -0400469 SpvFunctionParameterAttributeNoCapture,
470 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100471 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100472 {"NoWrite",
Lei Zhangb36e7042015-10-28 13:40:52 -0400473 SpvFunctionParameterAttributeNoWrite,
474 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100475 {SPV_OPERAND_TYPE_NONE}},
476 {"NoReadWrite",
Lei Zhangb36e7042015-10-28 13:40:52 -0400477 SpvFunctionParameterAttributeNoReadWrite,
478 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100479 {SPV_OPERAND_TYPE_NONE}},
480};
481
482static const spv_operand_desc_t decorationEntries[] = {
Lei Zhang604e5ce2015-08-14 14:46:43 -0400483 {"RelaxedPrecision",
Lei Zhangb36e7042015-10-28 13:40:52 -0400484 SpvDecorationRelaxedPrecision,
485 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100486 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400487 {
Dejan Mircevski50babb22015-09-29 10:56:32 -0400488 "SpecId",
Lei Zhangb36e7042015-10-28 13:40:52 -0400489 SpvDecorationSpecId,
490 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Lei Zhang6483bd72015-10-14 17:02:39 -0400491 {SPV_OPERAND_TYPE_LITERAL_INTEGER},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400492 },
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100493 {"Block",
Lei Zhangb36e7042015-10-28 13:40:52 -0400494 SpvDecorationBlock,
495 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100496 {SPV_OPERAND_TYPE_NONE}},
497 {"BufferBlock",
Lei Zhangb36e7042015-10-28 13:40:52 -0400498 SpvDecorationBufferBlock,
499 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100500 {SPV_OPERAND_TYPE_NONE}},
501 {"RowMajor",
Lei Zhangb36e7042015-10-28 13:40:52 -0400502 SpvDecorationRowMajor,
503 SPV_CAPABILITY_AS_MASK(SpvCapabilityMatrix),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100504 {SPV_OPERAND_TYPE_NONE}},
505 {"ColMajor",
Lei Zhangb36e7042015-10-28 13:40:52 -0400506 SpvDecorationColMajor,
507 SPV_CAPABILITY_AS_MASK(SpvCapabilityMatrix),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100508 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400509 {"ArrayStride",
Lei Zhangb36e7042015-10-28 13:40:52 -0400510 SpvDecorationArrayStride,
511 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Lei Zhang6483bd72015-10-14 17:02:39 -0400512 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400513 {"MatrixStride",
Lei Zhangb36e7042015-10-28 13:40:52 -0400514 SpvDecorationMatrixStride,
David Netodd8a6612016-02-14 13:55:50 -0500515 SPV_CAPABILITY_AS_MASK(SpvCapabilityMatrix),
Lei Zhang6483bd72015-10-14 17:02:39 -0400516 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100517 {"GLSLShared",
Lei Zhangb36e7042015-10-28 13:40:52 -0400518 SpvDecorationGLSLShared,
519 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100520 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100521 {"GLSLPacked",
Lei Zhangb36e7042015-10-28 13:40:52 -0400522 SpvDecorationGLSLPacked,
523 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100524 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400525 {"CPacked",
Lei Zhangb36e7042015-10-28 13:40:52 -0400526 SpvDecorationCPacked,
527 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Lei Zhang604e5ce2015-08-14 14:46:43 -0400528 {SPV_OPERAND_TYPE_NONE}},
529 {"BuiltIn",
Lei Zhangb36e7042015-10-28 13:40:52 -0400530 SpvDecorationBuiltIn,
David Netodd8a6612016-02-14 13:55:50 -0500531 0,
Lei Zhang604e5ce2015-08-14 14:46:43 -0400532 {SPV_OPERAND_TYPE_BUILT_IN, SPV_OPERAND_TYPE_NONE}},
David Netodbaf4072015-09-22 16:23:06 -0400533 {"NoPerspective",
Lei Zhangb36e7042015-10-28 13:40:52 -0400534 SpvDecorationNoPerspective,
535 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100536 {SPV_OPERAND_TYPE_NONE}},
537 {"Flat",
Lei Zhangb36e7042015-10-28 13:40:52 -0400538 SpvDecorationFlat,
539 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100540 {SPV_OPERAND_TYPE_NONE}},
541 {"Patch",
Lei Zhangb36e7042015-10-28 13:40:52 -0400542 SpvDecorationPatch,
543 SPV_CAPABILITY_AS_MASK(SpvCapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100544 {SPV_OPERAND_TYPE_NONE}},
545 {"Centroid",
Lei Zhangb36e7042015-10-28 13:40:52 -0400546 SpvDecorationCentroid,
547 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100548 {SPV_OPERAND_TYPE_NONE}},
549 {"Sample",
Lei Zhangb36e7042015-10-28 13:40:52 -0400550 SpvDecorationSample,
David Netodd8a6612016-02-14 13:55:50 -0500551 SPV_CAPABILITY_AS_MASK(SpvCapabilitySampleRateShading),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100552 {SPV_OPERAND_TYPE_NONE}},
553 {"Invariant",
Lei Zhangb36e7042015-10-28 13:40:52 -0400554 SpvDecorationInvariant,
555 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100556 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang1a0334e2015-11-02 09:41:20 -0500557 {"Restrict", SpvDecorationRestrict, 0, {SPV_OPERAND_TYPE_NONE}},
558 {"Aliased", SpvDecorationAliased, 0, {SPV_OPERAND_TYPE_NONE}},
559 {"Volatile", SpvDecorationVolatile, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100560 {"Constant",
Lei Zhangb36e7042015-10-28 13:40:52 -0400561 SpvDecorationConstant,
562 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100563 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang1a0334e2015-11-02 09:41:20 -0500564 {"Coherent", SpvDecorationCoherent, 0, {SPV_OPERAND_TYPE_NONE}},
565 {"NonWritable", SpvDecorationNonWritable, 0, {SPV_OPERAND_TYPE_NONE}},
566 {"NonReadable", SpvDecorationNonReadable, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100567 {"Uniform",
Lei Zhangb36e7042015-10-28 13:40:52 -0400568 SpvDecorationUniform,
569 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100570 {SPV_OPERAND_TYPE_NONE}},
David Neto37547b22015-09-10 13:23:11 -0400571 {"SaturatedConversion",
Lei Zhangb36e7042015-10-28 13:40:52 -0400572 SpvDecorationSaturatedConversion,
573 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100574 {SPV_OPERAND_TYPE_NONE}},
575 {"Stream",
Lei Zhangb36e7042015-10-28 13:40:52 -0400576 SpvDecorationStream,
David Neto12511c82015-11-12 15:30:28 -0500577 SPV_CAPABILITY_AS_MASK(SpvCapabilityGeometryStreams),
Lei Zhang6483bd72015-10-14 17:02:39 -0400578 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100579 {"Location",
Lei Zhangb36e7042015-10-28 13:40:52 -0400580 SpvDecorationLocation,
581 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Lei Zhang6483bd72015-10-14 17:02:39 -0400582 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100583 {"Component",
Lei Zhangb36e7042015-10-28 13:40:52 -0400584 SpvDecorationComponent,
585 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Lei Zhang6483bd72015-10-14 17:02:39 -0400586 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100587 {"Index",
Lei Zhangb36e7042015-10-28 13:40:52 -0400588 SpvDecorationIndex,
589 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Lei Zhang6483bd72015-10-14 17:02:39 -0400590 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100591 {"Binding",
Lei Zhangb36e7042015-10-28 13:40:52 -0400592 SpvDecorationBinding,
593 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Lei Zhang6483bd72015-10-14 17:02:39 -0400594 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100595 {"DescriptorSet",
Lei Zhangb36e7042015-10-28 13:40:52 -0400596 SpvDecorationDescriptorSet,
597 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Lei Zhang6483bd72015-10-14 17:02:39 -0400598 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100599 {"Offset",
Lei Zhangb36e7042015-10-28 13:40:52 -0400600 SpvDecorationOffset,
David Netodd8a6612016-02-14 13:55:50 -0500601 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Lei Zhang6483bd72015-10-14 17:02:39 -0400602 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100603 {"XfbBuffer",
Lei Zhangb36e7042015-10-28 13:40:52 -0400604 SpvDecorationXfbBuffer,
605 SPV_CAPABILITY_AS_MASK(SpvCapabilityTransformFeedback),
Lei Zhang6483bd72015-10-14 17:02:39 -0400606 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400607 {"XfbStride",
Lei Zhangb36e7042015-10-28 13:40:52 -0400608 SpvDecorationXfbStride,
609 SPV_CAPABILITY_AS_MASK(SpvCapabilityTransformFeedback),
Lei Zhang6483bd72015-10-14 17:02:39 -0400610 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100611 {"FuncParamAttr",
Lei Zhangb36e7042015-10-28 13:40:52 -0400612 SpvDecorationFuncParamAttr,
613 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100614 {SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE, SPV_OPERAND_TYPE_NONE}},
615 {"FPRoundingMode",
Lei Zhangb36e7042015-10-28 13:40:52 -0400616 SpvDecorationFPRoundingMode,
617 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100618 {SPV_OPERAND_TYPE_FP_ROUNDING_MODE, SPV_OPERAND_TYPE_NONE}},
619 {"FPFastMathMode",
Lei Zhangb36e7042015-10-28 13:40:52 -0400620 SpvDecorationFPFastMathMode,
621 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100622 {SPV_OPERAND_TYPE_FP_FAST_MATH_MODE, SPV_OPERAND_TYPE_NONE}},
623 {"LinkageAttributes",
Lei Zhangb36e7042015-10-28 13:40:52 -0400624 SpvDecorationLinkageAttributes,
625 SPV_CAPABILITY_AS_MASK(SpvCapabilityLinkage),
Dejan Mircevski50babb22015-09-29 10:56:32 -0400626 {SPV_OPERAND_TYPE_LITERAL_STRING, SPV_OPERAND_TYPE_LINKAGE_TYPE,
627 SPV_OPERAND_TYPE_NONE}},
David Netod7687982015-09-23 14:59:27 -0400628 {"NoContraction",
Lei Zhangb36e7042015-10-28 13:40:52 -0400629 SpvDecorationNoContraction,
630 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
David Netod7687982015-09-23 14:59:27 -0400631 {SPV_OPERAND_TYPE_NONE}},
David Netod02f68a2015-11-11 12:32:21 -0500632 {"InputAttachmentIndex",
633 SpvDecorationInputAttachmentIndex,
634 SPV_CAPABILITY_AS_MASK(SpvCapabilityInputAttachment),
635 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
David Netod7687982015-09-23 14:59:27 -0400636 {"Alignment",
Lei Zhangb36e7042015-10-28 13:40:52 -0400637 SpvDecorationAlignment,
638 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Lei Zhang6483bd72015-10-14 17:02:39 -0400639 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100640};
641
642static const spv_operand_desc_t builtInEntries[] = {
643 {"Position",
Lei Zhangb36e7042015-10-28 13:40:52 -0400644 SpvBuiltInPosition,
645 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100646 {SPV_OPERAND_TYPE_NONE}},
647 {"PointSize",
Lei Zhangb36e7042015-10-28 13:40:52 -0400648 SpvBuiltInPointSize,
649 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100650 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100651 {"ClipDistance",
Lei Zhangb36e7042015-10-28 13:40:52 -0400652 SpvBuiltInClipDistance,
David Netodd8a6612016-02-14 13:55:50 -0500653 SPV_CAPABILITY_AS_MASK(SpvCapabilityClipDistance),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100654 {SPV_OPERAND_TYPE_NONE}},
655 {"CullDistance",
Lei Zhangb36e7042015-10-28 13:40:52 -0400656 SpvBuiltInCullDistance,
David Netodd8a6612016-02-14 13:55:50 -0500657 SPV_CAPABILITY_AS_MASK(SpvCapabilityCullDistance),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100658 {SPV_OPERAND_TYPE_NONE}},
659 {"VertexId",
Lei Zhangb36e7042015-10-28 13:40:52 -0400660 SpvBuiltInVertexId,
661 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100662 {SPV_OPERAND_TYPE_NONE}},
663 {"InstanceId",
Lei Zhangb36e7042015-10-28 13:40:52 -0400664 SpvBuiltInInstanceId,
665 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100666 {SPV_OPERAND_TYPE_NONE}},
667 {"PrimitiveId",
Lei Zhangb36e7042015-10-28 13:40:52 -0400668 SpvBuiltInPrimitiveId,
669 SPV_CAPABILITY_AS_MASK(SpvCapabilityGeometry) |
670 SPV_CAPABILITY_AS_MASK(SpvCapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100671 {SPV_OPERAND_TYPE_NONE}},
672 {"InvocationId",
Lei Zhangb36e7042015-10-28 13:40:52 -0400673 SpvBuiltInInvocationId,
674 SPV_CAPABILITY_AS_MASK(SpvCapabilityGeometry) |
675 SPV_CAPABILITY_AS_MASK(SpvCapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100676 {SPV_OPERAND_TYPE_NONE}},
677 {"Layer",
Lei Zhangb36e7042015-10-28 13:40:52 -0400678 SpvBuiltInLayer,
679 SPV_CAPABILITY_AS_MASK(SpvCapabilityGeometry),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100680 {SPV_OPERAND_TYPE_NONE}},
681 {"ViewportIndex",
Lei Zhangb36e7042015-10-28 13:40:52 -0400682 SpvBuiltInViewportIndex,
David Netodd8a6612016-02-14 13:55:50 -0500683 SPV_CAPABILITY_AS_MASK(SpvCapabilityMultiViewport),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100684 {SPV_OPERAND_TYPE_NONE}},
685 {"TessLevelOuter",
Lei Zhangb36e7042015-10-28 13:40:52 -0400686 SpvBuiltInTessLevelOuter,
687 SPV_CAPABILITY_AS_MASK(SpvCapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100688 {SPV_OPERAND_TYPE_NONE}},
689 {"TessLevelInner",
Lei Zhangb36e7042015-10-28 13:40:52 -0400690 SpvBuiltInTessLevelInner,
691 SPV_CAPABILITY_AS_MASK(SpvCapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100692 {SPV_OPERAND_TYPE_NONE}},
693 {"TessCoord",
Lei Zhangb36e7042015-10-28 13:40:52 -0400694 SpvBuiltInTessCoord,
695 SPV_CAPABILITY_AS_MASK(SpvCapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100696 {SPV_OPERAND_TYPE_NONE}},
697 {"PatchVertices",
Lei Zhangb36e7042015-10-28 13:40:52 -0400698 SpvBuiltInPatchVertices,
699 SPV_CAPABILITY_AS_MASK(SpvCapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100700 {SPV_OPERAND_TYPE_NONE}},
701 {"FragCoord",
Lei Zhangb36e7042015-10-28 13:40:52 -0400702 SpvBuiltInFragCoord,
703 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100704 {SPV_OPERAND_TYPE_NONE}},
705 {"PointCoord",
Lei Zhangb36e7042015-10-28 13:40:52 -0400706 SpvBuiltInPointCoord,
707 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100708 {SPV_OPERAND_TYPE_NONE}},
709 {"FrontFacing",
Lei Zhangb36e7042015-10-28 13:40:52 -0400710 SpvBuiltInFrontFacing,
711 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100712 {SPV_OPERAND_TYPE_NONE}},
713 {"SampleId",
Lei Zhangb36e7042015-10-28 13:40:52 -0400714 SpvBuiltInSampleId,
David Netodd8a6612016-02-14 13:55:50 -0500715 SPV_CAPABILITY_AS_MASK(SpvCapabilitySampleRateShading),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100716 {SPV_OPERAND_TYPE_NONE}},
717 {"SamplePosition",
Lei Zhangb36e7042015-10-28 13:40:52 -0400718 SpvBuiltInSamplePosition,
David Netodd8a6612016-02-14 13:55:50 -0500719 SPV_CAPABILITY_AS_MASK(SpvCapabilitySampleRateShading),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100720 {SPV_OPERAND_TYPE_NONE}},
721 {"SampleMask",
Lei Zhangb36e7042015-10-28 13:40:52 -0400722 SpvBuiltInSampleMask,
David Netodd8a6612016-02-14 13:55:50 -0500723 SPV_CAPABILITY_AS_MASK(SpvCapabilitySampleRateShading),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100724 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100725 {"FragDepth",
Lei Zhangb36e7042015-10-28 13:40:52 -0400726 SpvBuiltInFragDepth,
727 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100728 {SPV_OPERAND_TYPE_NONE}},
729 {"HelperInvocation",
Lei Zhangb36e7042015-10-28 13:40:52 -0400730 SpvBuiltInHelperInvocation,
731 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100732 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang1a0334e2015-11-02 09:41:20 -0500733 {"NumWorkgroups", SpvBuiltInNumWorkgroups, 0, {SPV_OPERAND_TYPE_NONE}},
734 {"WorkgroupSize", SpvBuiltInWorkgroupSize, 0, {SPV_OPERAND_TYPE_NONE}},
735 {"WorkgroupId", SpvBuiltInWorkgroupId, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100736 {"LocalInvocationId",
Lei Zhangb36e7042015-10-28 13:40:52 -0400737 SpvBuiltInLocalInvocationId,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100738 0,
739 {SPV_OPERAND_TYPE_NONE}},
740 {"GlobalInvocationId",
Lei Zhangb36e7042015-10-28 13:40:52 -0400741 SpvBuiltInGlobalInvocationId,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100742 0,
743 {SPV_OPERAND_TYPE_NONE}},
744 {"LocalInvocationIndex",
Lei Zhangb36e7042015-10-28 13:40:52 -0400745 SpvBuiltInLocalInvocationIndex,
David Netodd8a6612016-02-14 13:55:50 -0500746 0,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100747 {SPV_OPERAND_TYPE_NONE}},
748 {"WorkDim",
Lei Zhangb36e7042015-10-28 13:40:52 -0400749 SpvBuiltInWorkDim,
750 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100751 {SPV_OPERAND_TYPE_NONE}},
752 {"GlobalSize",
Lei Zhangb36e7042015-10-28 13:40:52 -0400753 SpvBuiltInGlobalSize,
754 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100755 {SPV_OPERAND_TYPE_NONE}},
756 {"EnqueuedWorkgroupSize",
Lei Zhangb36e7042015-10-28 13:40:52 -0400757 SpvBuiltInEnqueuedWorkgroupSize,
758 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100759 {SPV_OPERAND_TYPE_NONE}},
760 {"GlobalOffset",
Lei Zhangb36e7042015-10-28 13:40:52 -0400761 SpvBuiltInGlobalOffset,
762 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100763 {SPV_OPERAND_TYPE_NONE}},
764 {"GlobalLinearId",
Lei Zhangb36e7042015-10-28 13:40:52 -0400765 SpvBuiltInGlobalLinearId,
766 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100767 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100768 {"SubgroupSize",
Lei Zhangb36e7042015-10-28 13:40:52 -0400769 SpvBuiltInSubgroupSize,
770 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100771 {SPV_OPERAND_TYPE_NONE}},
772 {"SubgroupMaxSize",
Lei Zhangb36e7042015-10-28 13:40:52 -0400773 SpvBuiltInSubgroupMaxSize,
774 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100775 {SPV_OPERAND_TYPE_NONE}},
776 {"NumSubgroups",
Lei Zhangb36e7042015-10-28 13:40:52 -0400777 SpvBuiltInNumSubgroups,
778 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100779 {SPV_OPERAND_TYPE_NONE}},
780 {"NumEnqueuedSubgroups",
Lei Zhangb36e7042015-10-28 13:40:52 -0400781 SpvBuiltInNumEnqueuedSubgroups,
782 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100783 {SPV_OPERAND_TYPE_NONE}},
784 {"SubgroupId",
Lei Zhangb36e7042015-10-28 13:40:52 -0400785 SpvBuiltInSubgroupId,
786 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100787 {SPV_OPERAND_TYPE_NONE}},
788 {"SubgroupLocalInvocationId",
Lei Zhangb36e7042015-10-28 13:40:52 -0400789 SpvBuiltInSubgroupLocalInvocationId,
790 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100791 {SPV_OPERAND_TYPE_NONE}},
David Neto2d1b5e52015-09-23 15:35:27 -0400792 {"VertexIndex",
Lei Zhangb36e7042015-10-28 13:40:52 -0400793 SpvBuiltInVertexIndex,
794 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
David Neto2d1b5e52015-09-23 15:35:27 -0400795 {SPV_OPERAND_TYPE_NONE}},
796 {"InstanceIndex",
Lei Zhangb36e7042015-10-28 13:40:52 -0400797 SpvBuiltInInstanceIndex,
798 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
David Neto2d1b5e52015-09-23 15:35:27 -0400799 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100800};
801
802static const spv_operand_desc_t selectionControlEntries[] = {
Lei Zhang1a0334e2015-11-02 09:41:20 -0500803 {"None", SpvSelectionControlMaskNone, 0, {SPV_OPERAND_TYPE_NONE}},
804 {"Flatten", SpvSelectionControlFlattenMask, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100805 {"DontFlatten",
Lei Zhangb36e7042015-10-28 13:40:52 -0400806 SpvSelectionControlDontFlattenMask,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100807 0,
808 {SPV_OPERAND_TYPE_NONE}},
809};
810
811static const spv_operand_desc_t loopControlEntries[] = {
Lei Zhang1a0334e2015-11-02 09:41:20 -0500812 {"None", SpvLoopControlMaskNone, 0, {SPV_OPERAND_TYPE_NONE}},
813 {"Unroll", SpvLoopControlUnrollMask, 0, {SPV_OPERAND_TYPE_NONE}},
814 {"DontUnroll", SpvLoopControlDontUnrollMask, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100815};
816
817static const spv_operand_desc_t functionControlEntries[] = {
Lei Zhang1a0334e2015-11-02 09:41:20 -0500818 {"None", SpvFunctionControlMaskNone, 0, {SPV_OPERAND_TYPE_NONE}},
819 {"Inline", SpvFunctionControlInlineMask, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100820 {"DontInline",
Lei Zhangb36e7042015-10-28 13:40:52 -0400821 SpvFunctionControlDontInlineMask,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100822 0,
823 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang1a0334e2015-11-02 09:41:20 -0500824 {"Pure", SpvFunctionControlPureMask, 0, {SPV_OPERAND_TYPE_NONE}},
825 {"Const", SpvFunctionControlConstMask, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100826};
827
828static const spv_operand_desc_t memorySemanticsEntries[] = {
David Netobfa3d862015-09-25 10:30:27 -0400829 // "Relaxed" should be a synonym for "None".
830 // Put the Relaxed entry first so that the disassembler
831 // will prefer to emit "Relaxed".
Lei Zhang1a0334e2015-11-02 09:41:20 -0500832 {"Relaxed", SpvMemorySemanticsMaskNone, 0, {SPV_OPERAND_TYPE_NONE}},
833 {"None", SpvMemorySemanticsMaskNone, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100834 {"SequentiallyConsistent",
Lei Zhangb36e7042015-10-28 13:40:52 -0400835 SpvMemorySemanticsSequentiallyConsistentMask,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100836 0,
837 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang1a0334e2015-11-02 09:41:20 -0500838 {"Acquire", SpvMemorySemanticsAcquireMask, 0, {SPV_OPERAND_TYPE_NONE}},
839 {"Release", SpvMemorySemanticsReleaseMask, 0, {SPV_OPERAND_TYPE_NONE}},
David Netod02f68a2015-11-11 12:32:21 -0500840 {"AcquireRelease",
841 SpvMemorySemanticsAcquireReleaseMask,
842 0,
843 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100844 {"UniformMemory",
Lei Zhangb36e7042015-10-28 13:40:52 -0400845 SpvMemorySemanticsUniformMemoryMask,
846 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100847 {SPV_OPERAND_TYPE_NONE}},
848 {"SubgroupMemory",
Lei Zhangb36e7042015-10-28 13:40:52 -0400849 SpvMemorySemanticsSubgroupMemoryMask,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100850 0,
851 {SPV_OPERAND_TYPE_NONE}},
David Netod02f68a2015-11-11 12:32:21 -0500852 {"WorkgroupMemory",
853 SpvMemorySemanticsWorkgroupMemoryMask,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100854 0,
855 {SPV_OPERAND_TYPE_NONE}},
David Netod02f68a2015-11-11 12:32:21 -0500856 {"CrossWorkgroupMemory",
857 SpvMemorySemanticsCrossWorkgroupMemoryMask,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100858 0,
859 {SPV_OPERAND_TYPE_NONE}},
860 {"AtomicCounterMemory",
Lei Zhangb36e7042015-10-28 13:40:52 -0400861 SpvMemorySemanticsAtomicCounterMemoryMask,
David Netodd8a6612016-02-14 13:55:50 -0500862 SPV_CAPABILITY_AS_MASK(SpvCapabilityAtomicStorage),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100863 {SPV_OPERAND_TYPE_NONE}},
864 {
Dejan Mircevski50babb22015-09-29 10:56:32 -0400865 "ImageMemory",
Lei Zhangb36e7042015-10-28 13:40:52 -0400866 SpvMemorySemanticsImageMemoryMask,
Dejan Mircevski50babb22015-09-29 10:56:32 -0400867 0,
868 {SPV_OPERAND_TYPE_NONE},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100869 },
870};
871
872static const spv_operand_desc_t memoryAccessEntries[] = {
Lei Zhang1a0334e2015-11-02 09:41:20 -0500873 {"None", SpvMemoryAccessMaskNone, 0, {SPV_OPERAND_TYPE_NONE}},
874 {"Volatile", SpvMemoryAccessVolatileMask, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100875 {
Dejan Mircevski50babb22015-09-29 10:56:32 -0400876 "Aligned",
Lei Zhangb36e7042015-10-28 13:40:52 -0400877 SpvMemoryAccessAlignedMask,
Dejan Mircevski50babb22015-09-29 10:56:32 -0400878 0,
Lei Zhang6483bd72015-10-14 17:02:39 -0400879 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100880 },
Lei Zhang1a0334e2015-11-02 09:41:20 -0500881 {"Nontemporal", SpvMemoryAccessNontemporalMask, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100882};
883
884static const spv_operand_desc_t scopeEntries[] = {
Lei Zhang1a0334e2015-11-02 09:41:20 -0500885 {"CrossDevice", SpvScopeCrossDevice, 0, {SPV_OPERAND_TYPE_NONE}},
Lei Zhangb36e7042015-10-28 13:40:52 -0400886 {"Device", SpvScopeDevice, 0, {SPV_OPERAND_TYPE_NONE}},
Lei Zhang1a0334e2015-11-02 09:41:20 -0500887 {"Workgroup", SpvScopeWorkgroup, 0, {SPV_OPERAND_TYPE_NONE}},
888 {"Subgroup", SpvScopeSubgroup, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100889 {
Lei Zhang1a0334e2015-11-02 09:41:20 -0500890 "Invocation", SpvScopeInvocation, 0, {SPV_OPERAND_TYPE_NONE},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100891 },
892};
893
894static const spv_operand_desc_t groupOperationEntries[] = {
895 {"Reduce",
Lei Zhangb36e7042015-10-28 13:40:52 -0400896 SpvGroupOperationReduce,
897 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100898 {SPV_OPERAND_TYPE_NONE}},
899 {"InclusiveScan",
Lei Zhangb36e7042015-10-28 13:40:52 -0400900 SpvGroupOperationInclusiveScan,
901 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100902 {SPV_OPERAND_TYPE_NONE}},
903 {"ExclusiveScan",
Lei Zhangb36e7042015-10-28 13:40:52 -0400904 SpvGroupOperationExclusiveScan,
905 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100906 {SPV_OPERAND_TYPE_NONE}},
907};
908
909static const spv_operand_desc_t kernelKernelEnqueueFlagssEntries[] = {
910 {"NoWait",
Lei Zhangb36e7042015-10-28 13:40:52 -0400911 SpvKernelEnqueueFlagsNoWait,
912 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100913 {SPV_OPERAND_TYPE_NONE}},
914 {"WaitKernel",
Lei Zhangb36e7042015-10-28 13:40:52 -0400915 SpvKernelEnqueueFlagsWaitKernel,
916 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100917 {SPV_OPERAND_TYPE_NONE}},
918 {"WaitWorkGroup",
Lei Zhangb36e7042015-10-28 13:40:52 -0400919 SpvKernelEnqueueFlagsWaitWorkGroup,
920 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100921 {SPV_OPERAND_TYPE_NONE}},
922};
923
924static const spv_operand_desc_t kernelProfilingInfoEntries[] = {
Lei Zhang1a0334e2015-11-02 09:41:20 -0500925 {"None", SpvKernelProfilingInfoMaskNone, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100926 {"CmdExecTime",
Lei Zhangb36e7042015-10-28 13:40:52 -0400927 SpvKernelProfilingInfoCmdExecTimeMask,
928 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100929 {SPV_OPERAND_TYPE_NONE}},
930};
931
David Netod30b2332015-09-23 16:04:24 -0400932// A macro for defining a capability that doesn't depend on another capability.
Lei Zhangb36e7042015-10-28 13:40:52 -0400933#define CASE(NAME) \
934 { \
935 #NAME, SpvCapability##NAME, 0, { SPV_OPERAND_TYPE_NONE } \
David Netod30b2332015-09-23 16:04:24 -0400936 }
937
938// A macro for defining a capability that depends on another.
Lei Zhangb36e7042015-10-28 13:40:52 -0400939#define CASE_CAP(NAME, CAP) \
940 { \
941 #NAME, SpvCapability##NAME, SPV_CAPABILITY_AS_MASK(SpvCapability##CAP), { \
942 SPV_OPERAND_TYPE_NONE \
943 } \
David Netod30b2332015-09-23 16:04:24 -0400944 }
945
David Neto64a9be92015-11-18 15:48:32 -0500946// clang-format off
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100947static const spv_operand_desc_t capabilityInfoEntries[] = {
David Netod30b2332015-09-23 16:04:24 -0400948 CASE(Matrix),
949 CASE_CAP(Shader, Matrix),
950 CASE_CAP(Geometry, Shader),
951 CASE_CAP(Tessellation, Shader),
952 CASE(Addresses),
953 CASE(Linkage),
954 CASE(Kernel),
955 CASE_CAP(Vector16, Kernel),
956 CASE_CAP(Float16Buffer, Kernel),
David Netodd8a6612016-02-14 13:55:50 -0500957 CASE(Float16),
David Netod30b2332015-09-23 16:04:24 -0400958 CASE(Float64),
959 CASE(Int64),
960 CASE_CAP(Int64Atomics, Int64),
961 CASE_CAP(ImageBasic, Kernel),
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.
David Netodd8a6612016-02-14 13:55:50 -05001014#define ARRAY_SIZE(A) (static_cast<uint32_t>(sizeof(A) / sizeof(A[0])))
David Netoba73a7c2016-01-06 13:08:39 -05001015
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001016static const spv_operand_desc_group_t opcodeEntryTypes[] = {
David Netodd8a6612016-02-14 13:55:50 -05001017 // TODO(dneto): Reformat this table.
1018 {SPV_OPERAND_TYPE_SOURCE_LANGUAGE, ARRAY_SIZE(sourceLanguageEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001019 sourceLanguageEntries},
David Netodd8a6612016-02-14 13:55:50 -05001020 {SPV_OPERAND_TYPE_EXECUTION_MODEL, ARRAY_SIZE(executionModelEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001021 executionModelEntries},
David Netodd8a6612016-02-14 13:55:50 -05001022 {SPV_OPERAND_TYPE_ADDRESSING_MODEL, ARRAY_SIZE(addressingModelEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001023 addressingModelEntries},
David Netodd8a6612016-02-14 13:55:50 -05001024 {SPV_OPERAND_TYPE_MEMORY_MODEL, ARRAY_SIZE(memoryModelEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001025 memoryModelEntries},
David Netodd8a6612016-02-14 13:55:50 -05001026 {SPV_OPERAND_TYPE_EXECUTION_MODE, ARRAY_SIZE(executionModeEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001027 executionModeEntries},
David Netodd8a6612016-02-14 13:55:50 -05001028 {SPV_OPERAND_TYPE_STORAGE_CLASS, ARRAY_SIZE(storageClassEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001029 storageClassEntries},
David Netodd8a6612016-02-14 13:55:50 -05001030 {SPV_OPERAND_TYPE_DIMENSIONALITY, ARRAY_SIZE(dimensionalityEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001031 dimensionalityEntries},
1032 {SPV_OPERAND_TYPE_SAMPLER_ADDRESSING_MODE,
David Netodd8a6612016-02-14 13:55:50 -05001033 ARRAY_SIZE(samplerAddressingModeEntries), samplerAddressingModeEntries},
1034 {SPV_OPERAND_TYPE_SAMPLER_FILTER_MODE, ARRAY_SIZE(samplerFilterModeEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001035 samplerFilterModeEntries},
David Netob30a0c52015-09-16 15:56:43 -04001036 {SPV_OPERAND_TYPE_SAMPLER_IMAGE_FORMAT,
David Netodd8a6612016-02-14 13:55:50 -05001037 ARRAY_SIZE(samplerImageFormatEntries), samplerImageFormatEntries},
1038 {SPV_OPERAND_TYPE_IMAGE_CHANNEL_ORDER, ARRAY_SIZE(imageChannelOrderEntries),
David Netoddda85a2015-10-02 17:10:10 -04001039 imageChannelOrderEntries},
1040 {SPV_OPERAND_TYPE_IMAGE_CHANNEL_DATA_TYPE,
David Netodd8a6612016-02-14 13:55:50 -05001041 ARRAY_SIZE(imageChannelDataTypeEntries), imageChannelDataTypeEntries},
1042 {SPV_OPERAND_TYPE_IMAGE, ARRAY_SIZE(imageOperandEntries),
David Neto201caf72015-11-04 17:38:17 -05001043 imageOperandEntries},
1044 {SPV_OPERAND_TYPE_OPTIONAL_IMAGE, // Same as *_IMAGE
David Netodd8a6612016-02-14 13:55:50 -05001045 ARRAY_SIZE(imageOperandEntries), imageOperandEntries},
1046 {SPV_OPERAND_TYPE_FP_FAST_MATH_MODE, ARRAY_SIZE(fpFastMathModeEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001047 fpFastMathModeEntries},
David Netodd8a6612016-02-14 13:55:50 -05001048 {SPV_OPERAND_TYPE_FP_ROUNDING_MODE, ARRAY_SIZE(fpRoundingModeEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001049 fpRoundingModeEntries},
David Netodd8a6612016-02-14 13:55:50 -05001050 {SPV_OPERAND_TYPE_LINKAGE_TYPE, ARRAY_SIZE(linkageTypeEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001051 linkageTypeEntries},
David Netodd8a6612016-02-14 13:55:50 -05001052 {SPV_OPERAND_TYPE_ACCESS_QUALIFIER, ARRAY_SIZE(accessQualifierEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001053 accessQualifierEntries},
1054 {SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE,
David Netoba73a7c2016-01-06 13:08:39 -05001055 ARRAY_SIZE(functionParameterAttributeEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001056 functionParameterAttributeEntries},
David Netodd8a6612016-02-14 13:55:50 -05001057 {SPV_OPERAND_TYPE_DECORATION, ARRAY_SIZE(decorationEntries),
1058 decorationEntries},
1059 {SPV_OPERAND_TYPE_BUILT_IN, ARRAY_SIZE(builtInEntries), builtInEntries},
1060 {SPV_OPERAND_TYPE_SELECTION_CONTROL, ARRAY_SIZE(selectionControlEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001061 selectionControlEntries},
David Netodd8a6612016-02-14 13:55:50 -05001062 {SPV_OPERAND_TYPE_LOOP_CONTROL, ARRAY_SIZE(loopControlEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001063 loopControlEntries},
David Netodd8a6612016-02-14 13:55:50 -05001064 {SPV_OPERAND_TYPE_FUNCTION_CONTROL, ARRAY_SIZE(functionControlEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001065 functionControlEntries},
David Netodd8a6612016-02-14 13:55:50 -05001066 {SPV_OPERAND_TYPE_MEMORY_SEMANTICS_ID, ARRAY_SIZE(memorySemanticsEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001067 memorySemanticsEntries},
David Netodd8a6612016-02-14 13:55:50 -05001068 {SPV_OPERAND_TYPE_MEMORY_ACCESS, ARRAY_SIZE(memoryAccessEntries),
David Neto201caf72015-11-04 17:38:17 -05001069 memoryAccessEntries},
1070 {SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS, // Same as *_MEMORY_ACCESS
David Netodd8a6612016-02-14 13:55:50 -05001071 ARRAY_SIZE(memoryAccessEntries), memoryAccessEntries},
1072 {SPV_OPERAND_TYPE_SCOPE_ID, ARRAY_SIZE(scopeEntries), scopeEntries},
1073 {SPV_OPERAND_TYPE_GROUP_OPERATION, ARRAY_SIZE(groupOperationEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001074 groupOperationEntries},
1075 {SPV_OPERAND_TYPE_KERNEL_ENQ_FLAGS,
David Netoba73a7c2016-01-06 13:08:39 -05001076 ARRAY_SIZE(kernelKernelEnqueueFlagssEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001077 kernelKernelEnqueueFlagssEntries},
David Neto47994822015-08-27 13:11:01 -04001078 {SPV_OPERAND_TYPE_KERNEL_PROFILING_INFO,
David Netodd8a6612016-02-14 13:55:50 -05001079 ARRAY_SIZE(kernelProfilingInfoEntries), kernelProfilingInfoEntries},
1080 {SPV_OPERAND_TYPE_CAPABILITY, ARRAY_SIZE(capabilityInfoEntries),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001081 capabilityInfoEntries},
1082};
1083
Dejan Mircevski50babb22015-09-29 10:56:32 -04001084spv_result_t spvOperandTableGet(spv_operand_table* pOperandTable) {
Lei Zhang40056702015-09-11 14:31:27 -04001085 if (!pOperandTable) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001086
David Netoba73a7c2016-01-06 13:08:39 -05001087 static const spv_operand_table_t table = {ARRAY_SIZE(opcodeEntryTypes),
1088 opcodeEntryTypes};
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001089
1090 *pOperandTable = &table;
1091
1092 return SPV_SUCCESS;
1093}
1094
Dejan Mircevski3e6b2df2016-01-07 11:00:38 -05001095#undef ARRAY_SIZE
1096
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001097spv_result_t spvOperandTableNameLookup(const spv_operand_table table,
1098 const spv_operand_type_t type,
David Neto388c40d2015-09-16 16:42:56 -04001099 const char* name,
1100 const size_t nameLength,
1101 spv_operand_desc* pEntry) {
Lei Zhang40056702015-09-11 14:31:27 -04001102 if (!table) return SPV_ERROR_INVALID_TABLE;
1103 if (!name || !pEntry) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001104
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001105 for (uint64_t typeIndex = 0; typeIndex < table->count; ++typeIndex) {
1106 if (type == table->types[typeIndex].type) {
1107 for (uint64_t operandIndex = 0;
1108 operandIndex < table->types[typeIndex].count; ++operandIndex) {
1109 if (nameLength ==
1110 strlen(table->types[typeIndex].entries[operandIndex].name) &&
1111 !strncmp(table->types[typeIndex].entries[operandIndex].name, name,
David Neto388c40d2015-09-16 16:42:56 -04001112 nameLength)) {
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001113 *pEntry = &table->types[typeIndex].entries[operandIndex];
1114 return SPV_SUCCESS;
1115 }
1116 }
1117 }
1118 }
1119
1120 return SPV_ERROR_INVALID_LOOKUP;
1121}
1122
1123spv_result_t spvOperandTableValueLookup(const spv_operand_table table,
1124 const spv_operand_type_t type,
1125 const uint32_t value,
Dejan Mircevski50babb22015-09-29 10:56:32 -04001126 spv_operand_desc* pEntry) {
Lei Zhang40056702015-09-11 14:31:27 -04001127 if (!table) return SPV_ERROR_INVALID_TABLE;
1128 if (!pEntry) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001129
1130 for (uint64_t typeIndex = 0; typeIndex < table->count; ++typeIndex) {
1131 if (type == table->types[typeIndex].type) {
1132 for (uint64_t operandIndex = 0;
1133 operandIndex < table->types[typeIndex].count; ++operandIndex) {
1134 if (value == table->types[typeIndex].entries[operandIndex].value) {
1135 *pEntry = &table->types[typeIndex].entries[operandIndex];
1136 return SPV_SUCCESS;
1137 }
1138 }
1139 }
1140 }
1141
1142 return SPV_ERROR_INVALID_LOOKUP;
1143}
1144
Dejan Mircevski50babb22015-09-29 10:56:32 -04001145const char* spvOperandTypeStr(spv_operand_type_t type) {
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001146 switch (type) {
1147 case SPV_OPERAND_TYPE_ID:
David Netofadbf622015-09-14 17:07:11 -04001148 case SPV_OPERAND_TYPE_OPTIONAL_ID:
David Netofadbf622015-09-14 17:07:11 -04001149 return "ID";
David Neto201caf72015-11-04 17:38:17 -05001150 case SPV_OPERAND_TYPE_TYPE_ID:
1151 return "type ID";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001152 case SPV_OPERAND_TYPE_RESULT_ID:
1153 return "result ID";
Lei Zhang6483bd72015-10-14 17:02:39 -04001154 case SPV_OPERAND_TYPE_LITERAL_INTEGER:
David Neto201caf72015-11-04 17:38:17 -05001155 case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_INTEGER:
1156 case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_NUMBER:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001157 return "literal number";
David Neto201caf72015-11-04 17:38:17 -05001158 case SPV_OPERAND_TYPE_OPTIONAL_TYPED_LITERAL_INTEGER:
1159 return "possibly multi-word literal integer";
1160 case SPV_OPERAND_TYPE_TYPED_LITERAL_NUMBER:
1161 return "possibly multi-word literal number";
1162 case SPV_OPERAND_TYPE_EXTENSION_INSTRUCTION_NUMBER:
1163 return "extension instruction number";
David Neto0f166be2015-11-11 01:56:49 -05001164 case SPV_OPERAND_TYPE_SPEC_CONSTANT_OP_NUMBER:
1165 return "OpSpecConstantOp opcode";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001166 case SPV_OPERAND_TYPE_LITERAL_STRING:
David Neto201caf72015-11-04 17:38:17 -05001167 case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_STRING:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001168 return "literal string";
1169 case SPV_OPERAND_TYPE_SOURCE_LANGUAGE:
Dejan Mircevskid2c81cf2015-10-09 11:06:10 -04001170 return "source language";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001171 case SPV_OPERAND_TYPE_EXECUTION_MODEL:
1172 return "execution model";
1173 case SPV_OPERAND_TYPE_ADDRESSING_MODEL:
1174 return "addressing model";
1175 case SPV_OPERAND_TYPE_MEMORY_MODEL:
1176 return "memory model";
1177 case SPV_OPERAND_TYPE_EXECUTION_MODE:
David Neto201caf72015-11-04 17:38:17 -05001178 case SPV_OPERAND_TYPE_OPTIONAL_EXECUTION_MODE:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001179 return "execution mode";
1180 case SPV_OPERAND_TYPE_STORAGE_CLASS:
1181 return "storage class";
1182 case SPV_OPERAND_TYPE_DIMENSIONALITY:
1183 return "dimensionality";
1184 case SPV_OPERAND_TYPE_SAMPLER_ADDRESSING_MODE:
David Netod9ad0502015-11-24 18:37:24 -05001185 return "sampler addressing mode";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001186 case SPV_OPERAND_TYPE_SAMPLER_FILTER_MODE:
1187 return "sampler filter mode";
David Netob30a0c52015-09-16 15:56:43 -04001188 case SPV_OPERAND_TYPE_SAMPLER_IMAGE_FORMAT:
Dejan Mircevski971b3442015-10-13 12:54:47 -04001189 return "image format";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001190 case SPV_OPERAND_TYPE_FP_FAST_MATH_MODE:
Dejan Mircevski355cc0c2015-10-13 15:02:03 -04001191 return "floating-point fast math mode";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001192 case SPV_OPERAND_TYPE_FP_ROUNDING_MODE:
Dejan Mircevski355cc0c2015-10-13 15:02:03 -04001193 return "floating-point rounding mode";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001194 case SPV_OPERAND_TYPE_LINKAGE_TYPE:
1195 return "linkage type";
1196 case SPV_OPERAND_TYPE_ACCESS_QUALIFIER:
1197 return "access qualifier";
1198 case SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE:
1199 return "function parameter attribute";
1200 case SPV_OPERAND_TYPE_DECORATION:
1201 return "decoration";
1202 case SPV_OPERAND_TYPE_BUILT_IN:
Dejan Mircevskid7b0f832015-10-13 15:39:38 -04001203 return "built-in";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001204 case SPV_OPERAND_TYPE_SELECTION_CONTROL:
1205 return "selection control";
1206 case SPV_OPERAND_TYPE_LOOP_CONTROL:
1207 return "loop control";
1208 case SPV_OPERAND_TYPE_FUNCTION_CONTROL:
1209 return "function control";
David Neto64a9be92015-11-18 15:48:32 -05001210 case SPV_OPERAND_TYPE_MEMORY_SEMANTICS_ID:
David Netod9ad0502015-11-24 18:37:24 -05001211 return "memory semantics ID";
David Neto201caf72015-11-04 17:38:17 -05001212 case SPV_OPERAND_TYPE_MEMORY_ACCESS:
David Neto78c3b432015-08-27 13:03:52 -04001213 case SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001214 return "memory access";
David Neto64a9be92015-11-18 15:48:32 -05001215 case SPV_OPERAND_TYPE_SCOPE_ID:
David Netod9ad0502015-11-24 18:37:24 -05001216 return "scope ID";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001217 case SPV_OPERAND_TYPE_GROUP_OPERATION:
1218 return "group operation";
1219 case SPV_OPERAND_TYPE_KERNEL_ENQ_FLAGS:
1220 return "kernel enqeue flags";
David Neto47994822015-08-27 13:11:01 -04001221 case SPV_OPERAND_TYPE_KERNEL_PROFILING_INFO:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001222 return "kernel profiling info";
1223 case SPV_OPERAND_TYPE_CAPABILITY:
1224 return "capability";
David Neto201caf72015-11-04 17:38:17 -05001225 case SPV_OPERAND_TYPE_IMAGE:
David Netoee1b3bb2015-09-18 11:19:18 -04001226 case SPV_OPERAND_TYPE_OPTIONAL_IMAGE:
David Netod9ad0502015-11-24 18:37:24 -05001227 return "image";
David Neto201caf72015-11-04 17:38:17 -05001228 case SPV_OPERAND_TYPE_OPTIONAL_CIV:
1229 return "context-insensitive value";
1230
1231 // The next values are for values returned from an instruction, not actually
1232 // an operand. So the specific strings don't matter. But let's add them
1233 // for completeness and ease of testing.
1234 case SPV_OPERAND_TYPE_IMAGE_CHANNEL_ORDER:
1235 return "image channel order";
1236 case SPV_OPERAND_TYPE_IMAGE_CHANNEL_DATA_TYPE:
1237 return "image channel data type";
1238
David Neto78c3b432015-08-27 13:03:52 -04001239 case SPV_OPERAND_TYPE_NONE:
1240 return "NONE";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001241 default:
1242 assert(0 && "Unhandled operand type!");
1243 break;
1244 }
1245 return "unknown";
1246}
David Neto78c3b432015-08-27 13:03:52 -04001247
1248void spvPrependOperandTypes(const spv_operand_type_t* types,
1249 spv_operand_pattern_t* pattern) {
1250 const spv_operand_type_t* endTypes;
Dejan Mircevski50babb22015-09-29 10:56:32 -04001251 for (endTypes = types; *endTypes != SPV_OPERAND_TYPE_NONE; ++endTypes)
David Neto78c3b432015-08-27 13:03:52 -04001252 ;
1253 pattern->insert(pattern->begin(), types, endTypes);
1254}
1255
David Neto5bf88fc2015-09-17 17:06:10 -04001256void spvPrependOperandTypesForMask(const spv_operand_table operandTable,
1257 const spv_operand_type_t type,
1258 const uint32_t mask,
1259 spv_operand_pattern_t* pattern) {
1260 // Scan from highest bits to lowest bits because we will prepend in LIFO
1261 // fashion, and we need the operands for lower order bits to appear first.
1262 for (uint32_t candidate_bit = (1 << 31); candidate_bit; candidate_bit >>= 1) {
1263 if (candidate_bit & mask) {
1264 spv_operand_desc entry = nullptr;
1265 if (SPV_SUCCESS == spvOperandTableValueLookup(operandTable, type,
1266 candidate_bit, &entry)) {
1267 spvPrependOperandTypes(entry->operandTypes, pattern);
1268 }
1269 }
1270 }
1271}
1272
David Netob5267562016-02-02 12:05:34 -05001273bool spvOperandIsConcreteMask(spv_operand_type_t type) {
1274 return SPV_OPERAND_TYPE_FIRST_CONCRETE_MASK_TYPE <= type &&
1275 type <= SPV_OPERAND_TYPE_LAST_CONCRETE_MASK_TYPE;
1276}
1277
David Neto78c3b432015-08-27 13:03:52 -04001278bool spvOperandIsOptional(spv_operand_type_t type) {
David Neto201caf72015-11-04 17:38:17 -05001279 return SPV_OPERAND_TYPE_FIRST_OPTIONAL_TYPE <= type &&
1280 type <= SPV_OPERAND_TYPE_LAST_OPTIONAL_TYPE;
David Neto78c3b432015-08-27 13:03:52 -04001281}
1282
1283bool spvOperandIsVariable(spv_operand_type_t type) {
David Neto201caf72015-11-04 17:38:17 -05001284 return SPV_OPERAND_TYPE_FIRST_VARIABLE_TYPE <= type &&
1285 type <= SPV_OPERAND_TYPE_LAST_VARIABLE_TYPE;
David Neto78c3b432015-08-27 13:03:52 -04001286}
1287
David Neto78c3b432015-08-27 13:03:52 -04001288bool spvExpandOperandSequenceOnce(spv_operand_type_t type,
1289 spv_operand_pattern_t* pattern) {
1290 switch (type) {
1291 case SPV_OPERAND_TYPE_VARIABLE_ID:
1292 pattern->insert(pattern->begin(), {SPV_OPERAND_TYPE_OPTIONAL_ID, type});
1293 return true;
Lei Zhang6483bd72015-10-14 17:02:39 -04001294 case SPV_OPERAND_TYPE_VARIABLE_LITERAL_INTEGER:
David Neto78c3b432015-08-27 13:03:52 -04001295 pattern->insert(pattern->begin(),
Lei Zhang6483bd72015-10-14 17:02:39 -04001296 {SPV_OPERAND_TYPE_OPTIONAL_LITERAL_INTEGER, type});
David Neto78c3b432015-08-27 13:03:52 -04001297 return true;
Lei Zhang6483bd72015-10-14 17:02:39 -04001298 case SPV_OPERAND_TYPE_VARIABLE_LITERAL_INTEGER_ID:
David Neto201caf72015-11-04 17:38:17 -05001299 // Represents Zero or more (Literal number, Id) pairs,
1300 // where the literal number must be a scalar integer.
David Neto78c3b432015-08-27 13:03:52 -04001301 pattern->insert(pattern->begin(),
David Neto201caf72015-11-04 17:38:17 -05001302 {SPV_OPERAND_TYPE_OPTIONAL_TYPED_LITERAL_INTEGER,
1303 SPV_OPERAND_TYPE_ID, type});
David Neto78c3b432015-08-27 13:03:52 -04001304 return true;
Lei Zhang6483bd72015-10-14 17:02:39 -04001305 case SPV_OPERAND_TYPE_VARIABLE_ID_LITERAL_INTEGER:
David Neto561dc4e2015-09-25 14:23:29 -04001306 // Represents Zero or more (Id, Literal number) pairs.
David Neto201caf72015-11-04 17:38:17 -05001307 pattern->insert(pattern->begin(),
1308 {SPV_OPERAND_TYPE_OPTIONAL_ID,
1309 SPV_OPERAND_TYPE_LITERAL_INTEGER, type});
David Neto78c3b432015-08-27 13:03:52 -04001310 return true;
David Neto78c3b432015-08-27 13:03:52 -04001311 case SPV_OPERAND_TYPE_VARIABLE_EXECUTION_MODE:
Dejan Mircevski50babb22015-09-29 10:56:32 -04001312 pattern->insert(pattern->begin(),
1313 {SPV_OPERAND_TYPE_OPTIONAL_EXECUTION_MODE, type});
David Neto78c3b432015-08-27 13:03:52 -04001314 return true;
1315 default:
1316 break;
1317 }
1318 return false;
1319}
1320
Dejan Mircevski50babb22015-09-29 10:56:32 -04001321spv_operand_type_t spvTakeFirstMatchableOperand(
1322 spv_operand_pattern_t* pattern) {
David Neto78c3b432015-08-27 13:03:52 -04001323 assert(!pattern->empty());
1324 spv_operand_type_t result;
1325 do {
1326 result = pattern->front();
1327 pattern->pop_front();
Dejan Mircevski50babb22015-09-29 10:56:32 -04001328 } while (spvExpandOperandSequenceOnce(result, pattern));
David Neto78c3b432015-08-27 13:03:52 -04001329 return result;
1330}
Dejan Mircevski903f9d62015-09-28 17:04:39 -04001331
Dejan Mircevski897bff92015-09-29 10:38:18 -04001332spv_operand_pattern_t spvAlternatePatternFollowingImmediate(
1333 const spv_operand_pattern_t& pattern) {
1334 spv_operand_pattern_t alternatePattern;
1335 for (const auto& operand : pattern) {
1336 if (operand == SPV_OPERAND_TYPE_RESULT_ID) {
1337 alternatePattern.push_back(operand);
1338 alternatePattern.push_back(SPV_OPERAND_TYPE_OPTIONAL_CIV);
1339 return alternatePattern;
Dejan Mircevski903f9d62015-09-28 17:04:39 -04001340 }
Dejan Mircevski897bff92015-09-29 10:38:18 -04001341 alternatePattern.push_back(SPV_OPERAND_TYPE_OPTIONAL_CIV);
Dejan Mircevski903f9d62015-09-28 17:04:39 -04001342 }
Dejan Mircevski897bff92015-09-29 10:38:18 -04001343 // No result-id found, so just expect CIVs.
1344 return {SPV_OPERAND_TYPE_OPTIONAL_CIV};
Dejan Mircevski903f9d62015-09-28 17:04:39 -04001345}
Dejan Mircevski961f5dc2016-01-15 11:25:11 -05001346
1347bool spvIsIdType(spv_operand_type_t type) {
1348 switch (type) {
1349 case SPV_OPERAND_TYPE_ID:
1350 case SPV_OPERAND_TYPE_TYPE_ID:
1351 case SPV_OPERAND_TYPE_RESULT_ID:
1352 case SPV_OPERAND_TYPE_MEMORY_SEMANTICS_ID:
1353 case SPV_OPERAND_TYPE_SCOPE_ID:
1354 return true;
1355 default:
1356 return false;
1357 }
1358 return false;
1359}