blob: a6b1ea77ec30f7917141b6705fe8b44de0fb7399 [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}},
36 {"OpenCL", SpvSourceLanguageOpenCL, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010037};
38
39static const spv_operand_desc_t executionModelEntries[] = {
40 {"Vertex",
Lei Zhangb36e7042015-10-28 13:40:52 -040041 SpvExecutionModelVertex,
42 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010043 {SPV_OPERAND_TYPE_NONE}},
44 {"TessellationControl",
Lei Zhangb36e7042015-10-28 13:40:52 -040045 SpvExecutionModelTessellationControl,
46 SPV_CAPABILITY_AS_MASK(SpvCapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010047 {SPV_OPERAND_TYPE_NONE}},
48 {"TessellationEvaluation",
Lei Zhangb36e7042015-10-28 13:40:52 -040049 SpvExecutionModelTessellationEvaluation,
50 SPV_CAPABILITY_AS_MASK(SpvCapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010051 {SPV_OPERAND_TYPE_NONE}},
52 {"Geometry",
Lei Zhangb36e7042015-10-28 13:40:52 -040053 SpvExecutionModelGeometry,
54 SPV_CAPABILITY_AS_MASK(SpvCapabilityGeometry),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010055 {SPV_OPERAND_TYPE_NONE}},
56 {"Fragment",
Lei Zhangb36e7042015-10-28 13:40:52 -040057 SpvExecutionModelFragment,
58 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010059 {SPV_OPERAND_TYPE_NONE}},
60 {"GLCompute",
Lei Zhangb36e7042015-10-28 13:40:52 -040061 SpvExecutionModelGLCompute,
62 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010063 {SPV_OPERAND_TYPE_NONE}},
64 {"Kernel",
Lei Zhangb36e7042015-10-28 13:40:52 -040065 SpvExecutionModelKernel,
66 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010067 {SPV_OPERAND_TYPE_NONE}},
68};
69
70static const spv_operand_desc_t addressingModelEntries[] = {
Lei Zhang1a0334e2015-11-02 09:41:20 -050071 {"Logical", SpvAddressingModelLogical, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010072 {"Physical32",
Lei Zhangb36e7042015-10-28 13:40:52 -040073 SpvAddressingModelPhysical32,
74 SPV_CAPABILITY_AS_MASK(SpvCapabilityAddresses),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010075 {SPV_OPERAND_TYPE_NONE}},
76 {"Physical64",
Lei Zhangb36e7042015-10-28 13:40:52 -040077 SpvAddressingModelPhysical64,
78 SPV_CAPABILITY_AS_MASK(SpvCapabilityAddresses),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010079 {SPV_OPERAND_TYPE_NONE}},
80};
81
82static const spv_operand_desc_t memoryModelEntries[] = {
83 {"Simple",
Lei Zhangb36e7042015-10-28 13:40:52 -040084 SpvMemoryModelSimple,
85 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010086 {SPV_OPERAND_TYPE_NONE}},
87 {"GLSL450",
Lei Zhangb36e7042015-10-28 13:40:52 -040088 SpvMemoryModelGLSL450,
89 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010090 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -040091 {"OpenCL",
Lei Zhangb36e7042015-10-28 13:40:52 -040092 SpvMemoryModelOpenCL,
93 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010094 {SPV_OPERAND_TYPE_NONE}},
95};
96
Lei Zhang85c6f792015-09-23 15:42:18 -040097// Execution mode requiring the given capability and having no operands.
Lei Zhangb36e7042015-10-28 13:40:52 -040098#define ExecMode0(mode, cap) \
99 #mode, SpvExecutionMode##mode, SPV_CAPABILITY_AS_MASK(SpvCapability##cap), { \
100 SPV_OPERAND_TYPE_NONE \
Lei Zhang85c6f792015-09-23 15:42:18 -0400101 }
102// Execution mode requiring the given capability and having one literal number
103// operand.
Lei Zhangb36e7042015-10-28 13:40:52 -0400104#define ExecMode1(mode, cap) \
105 #mode, SpvExecutionMode##mode, SPV_CAPABILITY_AS_MASK(SpvCapability##cap), { \
106 SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE \
Lei Zhang85c6f792015-09-23 15:42:18 -0400107 }
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100108static const spv_operand_desc_t executionModeEntries[] = {
Lei Zhang85c6f792015-09-23 15:42:18 -0400109 {ExecMode1(Invocations, Geometry)},
110 {ExecMode0(SpacingEqual, Tessellation)},
111 {ExecMode0(SpacingFractionalEven, Tessellation)},
112 {ExecMode0(SpacingFractionalOdd, Tessellation)},
113 {ExecMode0(VertexOrderCw, Tessellation)},
114 {ExecMode0(VertexOrderCcw, Tessellation)},
115 {ExecMode0(PixelCenterInteger, Shader)},
116 {ExecMode0(OriginUpperLeft, Shader)},
117 {ExecMode0(OriginLowerLeft, Shader)},
118 {ExecMode0(EarlyFragmentTests, Shader)},
119 {ExecMode0(PointMode, Tessellation)},
Lei Zhang863ddbe2015-09-23 17:09:01 -0400120 {ExecMode0(Xfb, TransformFeedback)},
Lei Zhang85c6f792015-09-23 15:42:18 -0400121 {ExecMode0(DepthReplacing, Shader)},
Lei Zhang85c6f792015-09-23 15:42:18 -0400122 {ExecMode0(DepthGreater, Shader)},
123 {ExecMode0(DepthLess, Shader)},
124 {ExecMode0(DepthUnchanged, Shader)},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100125 {"LocalSize",
Lei Zhangb36e7042015-10-28 13:40:52 -0400126 SpvExecutionModeLocalSize,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100127 0,
Lei Zhang6483bd72015-10-14 17:02:39 -0400128 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_LITERAL_INTEGER,
129 SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100130 {"LocalSizeHint",
Lei Zhangb36e7042015-10-28 13:40:52 -0400131 SpvExecutionModeLocalSizeHint,
132 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Lei Zhang6483bd72015-10-14 17:02:39 -0400133 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_LITERAL_INTEGER,
134 SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Lei Zhang85c6f792015-09-23 15:42:18 -0400135 {ExecMode0(InputPoints, Geometry)},
136 {ExecMode0(InputLines, Geometry)},
137 {ExecMode0(InputLinesAdjacency, Geometry)},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100138 {"InputTriangles",
Lei Zhangb36e7042015-10-28 13:40:52 -0400139 SpvExecutionModeInputTriangles,
140 SPV_CAPABILITY_AS_MASK(SpvCapabilityGeometry) |
141 SPV_CAPABILITY_AS_MASK(SpvCapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100142 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang85c6f792015-09-23 15:42:18 -0400143 {ExecMode0(InputTrianglesAdjacency, Geometry)},
144 {ExecMode0(InputQuads, Tessellation)},
145 {ExecMode0(InputIsolines, Tessellation)},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100146 {"OutputVertices",
Lei Zhangb36e7042015-10-28 13:40:52 -0400147 SpvExecutionModeOutputVertices,
148 SPV_CAPABILITY_AS_MASK(SpvCapabilityGeometry) |
149 SPV_CAPABILITY_AS_MASK(SpvCapabilityTessellation),
Lei Zhang6483bd72015-10-14 17:02:39 -0400150 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Lei Zhang85c6f792015-09-23 15:42:18 -0400151 {ExecMode0(OutputPoints, Geometry)},
152 {ExecMode0(OutputLineStrip, Geometry)},
153 {ExecMode0(OutputTriangleStrip, Geometry)},
154 {ExecMode1(VecTypeHint, Kernel)},
155 {ExecMode0(ContractionOff, Kernel)},
156 {ExecMode0(IndependentForwardProgress, 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}},
179 {"WorkgroupLocal",
Lei Zhangb36e7042015-10-28 13:40:52 -0400180 SpvStorageClassWorkgroupLocal,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100181 0,
182 {SPV_OPERAND_TYPE_NONE}},
183 {"WorkgroupGlobal",
Lei Zhangb36e7042015-10-28 13:40:52 -0400184 SpvStorageClassWorkgroupGlobal,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100185 0,
186 {SPV_OPERAND_TYPE_NONE}},
187 {"PrivateGlobal",
Lei Zhangb36e7042015-10-28 13:40:52 -0400188 SpvStorageClassPrivateGlobal,
189 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100190 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang1a0334e2015-11-02 09:41:20 -0500191 {"Function", SpvStorageClassFunction, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100192 {"Generic",
Lei Zhangb36e7042015-10-28 13:40:52 -0400193 SpvStorageClassGeneric,
194 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100195 {SPV_OPERAND_TYPE_NONE}},
David Neto9819adf2015-09-23 10:19:57 -0400196 {"PushConstant",
Lei Zhangb36e7042015-10-28 13:40:52 -0400197 SpvStorageClassPushConstant,
198 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
David Neto9819adf2015-09-23 10:19:57 -0400199 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100200 {"AtomicCounter",
Lei Zhangb36e7042015-10-28 13:40:52 -0400201 SpvStorageClassAtomicCounter,
202 SPV_CAPABILITY_AS_MASK(SpvCapabilityAtomicStorage),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100203 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang1a0334e2015-11-02 09:41:20 -0500204 {"Image", SpvStorageClassImage, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100205};
206
207static const spv_operand_desc_t dimensionalityEntries[] = {
David Netoddda85a2015-10-02 17:10:10 -0400208 {"1D",
Lei Zhangb36e7042015-10-28 13:40:52 -0400209 SpvDim1D,
210 SPV_CAPABILITY_AS_MASK(SpvCapabilitySampled1D),
David Netoddda85a2015-10-02 17:10:10 -0400211 {SPV_OPERAND_TYPE_NONE}},
Lei Zhangb36e7042015-10-28 13:40:52 -0400212 {"2D", SpvDim2D, 0, {SPV_OPERAND_TYPE_NONE}},
213 {"3D", SpvDim3D, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100214 {"Cube",
Lei Zhangb36e7042015-10-28 13:40:52 -0400215 SpvDimCube,
216 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100217 {SPV_OPERAND_TYPE_NONE}},
218 {"Rect",
Lei Zhangb36e7042015-10-28 13:40:52 -0400219 SpvDimRect,
220 SPV_CAPABILITY_AS_MASK(SpvCapabilitySampledRect),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100221 {SPV_OPERAND_TYPE_NONE}},
David Netoddda85a2015-10-02 17:10:10 -0400222 {"Buffer",
Lei Zhangb36e7042015-10-28 13:40:52 -0400223 SpvDimBuffer,
224 SPV_CAPABILITY_AS_MASK(SpvCapabilitySampledBuffer),
David Netoddda85a2015-10-02 17:10:10 -0400225 {SPV_OPERAND_TYPE_NONE}},
David Netoaa0c3a52015-09-23 10:30:06 -0400226 {"InputTarget",
Lei Zhangb36e7042015-10-28 13:40:52 -0400227 SpvDimInputTarget,
228 SPV_CAPABILITY_AS_MASK(SpvCapabilityInputTarget),
David Netoaa0c3a52015-09-23 10:30:06 -0400229 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100230};
231
232static const spv_operand_desc_t samplerAddressingModeEntries[] = {
233 {"None",
Lei Zhangb36e7042015-10-28 13:40:52 -0400234 SpvSamplerAddressingModeNone,
235 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100236 {SPV_OPERAND_TYPE_NONE}},
237 {"ClampToEdge",
Lei Zhangb36e7042015-10-28 13:40:52 -0400238 SpvSamplerAddressingModeClampToEdge,
239 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100240 {SPV_OPERAND_TYPE_NONE}},
241 {"Clamp",
Lei Zhangb36e7042015-10-28 13:40:52 -0400242 SpvSamplerAddressingModeClamp,
243 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100244 {SPV_OPERAND_TYPE_NONE}},
245 {"Repeat",
Lei Zhangb36e7042015-10-28 13:40:52 -0400246 SpvSamplerAddressingModeRepeat,
247 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100248 {SPV_OPERAND_TYPE_NONE}},
249 {"RepeatMirrored",
Lei Zhangb36e7042015-10-28 13:40:52 -0400250 SpvSamplerAddressingModeRepeatMirrored,
251 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100252 {SPV_OPERAND_TYPE_NONE}},
253};
254
255static const spv_operand_desc_t samplerFilterModeEntries[] = {
256 {"Nearest",
Lei Zhangb36e7042015-10-28 13:40:52 -0400257 SpvSamplerFilterModeNearest,
258 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100259 {SPV_OPERAND_TYPE_NONE}},
260 {"Linear",
Lei Zhangb36e7042015-10-28 13:40:52 -0400261 SpvSamplerFilterModeLinear,
262 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100263 {SPV_OPERAND_TYPE_NONE}},
264};
265
David Netob30a0c52015-09-16 15:56:43 -0400266static const spv_operand_desc_t samplerImageFormatEntries[] = {
Lei Zhangb36e7042015-10-28 13:40:52 -0400267#define CASE0(NAME) \
268 { \
269 #NAME, SpvImageFormat##NAME, 0, { SPV_OPERAND_TYPE_NONE } \
David Netoddda85a2015-10-02 17:10:10 -0400270 }
Lei Zhangb36e7042015-10-28 13:40:52 -0400271#define CASE(NAME, CAP) \
272 { \
273 #NAME, SpvImageFormat##NAME, SPV_CAPABILITY_AS_MASK(SpvCapability##CAP), { \
274 SPV_OPERAND_TYPE_NONE \
275 } \
David Netob30a0c52015-09-16 15:56:43 -0400276 }
Dejan Mircevski50babb22015-09-29 10:56:32 -0400277 // clang-format off
David Netoddda85a2015-10-02 17:10:10 -0400278 CASE0(Unknown),
279 CASE(Rgba32f, Shader),
280 CASE(Rgba16f, Shader),
281 CASE(R32f, Shader),
282 CASE(Rgba8, Shader),
283 CASE(Rgba8Snorm, Shader),
284 CASE(Rg32f, AdvancedFormats),
285 CASE(Rg16f, AdvancedFormats),
286 CASE(R11fG11fB10f, AdvancedFormats),
287 CASE(R16f, AdvancedFormats),
288 CASE(Rgba16, AdvancedFormats),
289 CASE(Rgb10A2, AdvancedFormats),
290 CASE(Rg16, AdvancedFormats),
291 CASE(Rg8, AdvancedFormats),
292 CASE(R16, AdvancedFormats),
293 CASE(R8, AdvancedFormats),
294 CASE(Rgba16Snorm, AdvancedFormats),
295 CASE(Rg16Snorm, AdvancedFormats),
296 CASE(Rg8Snorm, AdvancedFormats),
297 CASE(R16Snorm, AdvancedFormats),
298 CASE(R8Snorm, AdvancedFormats),
299 CASE(Rgba32i, Shader),
300 CASE(Rgba16i, Shader),
301 CASE(Rgba8i, Shader),
302 CASE(R32i, Shader),
303 CASE(Rg32i, AdvancedFormats),
304 CASE(Rg16i, AdvancedFormats),
305 CASE(Rg8i, AdvancedFormats),
306 CASE(R16i, AdvancedFormats),
307 CASE(R8i, AdvancedFormats),
308 CASE(Rgba32ui, Shader),
309 CASE(Rgba16ui, Shader),
310 CASE(Rgba8ui, Shader),
311 CASE(R32ui, Shader),
312 CASE(Rgb10a2ui, AdvancedFormats),
313 CASE(Rg32ui, AdvancedFormats),
314 CASE(Rg16ui, AdvancedFormats),
315 CASE(Rg8ui, AdvancedFormats),
316 CASE(R16ui, AdvancedFormats),
317 CASE(R8ui, AdvancedFormats),
Dejan Mircevski50babb22015-09-29 10:56:32 -0400318// clang-format on
David Netob30a0c52015-09-16 15:56:43 -0400319#undef CASE
320};
321
David Netoddda85a2015-10-02 17:10:10 -0400322// All image channel orders depend on the Kernel capability.
Lei Zhang1a0334e2015-11-02 09:41:20 -0500323#define CASE(NAME) \
324 { \
325 #NAME, SpvImageChannelOrder##NAME, \
326 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel), { \
327 SPV_OPERAND_TYPE_NONE \
328 } \
David Netoddda85a2015-10-02 17:10:10 -0400329 }
330static const spv_operand_desc_t imageChannelOrderEntries[] = {
Lei Zhang1a0334e2015-11-02 09:41:20 -0500331 CASE(R), CASE(A), CASE(RG), CASE(RA), CASE(RGB),
332 CASE(RGBA), CASE(BGRA), CASE(ARGB), CASE(Intensity), CASE(Luminance),
333 CASE(Rx), CASE(RGx), CASE(RGBx), CASE(Depth), CASE(DepthStencil),
334 CASE(sRGB), CASE(sRGBx), CASE(sRGBA), CASE(sBGRA),
David Netoddda85a2015-10-02 17:10:10 -0400335};
336#undef CASE
337
338// All image channel data types depend on the Kernel capability.
Lei Zhangb36e7042015-10-28 13:40:52 -0400339#define CASE(NAME) \
340 { \
341 #NAME, SpvImageChannelDataType##NAME, \
342 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel), { \
343 SPV_OPERAND_TYPE_NONE \
344 } \
David Netoddda85a2015-10-02 17:10:10 -0400345 }
346static const spv_operand_desc_t imageChannelDataTypeEntries[] = {
Lei Zhang1a0334e2015-11-02 09:41:20 -0500347 CASE(SnormInt8), CASE(SnormInt16), CASE(UnormInt8),
348 CASE(UnormInt16), CASE(UnormShort565), CASE(UnormShort555),
349 CASE(UnormInt101010), CASE(SignedInt8), CASE(SignedInt16),
350 CASE(SignedInt32), CASE(UnsignedInt8), CASE(UnsignedInt16),
351 CASE(UnsignedInt32), CASE(HalfFloat), CASE(Float),
352 CASE(UnormInt24),
David Netoddda85a2015-10-02 17:10:10 -0400353};
354#undef CASE
355
David Netoee1b3bb2015-09-18 11:19:18 -0400356// Image operand definitions. Each enum value is a mask. When that mask
357// bit is set, the instruction should have further ID operands.
358// Some mask values depend on a capability.
359static const spv_operand_desc_t imageOperandEntries[] = {
360// Rev32 and later adds many more enums.
Lei Zhang1a0334e2015-11-02 09:41:20 -0500361#define CASE(NAME) #NAME, SpvImageOperands##NAME##Mask, 0
362#define CASE_CAP(NAME, CAP) #NAME, SpvImageOperands##NAME##Mask, CAP
David Netoee1b3bb2015-09-18 11:19:18 -0400363#define ID SPV_OPERAND_TYPE_ID
364#define NONE SPV_OPERAND_TYPE_NONE
Lei Zhangb36e7042015-10-28 13:40:52 -0400365 {"None", SpvImageOperandsMaskNone, 0, {NONE}},
366 {CASE_CAP(Bias, SPV_CAPABILITY_AS_MASK(SpvCapabilityShader)), {ID, NONE}},
David Netoee1b3bb2015-09-18 11:19:18 -0400367 {CASE(Lod), {ID, NONE}},
368 {CASE(Grad), {ID, ID, NONE}},
369 {CASE(ConstOffset), {ID, NONE}},
Lei Zhangb36e7042015-10-28 13:40:52 -0400370 {CASE_CAP(Offset, SPV_CAPABILITY_AS_MASK(SpvCapabilityImageGatherExtended)),
Dejan Mircevski205408b2015-09-30 16:42:34 -0400371 {ID, NONE}},
David Netoee1b3bb2015-09-18 11:19:18 -0400372 {CASE(ConstOffsets), {ID, NONE}},
373 {CASE(Sample), {ID, NONE}},
Lei Zhangb36e7042015-10-28 13:40:52 -0400374 {CASE_CAP(MinLod, SPV_CAPABILITY_AS_MASK(SpvCapabilityMinLod)), {ID, NONE}},
David Netoee1b3bb2015-09-18 11:19:18 -0400375#undef CASE
376#undef CASE_CAP
377#undef ID
378#undef NONE
379};
380
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100381static const spv_operand_desc_t fpFastMathModeEntries[] = {
Lei Zhang1a0334e2015-11-02 09:41:20 -0500382 {"None", SpvFPFastMathModeMaskNone, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100383 {"NotNaN",
Lei Zhangb36e7042015-10-28 13:40:52 -0400384 SpvFPFastMathModeNotNaNMask,
385 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100386 {SPV_OPERAND_TYPE_NONE}},
387 {"NotInf",
Lei Zhangb36e7042015-10-28 13:40:52 -0400388 SpvFPFastMathModeNotInfMask,
389 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100390 {SPV_OPERAND_TYPE_NONE}},
391 {"NSZ",
Lei Zhangb36e7042015-10-28 13:40:52 -0400392 SpvFPFastMathModeNSZMask,
393 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100394 {SPV_OPERAND_TYPE_NONE}},
395 {"AllowRecip",
Lei Zhangb36e7042015-10-28 13:40:52 -0400396 SpvFPFastMathModeAllowRecipMask,
397 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100398 {SPV_OPERAND_TYPE_NONE}},
399 {"Fast",
Lei Zhangb36e7042015-10-28 13:40:52 -0400400 SpvFPFastMathModeFastMask,
401 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100402 {SPV_OPERAND_TYPE_NONE}},
403};
404
405static const spv_operand_desc_t fpRoundingModeEntries[] = {
406 {"RTE",
Lei Zhangb36e7042015-10-28 13:40:52 -0400407 SpvFPRoundingModeRTE,
408 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100409 {SPV_OPERAND_TYPE_NONE}},
410 {"RTZ",
Lei Zhangb36e7042015-10-28 13:40:52 -0400411 SpvFPRoundingModeRTZ,
412 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100413 {SPV_OPERAND_TYPE_NONE}},
414 {"RTP",
Lei Zhangb36e7042015-10-28 13:40:52 -0400415 SpvFPRoundingModeRTP,
416 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100417 {SPV_OPERAND_TYPE_NONE}},
418 {"RTN",
Lei Zhangb36e7042015-10-28 13:40:52 -0400419 SpvFPRoundingModeRTN,
420 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100421 {SPV_OPERAND_TYPE_NONE}},
422};
423
424static const spv_operand_desc_t linkageTypeEntries[] = {
425 {"Export",
Lei Zhangb36e7042015-10-28 13:40:52 -0400426 SpvLinkageTypeExport,
427 SPV_CAPABILITY_AS_MASK(SpvCapabilityLinkage),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100428 {SPV_OPERAND_TYPE_NONE}},
429 {"Import",
Lei Zhangb36e7042015-10-28 13:40:52 -0400430 SpvLinkageTypeImport,
431 SPV_CAPABILITY_AS_MASK(SpvCapabilityLinkage),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100432 {SPV_OPERAND_TYPE_NONE}},
433};
434
435static const spv_operand_desc_t accessQualifierEntries[] = {
436 {"ReadOnly",
Lei Zhangb36e7042015-10-28 13:40:52 -0400437 SpvAccessQualifierReadOnly,
438 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100439 {SPV_OPERAND_TYPE_NONE}},
440 {"WriteOnly",
Lei Zhangb36e7042015-10-28 13:40:52 -0400441 SpvAccessQualifierWriteOnly,
442 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100443 {SPV_OPERAND_TYPE_NONE}},
444 {"ReadWrite",
Lei Zhangb36e7042015-10-28 13:40:52 -0400445 SpvAccessQualifierReadWrite,
446 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100447 {SPV_OPERAND_TYPE_NONE}},
448};
449
450static const spv_operand_desc_t functionParameterAttributeEntries[] = {
451 {"Zext",
Lei Zhangb36e7042015-10-28 13:40:52 -0400452 SpvFunctionParameterAttributeZext,
453 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100454 {SPV_OPERAND_TYPE_NONE}},
455 {"Sext",
Lei Zhangb36e7042015-10-28 13:40:52 -0400456 SpvFunctionParameterAttributeSext,
457 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100458 {SPV_OPERAND_TYPE_NONE}},
459 {"ByVal",
Lei Zhangb36e7042015-10-28 13:40:52 -0400460 SpvFunctionParameterAttributeByVal,
461 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100462 {SPV_OPERAND_TYPE_NONE}},
463 {"Sret",
Lei Zhangb36e7042015-10-28 13:40:52 -0400464 SpvFunctionParameterAttributeSret,
465 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100466 {SPV_OPERAND_TYPE_NONE}},
467 {"NoAlias",
Lei Zhangb36e7042015-10-28 13:40:52 -0400468 SpvFunctionParameterAttributeNoAlias,
469 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100470 {SPV_OPERAND_TYPE_NONE}},
David Neto37547b22015-09-10 13:23:11 -0400471 {"NoCapture",
Lei Zhangb36e7042015-10-28 13:40:52 -0400472 SpvFunctionParameterAttributeNoCapture,
473 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100474 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100475 {"NoWrite",
Lei Zhangb36e7042015-10-28 13:40:52 -0400476 SpvFunctionParameterAttributeNoWrite,
477 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100478 {SPV_OPERAND_TYPE_NONE}},
479 {"NoReadWrite",
Lei Zhangb36e7042015-10-28 13:40:52 -0400480 SpvFunctionParameterAttributeNoReadWrite,
481 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100482 {SPV_OPERAND_TYPE_NONE}},
483};
484
485static const spv_operand_desc_t decorationEntries[] = {
Lei Zhang604e5ce2015-08-14 14:46:43 -0400486 {"RelaxedPrecision",
Lei Zhangb36e7042015-10-28 13:40:52 -0400487 SpvDecorationRelaxedPrecision,
488 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100489 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400490 {
Dejan Mircevski50babb22015-09-29 10:56:32 -0400491 "SpecId",
Lei Zhangb36e7042015-10-28 13:40:52 -0400492 SpvDecorationSpecId,
493 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Lei Zhang6483bd72015-10-14 17:02:39 -0400494 {SPV_OPERAND_TYPE_LITERAL_INTEGER},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400495 },
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100496 {"Block",
Lei Zhangb36e7042015-10-28 13:40:52 -0400497 SpvDecorationBlock,
498 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100499 {SPV_OPERAND_TYPE_NONE}},
500 {"BufferBlock",
Lei Zhangb36e7042015-10-28 13:40:52 -0400501 SpvDecorationBufferBlock,
502 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100503 {SPV_OPERAND_TYPE_NONE}},
504 {"RowMajor",
Lei Zhangb36e7042015-10-28 13:40:52 -0400505 SpvDecorationRowMajor,
506 SPV_CAPABILITY_AS_MASK(SpvCapabilityMatrix),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100507 {SPV_OPERAND_TYPE_NONE}},
508 {"ColMajor",
Lei Zhangb36e7042015-10-28 13:40:52 -0400509 SpvDecorationColMajor,
510 SPV_CAPABILITY_AS_MASK(SpvCapabilityMatrix),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100511 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400512 {"ArrayStride",
Lei Zhangb36e7042015-10-28 13:40:52 -0400513 SpvDecorationArrayStride,
514 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Lei Zhang6483bd72015-10-14 17:02:39 -0400515 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400516 {"MatrixStride",
Lei Zhangb36e7042015-10-28 13:40:52 -0400517 SpvDecorationMatrixStride,
518 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Lei Zhang6483bd72015-10-14 17:02:39 -0400519 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100520 {"GLSLShared",
Lei Zhangb36e7042015-10-28 13:40:52 -0400521 SpvDecorationGLSLShared,
522 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100523 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100524 {"GLSLPacked",
Lei Zhangb36e7042015-10-28 13:40:52 -0400525 SpvDecorationGLSLPacked,
526 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100527 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400528 {"CPacked",
Lei Zhangb36e7042015-10-28 13:40:52 -0400529 SpvDecorationCPacked,
530 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Lei Zhang604e5ce2015-08-14 14:46:43 -0400531 {SPV_OPERAND_TYPE_NONE}},
532 {"BuiltIn",
Lei Zhangb36e7042015-10-28 13:40:52 -0400533 SpvDecorationBuiltIn,
534 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Lei Zhang604e5ce2015-08-14 14:46:43 -0400535 {SPV_OPERAND_TYPE_BUILT_IN, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100536 {"Smooth",
Lei Zhangb36e7042015-10-28 13:40:52 -0400537 SpvDecorationSmooth,
538 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100539 {SPV_OPERAND_TYPE_NONE}},
David Netodbaf4072015-09-22 16:23:06 -0400540 {"NoPerspective",
Lei Zhangb36e7042015-10-28 13:40:52 -0400541 SpvDecorationNoPerspective,
542 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100543 {SPV_OPERAND_TYPE_NONE}},
544 {"Flat",
Lei Zhangb36e7042015-10-28 13:40:52 -0400545 SpvDecorationFlat,
546 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100547 {SPV_OPERAND_TYPE_NONE}},
548 {"Patch",
Lei Zhangb36e7042015-10-28 13:40:52 -0400549 SpvDecorationPatch,
550 SPV_CAPABILITY_AS_MASK(SpvCapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100551 {SPV_OPERAND_TYPE_NONE}},
552 {"Centroid",
Lei Zhangb36e7042015-10-28 13:40:52 -0400553 SpvDecorationCentroid,
554 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100555 {SPV_OPERAND_TYPE_NONE}},
556 {"Sample",
Lei Zhangb36e7042015-10-28 13:40:52 -0400557 SpvDecorationSample,
558 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100559 {SPV_OPERAND_TYPE_NONE}},
560 {"Invariant",
Lei Zhangb36e7042015-10-28 13:40:52 -0400561 SpvDecorationInvariant,
562 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100563 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang1a0334e2015-11-02 09:41:20 -0500564 {"Restrict", SpvDecorationRestrict, 0, {SPV_OPERAND_TYPE_NONE}},
565 {"Aliased", SpvDecorationAliased, 0, {SPV_OPERAND_TYPE_NONE}},
566 {"Volatile", SpvDecorationVolatile, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100567 {"Constant",
Lei Zhangb36e7042015-10-28 13:40:52 -0400568 SpvDecorationConstant,
569 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100570 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang1a0334e2015-11-02 09:41:20 -0500571 {"Coherent", SpvDecorationCoherent, 0, {SPV_OPERAND_TYPE_NONE}},
572 {"NonWritable", SpvDecorationNonWritable, 0, {SPV_OPERAND_TYPE_NONE}},
573 {"NonReadable", SpvDecorationNonReadable, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100574 {"Uniform",
Lei Zhangb36e7042015-10-28 13:40:52 -0400575 SpvDecorationUniform,
576 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100577 {SPV_OPERAND_TYPE_NONE}},
David Neto37547b22015-09-10 13:23:11 -0400578 {"SaturatedConversion",
Lei Zhangb36e7042015-10-28 13:40:52 -0400579 SpvDecorationSaturatedConversion,
580 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100581 {SPV_OPERAND_TYPE_NONE}},
582 {"Stream",
Lei Zhangb36e7042015-10-28 13:40:52 -0400583 SpvDecorationStream,
584 SPV_CAPABILITY_AS_MASK(SpvCapabilityGeometry),
Lei Zhang6483bd72015-10-14 17:02:39 -0400585 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100586 {"Location",
Lei Zhangb36e7042015-10-28 13:40:52 -0400587 SpvDecorationLocation,
588 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Lei Zhang6483bd72015-10-14 17:02:39 -0400589 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100590 {"Component",
Lei Zhangb36e7042015-10-28 13:40:52 -0400591 SpvDecorationComponent,
592 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Lei Zhang6483bd72015-10-14 17:02:39 -0400593 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100594 {"Index",
Lei Zhangb36e7042015-10-28 13:40:52 -0400595 SpvDecorationIndex,
596 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Lei Zhang6483bd72015-10-14 17:02:39 -0400597 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100598 {"Binding",
Lei Zhangb36e7042015-10-28 13:40:52 -0400599 SpvDecorationBinding,
600 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Lei Zhang6483bd72015-10-14 17:02:39 -0400601 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100602 {"DescriptorSet",
Lei Zhangb36e7042015-10-28 13:40:52 -0400603 SpvDecorationDescriptorSet,
604 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Lei Zhang6483bd72015-10-14 17:02:39 -0400605 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100606 {"Offset",
Lei Zhangb36e7042015-10-28 13:40:52 -0400607 SpvDecorationOffset,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100608 0,
Lei Zhang6483bd72015-10-14 17:02:39 -0400609 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100610 {"XfbBuffer",
Lei Zhangb36e7042015-10-28 13:40:52 -0400611 SpvDecorationXfbBuffer,
612 SPV_CAPABILITY_AS_MASK(SpvCapabilityTransformFeedback),
Lei Zhang6483bd72015-10-14 17:02:39 -0400613 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Lei Zhang604e5ce2015-08-14 14:46:43 -0400614 {"XfbStride",
Lei Zhangb36e7042015-10-28 13:40:52 -0400615 SpvDecorationXfbStride,
616 SPV_CAPABILITY_AS_MASK(SpvCapabilityTransformFeedback),
Lei Zhang6483bd72015-10-14 17:02:39 -0400617 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100618 {"FuncParamAttr",
Lei Zhangb36e7042015-10-28 13:40:52 -0400619 SpvDecorationFuncParamAttr,
620 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100621 {SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE, SPV_OPERAND_TYPE_NONE}},
622 {"FPRoundingMode",
Lei Zhangb36e7042015-10-28 13:40:52 -0400623 SpvDecorationFPRoundingMode,
624 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100625 {SPV_OPERAND_TYPE_FP_ROUNDING_MODE, SPV_OPERAND_TYPE_NONE}},
626 {"FPFastMathMode",
Lei Zhangb36e7042015-10-28 13:40:52 -0400627 SpvDecorationFPFastMathMode,
628 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100629 {SPV_OPERAND_TYPE_FP_FAST_MATH_MODE, SPV_OPERAND_TYPE_NONE}},
630 {"LinkageAttributes",
Lei Zhangb36e7042015-10-28 13:40:52 -0400631 SpvDecorationLinkageAttributes,
632 SPV_CAPABILITY_AS_MASK(SpvCapabilityLinkage),
Dejan Mircevski50babb22015-09-29 10:56:32 -0400633 {SPV_OPERAND_TYPE_LITERAL_STRING, SPV_OPERAND_TYPE_LINKAGE_TYPE,
634 SPV_OPERAND_TYPE_NONE}},
David Netod7687982015-09-23 14:59:27 -0400635 {"NoContraction",
Lei Zhangb36e7042015-10-28 13:40:52 -0400636 SpvDecorationNoContraction,
637 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
David Netod7687982015-09-23 14:59:27 -0400638 {SPV_OPERAND_TYPE_NONE}},
639 {"InputTargetIndex",
Lei Zhangb36e7042015-10-28 13:40:52 -0400640 SpvDecorationInputTargetIndex,
Lei Zhang1a0334e2015-11-02 09:41:20 -0500641 SPV_CAPABILITY_AS_MASK(
642 SpvCapabilityShader), // TODO(dneto): Should this be
643 // SpvCapabilityInputTarget?
Dejan Mircevski50babb22015-09-29 10:56:32 -0400644 {SPV_OPERAND_TYPE_NONE}}, // TODO(dneto): Should this have a literal
645 // number argument?
David Netod7687982015-09-23 14:59:27 -0400646 {"Alignment",
Lei Zhangb36e7042015-10-28 13:40:52 -0400647 SpvDecorationAlignment,
648 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Lei Zhang6483bd72015-10-14 17:02:39 -0400649 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100650};
651
652static const spv_operand_desc_t builtInEntries[] = {
653 {"Position",
Lei Zhangb36e7042015-10-28 13:40:52 -0400654 SpvBuiltInPosition,
655 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100656 {SPV_OPERAND_TYPE_NONE}},
657 {"PointSize",
Lei Zhangb36e7042015-10-28 13:40:52 -0400658 SpvBuiltInPointSize,
659 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100660 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100661 {"ClipDistance",
Lei Zhangb36e7042015-10-28 13:40:52 -0400662 SpvBuiltInClipDistance,
663 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100664 {SPV_OPERAND_TYPE_NONE}},
665 {"CullDistance",
Lei Zhangb36e7042015-10-28 13:40:52 -0400666 SpvBuiltInCullDistance,
667 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100668 {SPV_OPERAND_TYPE_NONE}},
669 {"VertexId",
Lei Zhangb36e7042015-10-28 13:40:52 -0400670 SpvBuiltInVertexId,
671 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100672 {SPV_OPERAND_TYPE_NONE}},
673 {"InstanceId",
Lei Zhangb36e7042015-10-28 13:40:52 -0400674 SpvBuiltInInstanceId,
675 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100676 {SPV_OPERAND_TYPE_NONE}},
677 {"PrimitiveId",
Lei Zhangb36e7042015-10-28 13:40:52 -0400678 SpvBuiltInPrimitiveId,
679 SPV_CAPABILITY_AS_MASK(SpvCapabilityGeometry) |
680 SPV_CAPABILITY_AS_MASK(SpvCapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100681 {SPV_OPERAND_TYPE_NONE}},
682 {"InvocationId",
Lei Zhangb36e7042015-10-28 13:40:52 -0400683 SpvBuiltInInvocationId,
684 SPV_CAPABILITY_AS_MASK(SpvCapabilityGeometry) |
685 SPV_CAPABILITY_AS_MASK(SpvCapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100686 {SPV_OPERAND_TYPE_NONE}},
687 {"Layer",
Lei Zhangb36e7042015-10-28 13:40:52 -0400688 SpvBuiltInLayer,
689 SPV_CAPABILITY_AS_MASK(SpvCapabilityGeometry),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100690 {SPV_OPERAND_TYPE_NONE}},
691 {"ViewportIndex",
Lei Zhangb36e7042015-10-28 13:40:52 -0400692 SpvBuiltInViewportIndex,
693 SPV_CAPABILITY_AS_MASK(SpvCapabilityGeometry),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100694 {SPV_OPERAND_TYPE_NONE}},
695 {"TessLevelOuter",
Lei Zhangb36e7042015-10-28 13:40:52 -0400696 SpvBuiltInTessLevelOuter,
697 SPV_CAPABILITY_AS_MASK(SpvCapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100698 {SPV_OPERAND_TYPE_NONE}},
699 {"TessLevelInner",
Lei Zhangb36e7042015-10-28 13:40:52 -0400700 SpvBuiltInTessLevelInner,
701 SPV_CAPABILITY_AS_MASK(SpvCapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100702 {SPV_OPERAND_TYPE_NONE}},
703 {"TessCoord",
Lei Zhangb36e7042015-10-28 13:40:52 -0400704 SpvBuiltInTessCoord,
705 SPV_CAPABILITY_AS_MASK(SpvCapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100706 {SPV_OPERAND_TYPE_NONE}},
707 {"PatchVertices",
Lei Zhangb36e7042015-10-28 13:40:52 -0400708 SpvBuiltInPatchVertices,
709 SPV_CAPABILITY_AS_MASK(SpvCapabilityTessellation),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100710 {SPV_OPERAND_TYPE_NONE}},
711 {"FragCoord",
Lei Zhangb36e7042015-10-28 13:40:52 -0400712 SpvBuiltInFragCoord,
713 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100714 {SPV_OPERAND_TYPE_NONE}},
715 {"PointCoord",
Lei Zhangb36e7042015-10-28 13:40:52 -0400716 SpvBuiltInPointCoord,
717 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100718 {SPV_OPERAND_TYPE_NONE}},
719 {"FrontFacing",
Lei Zhangb36e7042015-10-28 13:40:52 -0400720 SpvBuiltInFrontFacing,
721 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100722 {SPV_OPERAND_TYPE_NONE}},
723 {"SampleId",
Lei Zhangb36e7042015-10-28 13:40:52 -0400724 SpvBuiltInSampleId,
725 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100726 {SPV_OPERAND_TYPE_NONE}},
727 {"SamplePosition",
Lei Zhangb36e7042015-10-28 13:40:52 -0400728 SpvBuiltInSamplePosition,
729 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100730 {SPV_OPERAND_TYPE_NONE}},
731 {"SampleMask",
Lei Zhangb36e7042015-10-28 13:40:52 -0400732 SpvBuiltInSampleMask,
733 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100734 {SPV_OPERAND_TYPE_NONE}},
735 {"FragColor",
Lei Zhangb36e7042015-10-28 13:40:52 -0400736 SpvBuiltInFragColor,
737 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100738 {SPV_OPERAND_TYPE_NONE}},
739 {"FragDepth",
Lei Zhangb36e7042015-10-28 13:40:52 -0400740 SpvBuiltInFragDepth,
741 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100742 {SPV_OPERAND_TYPE_NONE}},
743 {"HelperInvocation",
Lei Zhangb36e7042015-10-28 13:40:52 -0400744 SpvBuiltInHelperInvocation,
745 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100746 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang1a0334e2015-11-02 09:41:20 -0500747 {"NumWorkgroups", SpvBuiltInNumWorkgroups, 0, {SPV_OPERAND_TYPE_NONE}},
748 {"WorkgroupSize", SpvBuiltInWorkgroupSize, 0, {SPV_OPERAND_TYPE_NONE}},
749 {"WorkgroupId", SpvBuiltInWorkgroupId, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100750 {"LocalInvocationId",
Lei Zhangb36e7042015-10-28 13:40:52 -0400751 SpvBuiltInLocalInvocationId,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100752 0,
753 {SPV_OPERAND_TYPE_NONE}},
754 {"GlobalInvocationId",
Lei Zhangb36e7042015-10-28 13:40:52 -0400755 SpvBuiltInGlobalInvocationId,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100756 0,
757 {SPV_OPERAND_TYPE_NONE}},
758 {"LocalInvocationIndex",
Lei Zhangb36e7042015-10-28 13:40:52 -0400759 SpvBuiltInLocalInvocationIndex,
760 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100761 {SPV_OPERAND_TYPE_NONE}},
762 {"WorkDim",
Lei Zhangb36e7042015-10-28 13:40:52 -0400763 SpvBuiltInWorkDim,
764 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100765 {SPV_OPERAND_TYPE_NONE}},
766 {"GlobalSize",
Lei Zhangb36e7042015-10-28 13:40:52 -0400767 SpvBuiltInGlobalSize,
768 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100769 {SPV_OPERAND_TYPE_NONE}},
770 {"EnqueuedWorkgroupSize",
Lei Zhangb36e7042015-10-28 13:40:52 -0400771 SpvBuiltInEnqueuedWorkgroupSize,
772 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100773 {SPV_OPERAND_TYPE_NONE}},
774 {"GlobalOffset",
Lei Zhangb36e7042015-10-28 13:40:52 -0400775 SpvBuiltInGlobalOffset,
776 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100777 {SPV_OPERAND_TYPE_NONE}},
778 {"GlobalLinearId",
Lei Zhangb36e7042015-10-28 13:40:52 -0400779 SpvBuiltInGlobalLinearId,
780 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100781 {SPV_OPERAND_TYPE_NONE}},
782 {"WorkgroupLinearId",
Lei Zhangb36e7042015-10-28 13:40:52 -0400783 SpvBuiltInWorkgroupLinearId,
784 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100785 {SPV_OPERAND_TYPE_NONE}},
786 {"SubgroupSize",
Lei Zhangb36e7042015-10-28 13:40:52 -0400787 SpvBuiltInSubgroupSize,
788 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100789 {SPV_OPERAND_TYPE_NONE}},
790 {"SubgroupMaxSize",
Lei Zhangb36e7042015-10-28 13:40:52 -0400791 SpvBuiltInSubgroupMaxSize,
792 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100793 {SPV_OPERAND_TYPE_NONE}},
794 {"NumSubgroups",
Lei Zhangb36e7042015-10-28 13:40:52 -0400795 SpvBuiltInNumSubgroups,
796 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100797 {SPV_OPERAND_TYPE_NONE}},
798 {"NumEnqueuedSubgroups",
Lei Zhangb36e7042015-10-28 13:40:52 -0400799 SpvBuiltInNumEnqueuedSubgroups,
800 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100801 {SPV_OPERAND_TYPE_NONE}},
802 {"SubgroupId",
Lei Zhangb36e7042015-10-28 13:40:52 -0400803 SpvBuiltInSubgroupId,
804 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100805 {SPV_OPERAND_TYPE_NONE}},
806 {"SubgroupLocalInvocationId",
Lei Zhangb36e7042015-10-28 13:40:52 -0400807 SpvBuiltInSubgroupLocalInvocationId,
808 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100809 {SPV_OPERAND_TYPE_NONE}},
David Neto2d1b5e52015-09-23 15:35:27 -0400810 {"VertexIndex",
Lei Zhangb36e7042015-10-28 13:40:52 -0400811 SpvBuiltInVertexIndex,
812 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
David Neto2d1b5e52015-09-23 15:35:27 -0400813 {SPV_OPERAND_TYPE_NONE}},
814 {"InstanceIndex",
Lei Zhangb36e7042015-10-28 13:40:52 -0400815 SpvBuiltInInstanceIndex,
816 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
David Neto2d1b5e52015-09-23 15:35:27 -0400817 {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100818};
819
820static const spv_operand_desc_t selectionControlEntries[] = {
Lei Zhang1a0334e2015-11-02 09:41:20 -0500821 {"None", SpvSelectionControlMaskNone, 0, {SPV_OPERAND_TYPE_NONE}},
822 {"Flatten", SpvSelectionControlFlattenMask, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100823 {"DontFlatten",
Lei Zhangb36e7042015-10-28 13:40:52 -0400824 SpvSelectionControlDontFlattenMask,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100825 0,
826 {SPV_OPERAND_TYPE_NONE}},
827};
828
829static const spv_operand_desc_t loopControlEntries[] = {
Lei Zhang1a0334e2015-11-02 09:41:20 -0500830 {"None", SpvLoopControlMaskNone, 0, {SPV_OPERAND_TYPE_NONE}},
831 {"Unroll", SpvLoopControlUnrollMask, 0, {SPV_OPERAND_TYPE_NONE}},
832 {"DontUnroll", SpvLoopControlDontUnrollMask, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100833};
834
835static const spv_operand_desc_t functionControlEntries[] = {
Lei Zhang1a0334e2015-11-02 09:41:20 -0500836 {"None", SpvFunctionControlMaskNone, 0, {SPV_OPERAND_TYPE_NONE}},
837 {"Inline", SpvFunctionControlInlineMask, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100838 {"DontInline",
Lei Zhangb36e7042015-10-28 13:40:52 -0400839 SpvFunctionControlDontInlineMask,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100840 0,
841 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang1a0334e2015-11-02 09:41:20 -0500842 {"Pure", SpvFunctionControlPureMask, 0, {SPV_OPERAND_TYPE_NONE}},
843 {"Const", SpvFunctionControlConstMask, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100844};
845
846static const spv_operand_desc_t memorySemanticsEntries[] = {
David Netobfa3d862015-09-25 10:30:27 -0400847 // "Relaxed" should be a synonym for "None".
848 // Put the Relaxed entry first so that the disassembler
849 // will prefer to emit "Relaxed".
Lei Zhang1a0334e2015-11-02 09:41:20 -0500850 {"Relaxed", SpvMemorySemanticsMaskNone, 0, {SPV_OPERAND_TYPE_NONE}},
851 {"None", SpvMemorySemanticsMaskNone, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100852 {"SequentiallyConsistent",
Lei Zhangb36e7042015-10-28 13:40:52 -0400853 SpvMemorySemanticsSequentiallyConsistentMask,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100854 0,
855 {SPV_OPERAND_TYPE_NONE}},
Lei Zhang1a0334e2015-11-02 09:41:20 -0500856 {"Acquire", SpvMemorySemanticsAcquireMask, 0, {SPV_OPERAND_TYPE_NONE}},
857 {"Release", SpvMemorySemanticsReleaseMask, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100858 {"UniformMemory",
Lei Zhangb36e7042015-10-28 13:40:52 -0400859 SpvMemorySemanticsUniformMemoryMask,
860 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100861 {SPV_OPERAND_TYPE_NONE}},
862 {"SubgroupMemory",
Lei Zhangb36e7042015-10-28 13:40:52 -0400863 SpvMemorySemanticsSubgroupMemoryMask,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100864 0,
865 {SPV_OPERAND_TYPE_NONE}},
866 {"WorkgroupLocalMemory",
Lei Zhangb36e7042015-10-28 13:40:52 -0400867 SpvMemorySemanticsWorkgroupLocalMemoryMask,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100868 0,
869 {SPV_OPERAND_TYPE_NONE}},
870 {"WorkgroupGlobalMemory",
Lei Zhangb36e7042015-10-28 13:40:52 -0400871 SpvMemorySemanticsWorkgroupGlobalMemoryMask,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100872 0,
873 {SPV_OPERAND_TYPE_NONE}},
874 {"AtomicCounterMemory",
Lei Zhangb36e7042015-10-28 13:40:52 -0400875 SpvMemorySemanticsAtomicCounterMemoryMask,
876 SPV_CAPABILITY_AS_MASK(SpvCapabilityShader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100877 {SPV_OPERAND_TYPE_NONE}},
878 {
Dejan Mircevski50babb22015-09-29 10:56:32 -0400879 "ImageMemory",
Lei Zhangb36e7042015-10-28 13:40:52 -0400880 SpvMemorySemanticsImageMemoryMask,
Dejan Mircevski50babb22015-09-29 10:56:32 -0400881 0,
882 {SPV_OPERAND_TYPE_NONE},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100883 },
884};
885
886static const spv_operand_desc_t memoryAccessEntries[] = {
Lei Zhang1a0334e2015-11-02 09:41:20 -0500887 {"None", SpvMemoryAccessMaskNone, 0, {SPV_OPERAND_TYPE_NONE}},
888 {"Volatile", SpvMemoryAccessVolatileMask, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100889 {
Dejan Mircevski50babb22015-09-29 10:56:32 -0400890 "Aligned",
Lei Zhangb36e7042015-10-28 13:40:52 -0400891 SpvMemoryAccessAlignedMask,
Dejan Mircevski50babb22015-09-29 10:56:32 -0400892 0,
Lei Zhang6483bd72015-10-14 17:02:39 -0400893 {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100894 },
Lei Zhang1a0334e2015-11-02 09:41:20 -0500895 {"Nontemporal", SpvMemoryAccessNontemporalMask, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100896};
897
898static const spv_operand_desc_t scopeEntries[] = {
Lei Zhang1a0334e2015-11-02 09:41:20 -0500899 {"CrossDevice", SpvScopeCrossDevice, 0, {SPV_OPERAND_TYPE_NONE}},
Lei Zhangb36e7042015-10-28 13:40:52 -0400900 {"Device", SpvScopeDevice, 0, {SPV_OPERAND_TYPE_NONE}},
Lei Zhang1a0334e2015-11-02 09:41:20 -0500901 {"Workgroup", SpvScopeWorkgroup, 0, {SPV_OPERAND_TYPE_NONE}},
902 {"Subgroup", SpvScopeSubgroup, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100903 {
Lei Zhang1a0334e2015-11-02 09:41:20 -0500904 "Invocation", SpvScopeInvocation, 0, {SPV_OPERAND_TYPE_NONE},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100905 },
906};
907
908static const spv_operand_desc_t groupOperationEntries[] = {
909 {"Reduce",
Lei Zhangb36e7042015-10-28 13:40:52 -0400910 SpvGroupOperationReduce,
911 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100912 {SPV_OPERAND_TYPE_NONE}},
913 {"InclusiveScan",
Lei Zhangb36e7042015-10-28 13:40:52 -0400914 SpvGroupOperationInclusiveScan,
915 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100916 {SPV_OPERAND_TYPE_NONE}},
917 {"ExclusiveScan",
Lei Zhangb36e7042015-10-28 13:40:52 -0400918 SpvGroupOperationExclusiveScan,
919 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100920 {SPV_OPERAND_TYPE_NONE}},
921};
922
923static const spv_operand_desc_t kernelKernelEnqueueFlagssEntries[] = {
924 {"NoWait",
Lei Zhangb36e7042015-10-28 13:40:52 -0400925 SpvKernelEnqueueFlagsNoWait,
926 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100927 {SPV_OPERAND_TYPE_NONE}},
928 {"WaitKernel",
Lei Zhangb36e7042015-10-28 13:40:52 -0400929 SpvKernelEnqueueFlagsWaitKernel,
930 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100931 {SPV_OPERAND_TYPE_NONE}},
932 {"WaitWorkGroup",
Lei Zhangb36e7042015-10-28 13:40:52 -0400933 SpvKernelEnqueueFlagsWaitWorkGroup,
934 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100935 {SPV_OPERAND_TYPE_NONE}},
936};
937
938static const spv_operand_desc_t kernelProfilingInfoEntries[] = {
Lei Zhang1a0334e2015-11-02 09:41:20 -0500939 {"None", SpvKernelProfilingInfoMaskNone, 0, {SPV_OPERAND_TYPE_NONE}},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100940 {"CmdExecTime",
Lei Zhangb36e7042015-10-28 13:40:52 -0400941 SpvKernelProfilingInfoCmdExecTimeMask,
942 SPV_CAPABILITY_AS_MASK(SpvCapabilityKernel),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100943 {SPV_OPERAND_TYPE_NONE}},
944};
945
David Netod30b2332015-09-23 16:04:24 -0400946// A macro for defining a capability that doesn't depend on another capability.
Lei Zhangb36e7042015-10-28 13:40:52 -0400947#define CASE(NAME) \
948 { \
949 #NAME, SpvCapability##NAME, 0, { SPV_OPERAND_TYPE_NONE } \
David Netod30b2332015-09-23 16:04:24 -0400950 }
951
952// A macro for defining a capability that depends on another.
Lei Zhangb36e7042015-10-28 13:40:52 -0400953#define CASE_CAP(NAME, CAP) \
954 { \
955 #NAME, SpvCapability##NAME, SPV_CAPABILITY_AS_MASK(SpvCapability##CAP), { \
956 SPV_OPERAND_TYPE_NONE \
957 } \
David Netod30b2332015-09-23 16:04:24 -0400958 }
959
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100960static const spv_operand_desc_t capabilityInfoEntries[] = {
David Netod30b2332015-09-23 16:04:24 -0400961 CASE(Matrix),
962 CASE_CAP(Shader, Matrix),
963 CASE_CAP(Geometry, Shader),
964 CASE_CAP(Tessellation, Shader),
965 CASE(Addresses),
966 CASE(Linkage),
967 CASE(Kernel),
968 CASE_CAP(Vector16, Kernel),
969 CASE_CAP(Float16Buffer, Kernel),
970 CASE_CAP(Float16, Float16Buffer),
971 CASE(Float64),
972 CASE(Int64),
973 CASE_CAP(Int64Atomics, Int64),
974 CASE_CAP(ImageBasic, Kernel),
975 CASE_CAP(ImageReadWrite, Kernel),
976 CASE_CAP(ImageMipmap, Kernel),
977 CASE_CAP(ImageSRGBWrite, Kernel),
978 CASE_CAP(Pipes, Kernel),
979 CASE(Groups),
980 CASE_CAP(DeviceEnqueue, Kernel),
981 CASE_CAP(LiteralSampler, Kernel),
982 CASE_CAP(AtomicStorage, Shader),
983 CASE(Int16),
984 CASE_CAP(TessellationPointSize, Tessellation),
985 CASE_CAP(GeometryPointSize, Geometry),
986 CASE_CAP(ImageGatherExtended, Shader),
987 CASE_CAP(StorageImageExtendedFormats, Shader),
988 CASE_CAP(StorageImageMultisample, Shader),
989 CASE_CAP(UniformBufferArrayDynamicIndexing, Shader),
990 CASE_CAP(SampledImageArrayDynamicIndexing, Shader),
991 CASE_CAP(StorageBufferArrayDynamicIndexing, Shader),
992 CASE_CAP(StorageImageArrayDynamicIndexing, Shader),
993 CASE_CAP(ClipDistance, Shader),
994 CASE_CAP(CullDistance, Shader),
995 CASE_CAP(ImageCubeArray, SampledCubeArray),
996 CASE_CAP(SampleRateShading, Shader),
997 CASE_CAP(ImageRect, SampledRect),
998 CASE_CAP(SampledRect, Shader),
999 CASE_CAP(GenericPointer, Addresses),
1000 CASE_CAP(Int8, Kernel),
1001 CASE_CAP(InputTarget, Shader),
1002 CASE_CAP(SparseResidency, Shader),
1003 CASE_CAP(MinLod, Shader),
1004 CASE_CAP(Sampled1D, Shader),
1005 CASE_CAP(Image1D, Sampled1D),
1006 CASE_CAP(SampledCubeArray, Shader),
1007 CASE_CAP(SampledBuffer, Shader),
1008 CASE_CAP(ImageBuffer, SampledBuffer),
1009 CASE_CAP(ImageMSArray, Shader),
1010 CASE_CAP(AdvancedFormats, Shader),
1011 CASE_CAP(ImageQuery, Shader),
1012 CASE_CAP(DerivativeControl, Shader),
1013 CASE_CAP(InterpolationFunction, Shader),
1014 CASE_CAP(TransformFeedback, Shader),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001015};
David Netod30b2332015-09-23 16:04:24 -04001016#undef CASE
1017#undef CASE_CAP
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001018
1019static const spv_operand_desc_group_t opcodeEntryTypes[] = {
1020 {SPV_OPERAND_TYPE_SOURCE_LANGUAGE,
1021 sizeof(sourceLanguageEntries) / sizeof(spv_operand_desc_t),
1022 sourceLanguageEntries},
1023 {SPV_OPERAND_TYPE_EXECUTION_MODEL,
1024 sizeof(executionModelEntries) / sizeof(spv_operand_desc_t),
1025 executionModelEntries},
1026 {SPV_OPERAND_TYPE_ADDRESSING_MODEL,
1027 sizeof(addressingModelEntries) / sizeof(spv_operand_desc_t),
1028 addressingModelEntries},
1029 {SPV_OPERAND_TYPE_MEMORY_MODEL,
1030 sizeof(memoryModelEntries) / sizeof(spv_operand_desc_t),
1031 memoryModelEntries},
1032 {SPV_OPERAND_TYPE_EXECUTION_MODE,
1033 sizeof(executionModeEntries) / sizeof(spv_operand_desc_t),
1034 executionModeEntries},
1035 {SPV_OPERAND_TYPE_STORAGE_CLASS,
1036 sizeof(storageClassEntries) / sizeof(spv_operand_desc_t),
1037 storageClassEntries},
1038 {SPV_OPERAND_TYPE_DIMENSIONALITY,
1039 sizeof(dimensionalityEntries) / sizeof(spv_operand_desc_t),
1040 dimensionalityEntries},
1041 {SPV_OPERAND_TYPE_SAMPLER_ADDRESSING_MODE,
1042 sizeof(samplerAddressingModeEntries) / sizeof(spv_operand_desc_t),
1043 samplerAddressingModeEntries},
1044 {SPV_OPERAND_TYPE_SAMPLER_FILTER_MODE,
1045 sizeof(samplerFilterModeEntries) / sizeof(spv_operand_desc_t),
1046 samplerFilterModeEntries},
David Netob30a0c52015-09-16 15:56:43 -04001047 {SPV_OPERAND_TYPE_SAMPLER_IMAGE_FORMAT,
1048 sizeof(samplerImageFormatEntries) / sizeof(spv_operand_desc_t),
1049 samplerImageFormatEntries},
David Netoddda85a2015-10-02 17:10:10 -04001050 {SPV_OPERAND_TYPE_IMAGE_CHANNEL_ORDER,
1051 sizeof(imageChannelOrderEntries) / sizeof(spv_operand_desc_t),
1052 imageChannelOrderEntries},
1053 {SPV_OPERAND_TYPE_IMAGE_CHANNEL_DATA_TYPE,
1054 sizeof(imageChannelDataTypeEntries) / sizeof(spv_operand_desc_t),
1055 imageChannelDataTypeEntries},
David Neto201caf72015-11-04 17:38:17 -05001056 {SPV_OPERAND_TYPE_IMAGE,
1057 sizeof(imageOperandEntries) / sizeof(spv_operand_desc_t),
1058 imageOperandEntries},
1059 {SPV_OPERAND_TYPE_OPTIONAL_IMAGE, // Same as *_IMAGE
David Netoee1b3bb2015-09-18 11:19:18 -04001060 sizeof(imageOperandEntries) / sizeof(spv_operand_desc_t),
1061 imageOperandEntries},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001062 {SPV_OPERAND_TYPE_FP_FAST_MATH_MODE,
1063 sizeof(fpFastMathModeEntries) / sizeof(spv_operand_desc_t),
1064 fpFastMathModeEntries},
1065 {SPV_OPERAND_TYPE_FP_ROUNDING_MODE,
1066 sizeof(fpRoundingModeEntries) / sizeof(spv_operand_desc_t),
1067 fpRoundingModeEntries},
1068 {SPV_OPERAND_TYPE_LINKAGE_TYPE,
1069 sizeof(linkageTypeEntries) / sizeof(spv_operand_desc_t),
1070 linkageTypeEntries},
1071 {SPV_OPERAND_TYPE_ACCESS_QUALIFIER,
1072 sizeof(accessQualifierEntries) / sizeof(spv_operand_desc_t),
1073 accessQualifierEntries},
1074 {SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE,
1075 sizeof(functionParameterAttributeEntries) / sizeof(spv_operand_desc_t),
1076 functionParameterAttributeEntries},
1077 {SPV_OPERAND_TYPE_DECORATION,
1078 sizeof(decorationEntries) / sizeof(spv_operand_desc_t), decorationEntries},
1079 {SPV_OPERAND_TYPE_BUILT_IN,
1080 sizeof(builtInEntries) / sizeof(spv_operand_desc_t), builtInEntries},
1081 {SPV_OPERAND_TYPE_SELECTION_CONTROL,
1082 sizeof(selectionControlEntries) / sizeof(spv_operand_desc_t),
1083 selectionControlEntries},
1084 {SPV_OPERAND_TYPE_LOOP_CONTROL,
1085 sizeof(loopControlEntries) / sizeof(spv_operand_desc_t),
1086 loopControlEntries},
1087 {SPV_OPERAND_TYPE_FUNCTION_CONTROL,
1088 sizeof(functionControlEntries) / sizeof(spv_operand_desc_t),
1089 functionControlEntries},
1090 {SPV_OPERAND_TYPE_MEMORY_SEMANTICS,
1091 sizeof(memorySemanticsEntries) / sizeof(spv_operand_desc_t),
1092 memorySemanticsEntries},
David Neto201caf72015-11-04 17:38:17 -05001093 {SPV_OPERAND_TYPE_MEMORY_ACCESS,
1094 sizeof(memoryAccessEntries) / sizeof(spv_operand_desc_t),
1095 memoryAccessEntries},
1096 {SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS, // Same as *_MEMORY_ACCESS
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001097 sizeof(memoryAccessEntries) / sizeof(spv_operand_desc_t),
1098 memoryAccessEntries},
1099 {SPV_OPERAND_TYPE_EXECUTION_SCOPE,
1100 sizeof(scopeEntries) / sizeof(spv_operand_desc_t), scopeEntries},
1101 {SPV_OPERAND_TYPE_GROUP_OPERATION,
1102 sizeof(groupOperationEntries) / sizeof(spv_operand_desc_t),
1103 groupOperationEntries},
1104 {SPV_OPERAND_TYPE_KERNEL_ENQ_FLAGS,
1105 sizeof(kernelKernelEnqueueFlagssEntries) / sizeof(spv_operand_desc_t),
1106 kernelKernelEnqueueFlagssEntries},
David Neto47994822015-08-27 13:11:01 -04001107 {SPV_OPERAND_TYPE_KERNEL_PROFILING_INFO,
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001108 sizeof(kernelProfilingInfoEntries) / sizeof(spv_operand_desc_t),
1109 kernelProfilingInfoEntries},
1110 {SPV_OPERAND_TYPE_CAPABILITY,
1111 sizeof(capabilityInfoEntries) / sizeof(spv_operand_desc_t),
1112 capabilityInfoEntries},
1113};
1114
Dejan Mircevski50babb22015-09-29 10:56:32 -04001115spv_result_t spvOperandTableGet(spv_operand_table* pOperandTable) {
Lei Zhang40056702015-09-11 14:31:27 -04001116 if (!pOperandTable) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001117
1118 static const spv_operand_table_t table = {
1119 sizeof(opcodeEntryTypes) / sizeof(spv_operand_desc_group_t),
1120 opcodeEntryTypes};
1121
1122 *pOperandTable = &table;
1123
1124 return SPV_SUCCESS;
1125}
1126
1127spv_result_t spvOperandTableNameLookup(const spv_operand_table table,
1128 const spv_operand_type_t type,
David Neto388c40d2015-09-16 16:42:56 -04001129 const char* name,
1130 const size_t nameLength,
1131 spv_operand_desc* pEntry) {
Lei Zhang40056702015-09-11 14:31:27 -04001132 if (!table) return SPV_ERROR_INVALID_TABLE;
1133 if (!name || !pEntry) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001134
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001135 for (uint64_t typeIndex = 0; typeIndex < table->count; ++typeIndex) {
1136 if (type == table->types[typeIndex].type) {
1137 for (uint64_t operandIndex = 0;
1138 operandIndex < table->types[typeIndex].count; ++operandIndex) {
1139 if (nameLength ==
1140 strlen(table->types[typeIndex].entries[operandIndex].name) &&
1141 !strncmp(table->types[typeIndex].entries[operandIndex].name, name,
David Neto388c40d2015-09-16 16:42:56 -04001142 nameLength)) {
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001143 *pEntry = &table->types[typeIndex].entries[operandIndex];
1144 return SPV_SUCCESS;
1145 }
1146 }
1147 }
1148 }
1149
1150 return SPV_ERROR_INVALID_LOOKUP;
1151}
1152
1153spv_result_t spvOperandTableValueLookup(const spv_operand_table table,
1154 const spv_operand_type_t type,
1155 const uint32_t value,
Dejan Mircevski50babb22015-09-29 10:56:32 -04001156 spv_operand_desc* pEntry) {
Lei Zhang40056702015-09-11 14:31:27 -04001157 if (!table) return SPV_ERROR_INVALID_TABLE;
1158 if (!pEntry) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001159
1160 for (uint64_t typeIndex = 0; typeIndex < table->count; ++typeIndex) {
1161 if (type == table->types[typeIndex].type) {
1162 for (uint64_t operandIndex = 0;
1163 operandIndex < table->types[typeIndex].count; ++operandIndex) {
1164 if (value == table->types[typeIndex].entries[operandIndex].value) {
1165 *pEntry = &table->types[typeIndex].entries[operandIndex];
1166 return SPV_SUCCESS;
1167 }
1168 }
1169 }
1170 }
1171
1172 return SPV_ERROR_INVALID_LOOKUP;
1173}
1174
Dejan Mircevski50babb22015-09-29 10:56:32 -04001175const char* spvOperandTypeStr(spv_operand_type_t type) {
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001176 switch (type) {
1177 case SPV_OPERAND_TYPE_ID:
David Netofadbf622015-09-14 17:07:11 -04001178 case SPV_OPERAND_TYPE_OPTIONAL_ID:
David Netofadbf622015-09-14 17:07:11 -04001179 return "ID";
David Neto201caf72015-11-04 17:38:17 -05001180 case SPV_OPERAND_TYPE_TYPE_ID:
1181 return "type ID";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001182 case SPV_OPERAND_TYPE_RESULT_ID:
1183 return "result ID";
Lei Zhang6483bd72015-10-14 17:02:39 -04001184 case SPV_OPERAND_TYPE_LITERAL_INTEGER:
David Neto201caf72015-11-04 17:38:17 -05001185 case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_INTEGER:
1186 case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_NUMBER:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001187 return "literal number";
David Neto201caf72015-11-04 17:38:17 -05001188 case SPV_OPERAND_TYPE_OPTIONAL_TYPED_LITERAL_INTEGER:
1189 return "possibly multi-word literal integer";
1190 case SPV_OPERAND_TYPE_TYPED_LITERAL_NUMBER:
1191 return "possibly multi-word literal number";
1192 case SPV_OPERAND_TYPE_EXTENSION_INSTRUCTION_NUMBER:
1193 return "extension instruction number";
David Neto0f166be2015-11-11 01:56:49 -05001194 case SPV_OPERAND_TYPE_SPEC_CONSTANT_OP_NUMBER:
1195 return "OpSpecConstantOp opcode";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001196 case SPV_OPERAND_TYPE_LITERAL_STRING:
David Neto201caf72015-11-04 17:38:17 -05001197 case SPV_OPERAND_TYPE_OPTIONAL_LITERAL_STRING:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001198 return "literal string";
1199 case SPV_OPERAND_TYPE_SOURCE_LANGUAGE:
Dejan Mircevskid2c81cf2015-10-09 11:06:10 -04001200 return "source language";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001201 case SPV_OPERAND_TYPE_EXECUTION_MODEL:
1202 return "execution model";
1203 case SPV_OPERAND_TYPE_ADDRESSING_MODEL:
1204 return "addressing model";
1205 case SPV_OPERAND_TYPE_MEMORY_MODEL:
1206 return "memory model";
1207 case SPV_OPERAND_TYPE_EXECUTION_MODE:
David Neto201caf72015-11-04 17:38:17 -05001208 case SPV_OPERAND_TYPE_OPTIONAL_EXECUTION_MODE:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001209 return "execution mode";
1210 case SPV_OPERAND_TYPE_STORAGE_CLASS:
1211 return "storage class";
1212 case SPV_OPERAND_TYPE_DIMENSIONALITY:
1213 return "dimensionality";
1214 case SPV_OPERAND_TYPE_SAMPLER_ADDRESSING_MODE:
1215 return "addressing mode";
1216 case SPV_OPERAND_TYPE_SAMPLER_FILTER_MODE:
1217 return "sampler filter mode";
David Netob30a0c52015-09-16 15:56:43 -04001218 case SPV_OPERAND_TYPE_SAMPLER_IMAGE_FORMAT:
Dejan Mircevski971b3442015-10-13 12:54:47 -04001219 return "image format";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001220 case SPV_OPERAND_TYPE_FP_FAST_MATH_MODE:
Dejan Mircevski355cc0c2015-10-13 15:02:03 -04001221 return "floating-point fast math mode";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001222 case SPV_OPERAND_TYPE_FP_ROUNDING_MODE:
Dejan Mircevski355cc0c2015-10-13 15:02:03 -04001223 return "floating-point rounding mode";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001224 case SPV_OPERAND_TYPE_LINKAGE_TYPE:
1225 return "linkage type";
1226 case SPV_OPERAND_TYPE_ACCESS_QUALIFIER:
1227 return "access qualifier";
1228 case SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE:
1229 return "function parameter attribute";
1230 case SPV_OPERAND_TYPE_DECORATION:
1231 return "decoration";
1232 case SPV_OPERAND_TYPE_BUILT_IN:
Dejan Mircevskid7b0f832015-10-13 15:39:38 -04001233 return "built-in";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001234 case SPV_OPERAND_TYPE_SELECTION_CONTROL:
1235 return "selection control";
1236 case SPV_OPERAND_TYPE_LOOP_CONTROL:
1237 return "loop control";
1238 case SPV_OPERAND_TYPE_FUNCTION_CONTROL:
1239 return "function control";
1240 case SPV_OPERAND_TYPE_MEMORY_SEMANTICS:
1241 return "memory semantics";
David Neto201caf72015-11-04 17:38:17 -05001242 case SPV_OPERAND_TYPE_MEMORY_ACCESS:
David Neto78c3b432015-08-27 13:03:52 -04001243 case SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001244 return "memory access";
1245 case SPV_OPERAND_TYPE_EXECUTION_SCOPE:
David Netofadbf622015-09-14 17:07:11 -04001246 return "execution scope ID";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001247 case SPV_OPERAND_TYPE_GROUP_OPERATION:
1248 return "group operation";
1249 case SPV_OPERAND_TYPE_KERNEL_ENQ_FLAGS:
1250 return "kernel enqeue flags";
David Neto47994822015-08-27 13:11:01 -04001251 case SPV_OPERAND_TYPE_KERNEL_PROFILING_INFO:
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001252 return "kernel profiling info";
1253 case SPV_OPERAND_TYPE_CAPABILITY:
1254 return "capability";
David Neto201caf72015-11-04 17:38:17 -05001255 case SPV_OPERAND_TYPE_IMAGE:
David Netoee1b3bb2015-09-18 11:19:18 -04001256 case SPV_OPERAND_TYPE_OPTIONAL_IMAGE:
1257 return "image operand";
David Neto201caf72015-11-04 17:38:17 -05001258 case SPV_OPERAND_TYPE_OPTIONAL_CIV:
1259 return "context-insensitive value";
1260
1261 // The next values are for values returned from an instruction, not actually
1262 // an operand. So the specific strings don't matter. But let's add them
1263 // for completeness and ease of testing.
1264 case SPV_OPERAND_TYPE_IMAGE_CHANNEL_ORDER:
1265 return "image channel order";
1266 case SPV_OPERAND_TYPE_IMAGE_CHANNEL_DATA_TYPE:
1267 return "image channel data type";
1268
David Neto78c3b432015-08-27 13:03:52 -04001269 case SPV_OPERAND_TYPE_NONE:
1270 return "NONE";
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +01001271 default:
1272 assert(0 && "Unhandled operand type!");
1273 break;
1274 }
1275 return "unknown";
1276}
David Neto78c3b432015-08-27 13:03:52 -04001277
1278void spvPrependOperandTypes(const spv_operand_type_t* types,
1279 spv_operand_pattern_t* pattern) {
1280 const spv_operand_type_t* endTypes;
Dejan Mircevski50babb22015-09-29 10:56:32 -04001281 for (endTypes = types; *endTypes != SPV_OPERAND_TYPE_NONE; ++endTypes)
David Neto78c3b432015-08-27 13:03:52 -04001282 ;
1283 pattern->insert(pattern->begin(), types, endTypes);
1284}
1285
David Neto5bf88fc2015-09-17 17:06:10 -04001286void spvPrependOperandTypesForMask(const spv_operand_table operandTable,
1287 const spv_operand_type_t type,
1288 const uint32_t mask,
1289 spv_operand_pattern_t* pattern) {
1290 // Scan from highest bits to lowest bits because we will prepend in LIFO
1291 // fashion, and we need the operands for lower order bits to appear first.
1292 for (uint32_t candidate_bit = (1 << 31); candidate_bit; candidate_bit >>= 1) {
1293 if (candidate_bit & mask) {
1294 spv_operand_desc entry = nullptr;
1295 if (SPV_SUCCESS == spvOperandTableValueLookup(operandTable, type,
1296 candidate_bit, &entry)) {
1297 spvPrependOperandTypes(entry->operandTypes, pattern);
1298 }
1299 }
1300 }
1301}
1302
David Neto78c3b432015-08-27 13:03:52 -04001303bool spvOperandIsOptional(spv_operand_type_t type) {
David Neto201caf72015-11-04 17:38:17 -05001304 return SPV_OPERAND_TYPE_FIRST_OPTIONAL_TYPE <= type &&
1305 type <= SPV_OPERAND_TYPE_LAST_OPTIONAL_TYPE;
David Neto78c3b432015-08-27 13:03:52 -04001306}
1307
1308bool spvOperandIsVariable(spv_operand_type_t type) {
David Neto201caf72015-11-04 17:38:17 -05001309 return SPV_OPERAND_TYPE_FIRST_VARIABLE_TYPE <= type &&
1310 type <= SPV_OPERAND_TYPE_LAST_VARIABLE_TYPE;
David Neto78c3b432015-08-27 13:03:52 -04001311}
1312
David Neto78c3b432015-08-27 13:03:52 -04001313bool spvExpandOperandSequenceOnce(spv_operand_type_t type,
1314 spv_operand_pattern_t* pattern) {
1315 switch (type) {
1316 case SPV_OPERAND_TYPE_VARIABLE_ID:
1317 pattern->insert(pattern->begin(), {SPV_OPERAND_TYPE_OPTIONAL_ID, type});
1318 return true;
Lei Zhang6483bd72015-10-14 17:02:39 -04001319 case SPV_OPERAND_TYPE_VARIABLE_LITERAL_INTEGER:
David Neto78c3b432015-08-27 13:03:52 -04001320 pattern->insert(pattern->begin(),
Lei Zhang6483bd72015-10-14 17:02:39 -04001321 {SPV_OPERAND_TYPE_OPTIONAL_LITERAL_INTEGER, type});
David Neto78c3b432015-08-27 13:03:52 -04001322 return true;
Lei Zhang6483bd72015-10-14 17:02:39 -04001323 case SPV_OPERAND_TYPE_VARIABLE_LITERAL_INTEGER_ID:
David Neto201caf72015-11-04 17:38:17 -05001324 // Represents Zero or more (Literal number, Id) pairs,
1325 // where the literal number must be a scalar integer.
David Neto78c3b432015-08-27 13:03:52 -04001326 pattern->insert(pattern->begin(),
David Neto201caf72015-11-04 17:38:17 -05001327 {SPV_OPERAND_TYPE_OPTIONAL_TYPED_LITERAL_INTEGER,
1328 SPV_OPERAND_TYPE_ID, type});
David Neto78c3b432015-08-27 13:03:52 -04001329 return true;
Lei Zhang6483bd72015-10-14 17:02:39 -04001330 case SPV_OPERAND_TYPE_VARIABLE_ID_LITERAL_INTEGER:
David Neto561dc4e2015-09-25 14:23:29 -04001331 // Represents Zero or more (Id, Literal number) pairs.
David Neto201caf72015-11-04 17:38:17 -05001332 pattern->insert(pattern->begin(),
1333 {SPV_OPERAND_TYPE_OPTIONAL_ID,
1334 SPV_OPERAND_TYPE_LITERAL_INTEGER, type});
David Neto78c3b432015-08-27 13:03:52 -04001335 return true;
David Neto78c3b432015-08-27 13:03:52 -04001336 case SPV_OPERAND_TYPE_VARIABLE_EXECUTION_MODE:
Dejan Mircevski50babb22015-09-29 10:56:32 -04001337 pattern->insert(pattern->begin(),
1338 {SPV_OPERAND_TYPE_OPTIONAL_EXECUTION_MODE, type});
David Neto78c3b432015-08-27 13:03:52 -04001339 return true;
1340 default:
1341 break;
1342 }
1343 return false;
1344}
1345
Dejan Mircevski50babb22015-09-29 10:56:32 -04001346spv_operand_type_t spvTakeFirstMatchableOperand(
1347 spv_operand_pattern_t* pattern) {
David Neto78c3b432015-08-27 13:03:52 -04001348 assert(!pattern->empty());
1349 spv_operand_type_t result;
1350 do {
1351 result = pattern->front();
1352 pattern->pop_front();
Dejan Mircevski50babb22015-09-29 10:56:32 -04001353 } while (spvExpandOperandSequenceOnce(result, pattern));
David Neto78c3b432015-08-27 13:03:52 -04001354 return result;
1355}
Dejan Mircevski903f9d62015-09-28 17:04:39 -04001356
Dejan Mircevski897bff92015-09-29 10:38:18 -04001357spv_operand_pattern_t spvAlternatePatternFollowingImmediate(
1358 const spv_operand_pattern_t& pattern) {
1359 spv_operand_pattern_t alternatePattern;
1360 for (const auto& operand : pattern) {
1361 if (operand == SPV_OPERAND_TYPE_RESULT_ID) {
1362 alternatePattern.push_back(operand);
1363 alternatePattern.push_back(SPV_OPERAND_TYPE_OPTIONAL_CIV);
1364 return alternatePattern;
Dejan Mircevski903f9d62015-09-28 17:04:39 -04001365 }
Dejan Mircevski897bff92015-09-29 10:38:18 -04001366 alternatePattern.push_back(SPV_OPERAND_TYPE_OPTIONAL_CIV);
Dejan Mircevski903f9d62015-09-28 17:04:39 -04001367 }
Dejan Mircevski897bff92015-09-29 10:38:18 -04001368 // No result-id found, so just expect CIVs.
1369 return {SPV_OPERAND_TYPE_OPTIONAL_CIV};
Dejan Mircevski903f9d62015-09-28 17:04:39 -04001370}