blob: 02c1b03b5de99032226e0f8fbdf23944a37ca298 [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
1010static const spv_operand_desc_group_t opcodeEntryTypes[] = {
1011 {SPV_OPERAND_TYPE_SOURCE_LANGUAGE,
1012 sizeof(sourceLanguageEntries) / sizeof(spv_operand_desc_t),
1013 sourceLanguageEntries},
1014 {SPV_OPERAND_TYPE_EXECUTION_MODEL,
1015 sizeof(executionModelEntries) / sizeof(spv_operand_desc_t),
1016 executionModelEntries},
1017 {SPV_OPERAND_TYPE_ADDRESSING_MODEL,
1018 sizeof(addressingModelEntries) / sizeof(spv_operand_desc_t),
1019 addressingModelEntries},
1020 {SPV_OPERAND_TYPE_MEMORY_MODEL,
1021 sizeof(memoryModelEntries) / sizeof(spv_operand_desc_t),
1022 memoryModelEntries},
1023 {SPV_OPERAND_TYPE_EXECUTION_MODE,
1024 sizeof(executionModeEntries) / sizeof(spv_operand_desc_t),
1025 executionModeEntries},
1026 {SPV_OPERAND_TYPE_STORAGE_CLASS,
1027 sizeof(storageClassEntries) / sizeof(spv_operand_desc_t),
1028 storageClassEntries},
1029 {SPV_OPERAND_TYPE_DIMENSIONALITY,
1030 sizeof(dimensionalityEntries) / sizeof(spv_operand_desc_t),
1031 dimensionalityEntries},
1032 {SPV_OPERAND_TYPE_SAMPLER_ADDRESSING_MODE,
1033 sizeof(samplerAddressingModeEntries) / sizeof(spv_operand_desc_t),
1034 samplerAddressingModeEntries},
1035 {SPV_OPERAND_TYPE_SAMPLER_FILTER_MODE,
1036 sizeof(samplerFilterModeEntries) / sizeof(spv_operand_desc_t),
1037 samplerFilterModeEntries},
David Netob30a0c52015-09-16 15:56:43 -04001038 {SPV_OPERAND_TYPE_SAMPLER_IMAGE_FORMAT,
1039 sizeof(samplerImageFormatEntries) / sizeof(spv_operand_desc_t),
1040 samplerImageFormatEntries},
David Netoddda85a2015-10-02 17:10:10 -04001041 {SPV_OPERAND_TYPE_IMAGE_CHANNEL_ORDER,
1042 sizeof(imageChannelOrderEntries) / sizeof(spv_operand_desc_t),
1043 imageChannelOrderEntries},
1044 {SPV_OPERAND_TYPE_IMAGE_CHANNEL_DATA_TYPE,
1045 sizeof(imageChannelDataTypeEntries) / sizeof(spv_operand_desc_t),
1046 imageChannelDataTypeEntries},
David Neto201caf72015-11-04 17:38:17 -05001047 {SPV_OPERAND_TYPE_IMAGE,
1048 sizeof(imageOperandEntries) / sizeof(spv_operand_desc_t),
1049 imageOperandEntries},
1050 {SPV_OPERAND_TYPE_OPTIONAL_IMAGE, // Same as *_IMAGE
David Netoee1b3bb2015-09-18 11:19:18 -04001051 sizeof(imageOperandEntries) / sizeof(spv_operand_desc_t),
1052 imageOperandEntries},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001053 {SPV_OPERAND_TYPE_FP_FAST_MATH_MODE,
1054 sizeof(fpFastMathModeEntries) / sizeof(spv_operand_desc_t),
1055 fpFastMathModeEntries},
1056 {SPV_OPERAND_TYPE_FP_ROUNDING_MODE,
1057 sizeof(fpRoundingModeEntries) / sizeof(spv_operand_desc_t),
1058 fpRoundingModeEntries},
1059 {SPV_OPERAND_TYPE_LINKAGE_TYPE,
1060 sizeof(linkageTypeEntries) / sizeof(spv_operand_desc_t),
1061 linkageTypeEntries},
1062 {SPV_OPERAND_TYPE_ACCESS_QUALIFIER,
1063 sizeof(accessQualifierEntries) / sizeof(spv_operand_desc_t),
1064 accessQualifierEntries},
1065 {SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE,
1066 sizeof(functionParameterAttributeEntries) / sizeof(spv_operand_desc_t),
1067 functionParameterAttributeEntries},
1068 {SPV_OPERAND_TYPE_DECORATION,
1069 sizeof(decorationEntries) / sizeof(spv_operand_desc_t), decorationEntries},
1070 {SPV_OPERAND_TYPE_BUILT_IN,
1071 sizeof(builtInEntries) / sizeof(spv_operand_desc_t), builtInEntries},
1072 {SPV_OPERAND_TYPE_SELECTION_CONTROL,
1073 sizeof(selectionControlEntries) / sizeof(spv_operand_desc_t),
1074 selectionControlEntries},
1075 {SPV_OPERAND_TYPE_LOOP_CONTROL,
1076 sizeof(loopControlEntries) / sizeof(spv_operand_desc_t),
1077 loopControlEntries},
1078 {SPV_OPERAND_TYPE_FUNCTION_CONTROL,
1079 sizeof(functionControlEntries) / sizeof(spv_operand_desc_t),
1080 functionControlEntries},
David Neto64a9be92015-11-18 15:48:32 -05001081 {SPV_OPERAND_TYPE_MEMORY_SEMANTICS_ID,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001082 sizeof(memorySemanticsEntries) / sizeof(spv_operand_desc_t),
1083 memorySemanticsEntries},
David Neto201caf72015-11-04 17:38:17 -05001084 {SPV_OPERAND_TYPE_MEMORY_ACCESS,
1085 sizeof(memoryAccessEntries) / sizeof(spv_operand_desc_t),
1086 memoryAccessEntries},
1087 {SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS, // Same as *_MEMORY_ACCESS
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001088 sizeof(memoryAccessEntries) / sizeof(spv_operand_desc_t),
1089 memoryAccessEntries},
David Neto64a9be92015-11-18 15:48:32 -05001090 {SPV_OPERAND_TYPE_SCOPE_ID,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001091 sizeof(scopeEntries) / sizeof(spv_operand_desc_t), scopeEntries},
1092 {SPV_OPERAND_TYPE_GROUP_OPERATION,
1093 sizeof(groupOperationEntries) / sizeof(spv_operand_desc_t),
1094 groupOperationEntries},
1095 {SPV_OPERAND_TYPE_KERNEL_ENQ_FLAGS,
1096 sizeof(kernelKernelEnqueueFlagssEntries) / sizeof(spv_operand_desc_t),
1097 kernelKernelEnqueueFlagssEntries},
David Neto47994822015-08-27 13:11:01 -04001098 {SPV_OPERAND_TYPE_KERNEL_PROFILING_INFO,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001099 sizeof(kernelProfilingInfoEntries) / sizeof(spv_operand_desc_t),
1100 kernelProfilingInfoEntries},
1101 {SPV_OPERAND_TYPE_CAPABILITY,
1102 sizeof(capabilityInfoEntries) / sizeof(spv_operand_desc_t),
1103 capabilityInfoEntries},
1104};
1105
Dejan Mircevski50babb22015-09-29 10:56:32 -04001106spv_result_t spvOperandTableGet(spv_operand_table* pOperandTable) {
Lei Zhang40056702015-09-11 14:31:27 -04001107 if (!pOperandTable) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001108
1109 static const spv_operand_table_t table = {
1110 sizeof(opcodeEntryTypes) / sizeof(spv_operand_desc_group_t),
1111 opcodeEntryTypes};
1112
1113 *pOperandTable = &table;
1114
1115 return SPV_SUCCESS;
1116}
1117
1118spv_result_t spvOperandTableNameLookup(const spv_operand_table table,
1119 const spv_operand_type_t type,
David Neto388c40d2015-09-16 16:42:56 -04001120 const char* name,
1121 const size_t nameLength,
1122 spv_operand_desc* pEntry) {
Lei Zhang40056702015-09-11 14:31:27 -04001123 if (!table) return SPV_ERROR_INVALID_TABLE;
1124 if (!name || !pEntry) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001125
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001126 for (uint64_t typeIndex = 0; typeIndex < table->count; ++typeIndex) {
1127 if (type == table->types[typeIndex].type) {
1128 for (uint64_t operandIndex = 0;
1129 operandIndex < table->types[typeIndex].count; ++operandIndex) {
1130 if (nameLength ==
1131 strlen(table->types[typeIndex].entries[operandIndex].name) &&
1132 !strncmp(table->types[typeIndex].entries[operandIndex].name, name,
David Neto388c40d2015-09-16 16:42:56 -04001133 nameLength)) {
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001134 *pEntry = &table->types[typeIndex].entries[operandIndex];
1135 return SPV_SUCCESS;
1136 }
1137 }
1138 }
1139 }
1140
1141 return SPV_ERROR_INVALID_LOOKUP;
1142}
1143
1144spv_result_t spvOperandTableValueLookup(const spv_operand_table table,
1145 const spv_operand_type_t type,
1146 const uint32_t value,
Dejan Mircevski50babb22015-09-29 10:56:32 -04001147 spv_operand_desc* pEntry) {
Lei Zhang40056702015-09-11 14:31:27 -04001148 if (!table) return SPV_ERROR_INVALID_TABLE;
1149 if (!pEntry) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001150
1151 for (uint64_t typeIndex = 0; typeIndex < table->count; ++typeIndex) {
1152 if (type == table->types[typeIndex].type) {
1153 for (uint64_t operandIndex = 0;
1154 operandIndex < table->types[typeIndex].count; ++operandIndex) {
1155 if (value == table->types[typeIndex].entries[operandIndex].value) {
1156 *pEntry = &table->types[typeIndex].entries[operandIndex];
1157 return SPV_SUCCESS;
1158 }
1159 }
1160 }
1161 }
1162
1163 return SPV_ERROR_INVALID_LOOKUP;
1164}
1165
Dejan Mircevski50babb22015-09-29 10:56:32 -04001166const char* spvOperandTypeStr(spv_operand_type_t type) {
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001167 switch (type) {
1168 case SPV_OPERAND_TYPE_ID:
David Netofadbf622015-09-14 17:07:11 -04001169 case SPV_OPERAND_TYPE_OPTIONAL_ID:
David Netofadbf622015-09-14 17:07:11 -04001170 return "ID";
David Neto201caf72015-11-04 17:38:17 -05001171 case SPV_OPERAND_TYPE_TYPE_ID:
1172 return "type ID";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001173 case SPV_OPERAND_TYPE_RESULT_ID:
1174 return "result ID";
Lei Zhang6483bd72015-10-14 17:02:39 -04001175 case SPV_OPERAND_TYPE_LITERAL_INTEGER:
David Neto201caf72015-11-04 17:38:17 -05001176 case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_INTEGER:
1177 case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_NUMBER:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001178 return "literal number";
David Neto201caf72015-11-04 17:38:17 -05001179 case SPV_OPERAND_TYPE_OPTIONAL_TYPED_LITERAL_INTEGER:
1180 return "possibly multi-word literal integer";
1181 case SPV_OPERAND_TYPE_TYPED_LITERAL_NUMBER:
1182 return "possibly multi-word literal number";
1183 case SPV_OPERAND_TYPE_EXTENSION_INSTRUCTION_NUMBER:
1184 return "extension instruction number";
David Neto0f166be2015-11-11 01:56:49 -05001185 case SPV_OPERAND_TYPE_SPEC_CONSTANT_OP_NUMBER:
1186 return "OpSpecConstantOp opcode";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001187 case SPV_OPERAND_TYPE_LITERAL_STRING:
David Neto201caf72015-11-04 17:38:17 -05001188 case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_STRING:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001189 return "literal string";
1190 case SPV_OPERAND_TYPE_SOURCE_LANGUAGE:
Dejan Mircevskid2c81cf2015-10-09 11:06:10 -04001191 return "source language";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001192 case SPV_OPERAND_TYPE_EXECUTION_MODEL:
1193 return "execution model";
1194 case SPV_OPERAND_TYPE_ADDRESSING_MODEL:
1195 return "addressing model";
1196 case SPV_OPERAND_TYPE_MEMORY_MODEL:
1197 return "memory model";
1198 case SPV_OPERAND_TYPE_EXECUTION_MODE:
David Neto201caf72015-11-04 17:38:17 -05001199 case SPV_OPERAND_TYPE_OPTIONAL_EXECUTION_MODE:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001200 return "execution mode";
1201 case SPV_OPERAND_TYPE_STORAGE_CLASS:
1202 return "storage class";
1203 case SPV_OPERAND_TYPE_DIMENSIONALITY:
1204 return "dimensionality";
1205 case SPV_OPERAND_TYPE_SAMPLER_ADDRESSING_MODE:
David Netod9ad0502015-11-24 18:37:24 -05001206 return "sampler addressing mode";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001207 case SPV_OPERAND_TYPE_SAMPLER_FILTER_MODE:
1208 return "sampler filter mode";
David Netob30a0c52015-09-16 15:56:43 -04001209 case SPV_OPERAND_TYPE_SAMPLER_IMAGE_FORMAT:
Dejan Mircevski971b3442015-10-13 12:54:47 -04001210 return "image format";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001211 case SPV_OPERAND_TYPE_FP_FAST_MATH_MODE:
Dejan Mircevski355cc0c2015-10-13 15:02:03 -04001212 return "floating-point fast math mode";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001213 case SPV_OPERAND_TYPE_FP_ROUNDING_MODE:
Dejan Mircevski355cc0c2015-10-13 15:02:03 -04001214 return "floating-point rounding mode";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001215 case SPV_OPERAND_TYPE_LINKAGE_TYPE:
1216 return "linkage type";
1217 case SPV_OPERAND_TYPE_ACCESS_QUALIFIER:
1218 return "access qualifier";
1219 case SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE:
1220 return "function parameter attribute";
1221 case SPV_OPERAND_TYPE_DECORATION:
1222 return "decoration";
1223 case SPV_OPERAND_TYPE_BUILT_IN:
Dejan Mircevskid7b0f832015-10-13 15:39:38 -04001224 return "built-in";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001225 case SPV_OPERAND_TYPE_SELECTION_CONTROL:
1226 return "selection control";
1227 case SPV_OPERAND_TYPE_LOOP_CONTROL:
1228 return "loop control";
1229 case SPV_OPERAND_TYPE_FUNCTION_CONTROL:
1230 return "function control";
David Neto64a9be92015-11-18 15:48:32 -05001231 case SPV_OPERAND_TYPE_MEMORY_SEMANTICS_ID:
David Netod9ad0502015-11-24 18:37:24 -05001232 return "memory semantics ID";
David Neto201caf72015-11-04 17:38:17 -05001233 case SPV_OPERAND_TYPE_MEMORY_ACCESS:
David Neto78c3b432015-08-27 13:03:52 -04001234 case SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001235 return "memory access";
David Neto64a9be92015-11-18 15:48:32 -05001236 case SPV_OPERAND_TYPE_SCOPE_ID:
David Netod9ad0502015-11-24 18:37:24 -05001237 return "scope ID";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001238 case SPV_OPERAND_TYPE_GROUP_OPERATION:
1239 return "group operation";
1240 case SPV_OPERAND_TYPE_KERNEL_ENQ_FLAGS:
1241 return "kernel enqeue flags";
David Neto47994822015-08-27 13:11:01 -04001242 case SPV_OPERAND_TYPE_KERNEL_PROFILING_INFO:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001243 return "kernel profiling info";
1244 case SPV_OPERAND_TYPE_CAPABILITY:
1245 return "capability";
David Neto201caf72015-11-04 17:38:17 -05001246 case SPV_OPERAND_TYPE_IMAGE:
David Netoee1b3bb2015-09-18 11:19:18 -04001247 case SPV_OPERAND_TYPE_OPTIONAL_IMAGE:
David Netod9ad0502015-11-24 18:37:24 -05001248 return "image";
David Neto201caf72015-11-04 17:38:17 -05001249 case SPV_OPERAND_TYPE_OPTIONAL_CIV:
1250 return "context-insensitive value";
1251
1252 // The next values are for values returned from an instruction, not actually
1253 // an operand. So the specific strings don't matter. But let's add them
1254 // for completeness and ease of testing.
1255 case SPV_OPERAND_TYPE_IMAGE_CHANNEL_ORDER:
1256 return "image channel order";
1257 case SPV_OPERAND_TYPE_IMAGE_CHANNEL_DATA_TYPE:
1258 return "image channel data type";
1259
David Neto78c3b432015-08-27 13:03:52 -04001260 case SPV_OPERAND_TYPE_NONE:
1261 return "NONE";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001262 default:
1263 assert(0 && "Unhandled operand type!");
1264 break;
1265 }
1266 return "unknown";
1267}
David Neto78c3b432015-08-27 13:03:52 -04001268
1269void spvPrependOperandTypes(const spv_operand_type_t* types,
1270 spv_operand_pattern_t* pattern) {
1271 const spv_operand_type_t* endTypes;
Dejan Mircevski50babb22015-09-29 10:56:32 -04001272 for (endTypes = types; *endTypes != SPV_OPERAND_TYPE_NONE; ++endTypes)
David Neto78c3b432015-08-27 13:03:52 -04001273 ;
1274 pattern->insert(pattern->begin(), types, endTypes);
1275}
1276
David Neto5bf88fc2015-09-17 17:06:10 -04001277void spvPrependOperandTypesForMask(const spv_operand_table operandTable,
1278 const spv_operand_type_t type,
1279 const uint32_t mask,
1280 spv_operand_pattern_t* pattern) {
1281 // Scan from highest bits to lowest bits because we will prepend in LIFO
1282 // fashion, and we need the operands for lower order bits to appear first.
1283 for (uint32_t candidate_bit = (1 << 31); candidate_bit; candidate_bit >>= 1) {
1284 if (candidate_bit & mask) {
1285 spv_operand_desc entry = nullptr;
1286 if (SPV_SUCCESS == spvOperandTableValueLookup(operandTable, type,
1287 candidate_bit, &entry)) {
1288 spvPrependOperandTypes(entry->operandTypes, pattern);
1289 }
1290 }
1291 }
1292}
1293
David Neto78c3b432015-08-27 13:03:52 -04001294bool spvOperandIsOptional(spv_operand_type_t type) {
David Neto201caf72015-11-04 17:38:17 -05001295 return SPV_OPERAND_TYPE_FIRST_OPTIONAL_TYPE <= type &&
1296 type <= SPV_OPERAND_TYPE_LAST_OPTIONAL_TYPE;
David Neto78c3b432015-08-27 13:03:52 -04001297}
1298
1299bool spvOperandIsVariable(spv_operand_type_t type) {
David Neto201caf72015-11-04 17:38:17 -05001300 return SPV_OPERAND_TYPE_FIRST_VARIABLE_TYPE <= type &&
1301 type <= SPV_OPERAND_TYPE_LAST_VARIABLE_TYPE;
David Neto78c3b432015-08-27 13:03:52 -04001302}
1303
David Neto78c3b432015-08-27 13:03:52 -04001304bool spvExpandOperandSequenceOnce(spv_operand_type_t type,
1305 spv_operand_pattern_t* pattern) {
1306 switch (type) {
1307 case SPV_OPERAND_TYPE_VARIABLE_ID:
1308 pattern->insert(pattern->begin(), {SPV_OPERAND_TYPE_OPTIONAL_ID, type});
1309 return true;
Lei Zhang6483bd72015-10-14 17:02:39 -04001310 case SPV_OPERAND_TYPE_VARIABLE_LITERAL_INTEGER:
David Neto78c3b432015-08-27 13:03:52 -04001311 pattern->insert(pattern->begin(),
Lei Zhang6483bd72015-10-14 17:02:39 -04001312 {SPV_OPERAND_TYPE_OPTIONAL_LITERAL_INTEGER, type});
David Neto78c3b432015-08-27 13:03:52 -04001313 return true;
Lei Zhang6483bd72015-10-14 17:02:39 -04001314 case SPV_OPERAND_TYPE_VARIABLE_LITERAL_INTEGER_ID:
David Neto201caf72015-11-04 17:38:17 -05001315 // Represents Zero or more (Literal number, Id) pairs,
1316 // where the literal number must be a scalar integer.
David Neto78c3b432015-08-27 13:03:52 -04001317 pattern->insert(pattern->begin(),
David Neto201caf72015-11-04 17:38:17 -05001318 {SPV_OPERAND_TYPE_OPTIONAL_TYPED_LITERAL_INTEGER,
1319 SPV_OPERAND_TYPE_ID, type});
David Neto78c3b432015-08-27 13:03:52 -04001320 return true;
Lei Zhang6483bd72015-10-14 17:02:39 -04001321 case SPV_OPERAND_TYPE_VARIABLE_ID_LITERAL_INTEGER:
David Neto561dc4e2015-09-25 14:23:29 -04001322 // Represents Zero or more (Id, Literal number) pairs.
David Neto201caf72015-11-04 17:38:17 -05001323 pattern->insert(pattern->begin(),
1324 {SPV_OPERAND_TYPE_OPTIONAL_ID,
1325 SPV_OPERAND_TYPE_LITERAL_INTEGER, type});
David Neto78c3b432015-08-27 13:03:52 -04001326 return true;
David Neto78c3b432015-08-27 13:03:52 -04001327 case SPV_OPERAND_TYPE_VARIABLE_EXECUTION_MODE:
Dejan Mircevski50babb22015-09-29 10:56:32 -04001328 pattern->insert(pattern->begin(),
1329 {SPV_OPERAND_TYPE_OPTIONAL_EXECUTION_MODE, type});
David Neto78c3b432015-08-27 13:03:52 -04001330 return true;
1331 default:
1332 break;
1333 }
1334 return false;
1335}
1336
Dejan Mircevski50babb22015-09-29 10:56:32 -04001337spv_operand_type_t spvTakeFirstMatchableOperand(
1338 spv_operand_pattern_t* pattern) {
David Neto78c3b432015-08-27 13:03:52 -04001339 assert(!pattern->empty());
1340 spv_operand_type_t result;
1341 do {
1342 result = pattern->front();
1343 pattern->pop_front();
Dejan Mircevski50babb22015-09-29 10:56:32 -04001344 } while (spvExpandOperandSequenceOnce(result, pattern));
David Neto78c3b432015-08-27 13:03:52 -04001345 return result;
1346}
Dejan Mircevski903f9d62015-09-28 17:04:39 -04001347
Dejan Mircevski897bff92015-09-29 10:38:18 -04001348spv_operand_pattern_t spvAlternatePatternFollowingImmediate(
1349 const spv_operand_pattern_t& pattern) {
1350 spv_operand_pattern_t alternatePattern;
1351 for (const auto& operand : pattern) {
1352 if (operand == SPV_OPERAND_TYPE_RESULT_ID) {
1353 alternatePattern.push_back(operand);
1354 alternatePattern.push_back(SPV_OPERAND_TYPE_OPTIONAL_CIV);
1355 return alternatePattern;
Dejan Mircevski903f9d62015-09-28 17:04:39 -04001356 }
Dejan Mircevski897bff92015-09-29 10:38:18 -04001357 alternatePattern.push_back(SPV_OPERAND_TYPE_OPTIONAL_CIV);
Dejan Mircevski903f9d62015-09-28 17:04:39 -04001358 }
Dejan Mircevski897bff92015-09-29 10:38:18 -04001359 // No result-id found, so just expect CIVs.
1360 return {SPV_OPERAND_TYPE_OPTIONAL_CIV};
Dejan Mircevski903f9d62015-09-28 17:04:39 -04001361}