2 * Copyright (c) 2018 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 #ifndef DALI_GRAPHICS_VULKAN_SPIRV_SPIRV_OPCODES_H
19 #define DALI_GRAPHICS_VULKAN_SPIRV_SPIRV_OPCODES_H
31 std::string name{"OpNull"};
32 uint32_t code{static_cast<uint32_t>( -1u )};
33 bool hasResult{false};
34 bool hasResultType{false};
36 bool isTrivial{false}; // trivial types do not reference to any other result
38 /** Defines local data */
41 uint32_t* start{nullptr};
43 uint32_t resultId{0u};
44 int32_t resultType{-1};
47 LocalData localData{};
49 bool operator!=( const SPIRVOpCode& opcode ) const
51 return opcode.code != code;
54 bool operator==( const SPIRVOpCode& opcode ) const
56 return opcode.code == code;
59 bool operator==( SpvOp op ) const
61 return ( code == static_cast<uint32_t>(op) );
65 T GetParameter( uint32_t index ) const
67 return static_cast<T>( *( localData.start + index + 1 ) );
70 uint32_t GetParameterU32( uint32_t index ) const
72 return GetParameter<uint32_t>( index );
75 std::string GetParameterAsString( uint32_t index ) const
77 return reinterpret_cast<const char*>( localData.start + index + 1 );
81 T operator[]( uint32_t index ) const
83 return GetParameter<T>( index );
86 SPIRVOpCode() = default;
87 ~SPIRVOpCode() = default;
92 #pragma GCC diagnostic push
93 #pragma GCC diagnostic ignored "-Wlarger-than="
95 * List of all the SPIR-V opcodes
96 * OpCodes describing types: 19-39
98 static const SPIRVOpCode OP_CODE_ARRAY[] = {{"OpNop", 0, false, false, false},
99 {"OpUndef", 1, true, true, false},
100 {"OpSourceContinued", 2, false, false, false},
101 {"OpSource", 3, false, false, false},
102 {"OpSourceExtension", 4, false, false, false},
103 {"OpName", 5, false, false, false},
104 {"OpMemberName", 6, false, false, false},
105 {"OpString", 7, true, false, false},
106 {"OpLine", 8, false, false, false},
107 {"OpExtension", 10, false, false, false},
108 {"OpExtInstImport", 11, true, false, false},
109 {"OpExtInst", 12, true, true, false},
110 {"OpMemoryModel", 14, false, false, false},
111 {"OpEntryPoint", 15, false, false, false},
112 {"OpExecutionMode", 16, false, false, false},
113 {"OpCapability", 17, false, false, false},
114 {"OpTypeVoid", 19, true, false, true, true},
115 {"OpTypeBool", 20, true, false, true, true},
116 {"OpTypeInt", 21, true, false, true, true},
117 {"OpTypeFloat", 22, true, false, true, true},
118 {"OpTypeVector", 23, true, false, true},
119 {"OpTypeMatrix", 24, true, false, true},
120 {"OpTypeImage", 25, true, false, true},
121 {"OpTypeSampler", 26, true, false, true},
122 {"OpTypeSampledImage", 27, true, false, true},
123 {"OpTypeArray", 28, true, false, true},
124 {"OpTypeRuntimeArray", 29, true, false, true},
125 {"OpTypeStruct", 30, true, false, true},
126 {"OpTypeOpaque", 31, true, false, true},
127 {"OpTypePointer", 32, true, false, true},
128 {"OpTypeFunction", 33, true, false, true},
129 {"OpTypeEvent", 34, true, false, true},
130 {"OpTypeDeviceEvent", 35, true, false, true},
131 {"OpTypeReserveId", 36, true, false, true},
132 {"OpTypeQueue", 37, true, false, true},
133 {"OpTypePipe", 38, true, false, true},
134 {"OpTypeForwardPointer", 39, false, false, true},
135 {"OpConstantTrue", 41, true, true, false},
136 {"OpConstantFalse", 42, true, true, false},
137 {"OpConstant", 43, true, true, false},
138 {"OpConstantComposite", 44, true, true, false},
139 {"OpConstantSampler", 45, true, true, false},
140 {"OpConstantNull", 46, true, true, false},
141 {"OpSpecConstantTrue", 48, true, true, false},
142 {"OpSpecConstantFalse", 49, true, true, false},
143 {"OpSpecConstant", 50, true, true, false},
144 {"OpSpecConstantComposite", 51, true, true, false},
145 {"OpSpecConstantOp", 52, true, true, false},
146 {"OpFunction", 54, true, true, false},
147 {"OpFunctionParameter", 55, true, true, false},
148 {"OpFunctionEnd", 56, false, false, false},
149 {"OpFunctionCall", 57, true, true, false},
150 {"OpVariable", 59, true, true, false},
151 {"OpImageTexelPointer", 60, true, true, false},
152 {"OpLoad", 61, true, true, false},
153 {"OpStore", 62, false, false, false},
154 {"OpCopyMemory", 63, false, false, false},
155 {"OpCopyMemorySized", 64, false, false, false},
156 {"OpAccessChain", 65, true, true, false},
157 {"OpInBoundsAccessChain", 66, true, true, false},
158 {"OpPtrAccessChain", 67, true, true, false},
159 {"OpArrayLength", 68, true, true, false},
160 {"OpGenericPtrMemSemantics", 69, true, true, false},
161 {"OpInBoundsPtrAccessChain", 70, true, true, false},
162 {"OpDecorate", 71, false, false, false},
163 {"OpMemberDecorate", 72, false, false, false},
164 {"OpDecorationGroup", 73, true, false, false},
165 {"OpGroupDecorate", 74, false, false, false},
166 {"OpGroupMemberDecorate", 75, false, false, false},
167 {"OpVectorExtractDynamic", 77, true, true, false},
168 {"OpVectorInsertDynamic", 78, true, true, false},
169 {"OpVectorShuffle", 79, true, true, false},
170 {"OpCompositeConstruct", 80, true, true, false},
171 {"OpCompositeExtract", 81, true, true, false},
172 {"OpCompositeInsert", 82, true, true, false},
173 {"OpCopyObject", 83, true, true, false},
174 {"OpTranspose", 84, true, true, false},
175 {"OpSampledImage", 86, true, true, false},
176 {"OpImageSampleImplicitLod", 87, true, true, false},
177 {"OpImageSampleExplicitLod", 88, true, true, false},
178 {"OpImageSampleDrefImplicitLod", 89, true, true, false},
179 {"OpImageSampleDrefExplicitLod", 90, true, true, false},
180 {"OpImageSampleProjImplicitLod", 91, true, true, false},
181 {"OpImageSampleProjExplicitLod", 92, true, true, false},
182 {"OpImageSampleProjDrefImplicitLod", 93, true, true, false},
183 {"OpImageSampleProjDrefExplicitLod", 94, true, true, false},
184 {"OpImageFetch", 95, true, true, false},
185 {"OpImageGather", 96, true, true, false},
186 {"OpImageDrefGather", 97, true, true, false},
187 {"OpImageRead", 98, true, true, false},
188 {"OpImageWrite", 99, false, false, false},
189 {"OpImage", 100, true, true, false},
190 {"OpImageQueryFormat", 101, true, true, false},
191 {"OpImageQueryOrder", 102, true, true, false},
192 {"OpImageQuerySizeLod", 103, true, true, false},
193 {"OpImageQuerySize", 104, true, true, false},
194 {"OpImageQueryLod", 105, true, true, false},
195 {"OpImageQueryLevels", 106, true, true, false},
196 {"OpImageQuerySamples", 107, true, true, false},
197 {"OpConvertFToU", 109, true, true, false},
198 {"OpConvertFToS", 110, true, true, false},
199 {"OpConvertSToF", 111, true, true, false},
200 {"OpConvertUToF", 112, true, true, false},
201 {"OpUConvert", 113, true, true, false},
202 {"OpSConvert", 114, true, true, false},
203 {"OpFConvert", 115, true, true, false},
204 {"OpQuantizeToF16", 116, true, true, false},
205 {"OpConvertPtrToU", 117, true, true, false},
206 {"OpSatConvertSToU", 118, true, true, false},
207 {"OpSatConvertUToS", 119, true, true, false},
208 {"OpConvertUToPtr", 120, true, true, false},
209 {"OpPtrCastToGeneric", 121, true, true, false},
210 {"OpGenericCastToPtr", 122, true, true, false},
211 {"OpGenericCastToPtrExplicit", 123, true, true, false},
212 {"OpBitcast", 124, true, true, false},
213 {"OpSNegate", 126, true, true, false},
214 {"OpFNegate", 127, true, true, false},
215 {"OpIAdd", 128, true, true, false},
216 {"OpFAdd", 129, true, true, false},
217 {"OpISub", 130, true, true, false},
218 {"OpFSub", 131, true, true, false},
219 {"OpIMul", 132, true, true, false},
220 {"OpFMul", 133, true, true, false},
221 {"OpUDiv", 134, true, true, false},
222 {"OpSDiv", 135, true, true, false},
223 {"OpFDiv", 136, true, true, false},
224 {"OpUMod", 137, true, true, false},
225 {"OpSRem", 138, true, true, false},
226 {"OpSMod", 139, true, true, false},
227 {"OpFRem", 140, true, true, false},
228 {"OpFMod", 141, true, true, false},
229 {"OpVectorTimesScalar", 142, true, true, false},
230 {"OpMatrixTimesScalar", 143, true, true, false},
231 {"OpVectorTimesMatrix", 144, true, true, false},
232 {"OpMatrixTimesVector", 145, true, true, false},
233 {"OpMatrixTimesMatrix", 146, true, true, false},
234 {"OpOuterProduct", 147, true, true, false},
235 {"OpDot", 148, true, true, false},
236 {"OpIAddCarry", 149, true, true, false},
237 {"OpISubBorrow", 150, true, true, false},
238 {"OpUMulExtended", 151, true, true, false},
239 {"OpSMulExtended", 152, true, true, false},
240 {"OpAny", 154, true, true, false},
241 {"OpAll", 155, true, true, false},
242 {"OpIsNan", 156, true, true, false},
243 {"OpIsInf", 157, true, true, false},
244 {"OpIsFinite", 158, true, true, false},
245 {"OpIsNormal", 159, true, true, false},
246 {"OpSignBitSet", 160, true, true, false},
247 {"OpLessOrGreater", 161, true, true, false},
248 {"OpOrdered", 162, true, true, false},
249 {"OpUnordered", 163, true, true, false},
250 {"OpLogicalEqual", 164, true, true, false},
251 {"OpLogicalNotEqual", 165, true, true, false},
252 {"OpLogicalOr", 166, true, true, false},
253 {"OpLogicalAnd", 167, true, true, false},
254 {"OpLogicalNot", 168, true, true, false},
255 {"OpSelect", 169, true, true, false},
256 {"OpIEqual", 170, true, true, false},
257 {"OpINotEqual", 171, true, true, false},
258 {"OpUGreaterThan", 172, true, true, false},
259 {"OpSGreaterThan", 173, true, true, false},
260 {"OpUGreaterThanEqual", 174, true, true, false},
261 {"OpSGreaterThanEqual", 175, true, true, false},
262 {"OpULessThan", 176, true, true, false},
263 {"OpSLessThan", 177, true, true, false},
264 {"OpULessThanEqual", 178, true, true, false},
265 {"OpSLessThanEqual", 179, true, true, false},
266 {"OpFOrdEqual", 180, true, true, false},
267 {"OpFUnordEqual", 181, true, true, false},
268 {"OpFOrdNotEqual", 182, true, true, false},
269 {"OpFUnordNotEqual", 183, true, true, false},
270 {"OpFOrdLessThan", 184, true, true, false},
271 {"OpFUnordLessThan", 185, true, true, false},
272 {"OpFOrdGreaterThan", 186, true, true, false},
273 {"OpFUnordGreaterThan", 187, true, true, false},
274 {"OpFOrdLessThanEqual", 188, true, true, false},
275 {"OpFUnordLessThanEqual", 189, true, true, false},
276 {"OpFOrdGreaterThanEqual", 190, true, true, false},
277 {"OpFUnordGreaterThanEqual", 191, true, true, false},
278 {"OpShiftRightLogical", 194, true, true, false},
279 {"OpShiftRightArithmetic", 195, true, true, false},
280 {"OpShiftLeftLogical", 196, true, true, false},
281 {"OpBitwiseOr", 197, true, true, false},
282 {"OpBitwiseXor", 198, true, true, false},
283 {"OpBitwiseAnd", 199, true, true, false},
284 {"OpNot", 200, true, true, false},
285 {"OpBitFieldInsert", 201, true, true, false},
286 {"OpBitFieldSExtract", 202, true, true, false},
287 {"OpBitFieldUExtract", 203, true, true, false},
288 {"OpBitReverse", 204, true, true, false},
289 {"OpBitCount", 205, true, true, false},
290 {"OpDPdx", 207, true, true, false},
291 {"OpDPdy", 208, true, true, false},
292 {"OpFwidth", 209, true, true, false},
293 {"OpDPdxFine", 210, true, true, false},
294 {"OpDPdyFine", 211, true, true, false},
295 {"OpFwidthFine", 212, true, true, false},
296 {"OpDPdxCoarse", 213, true, true, false},
297 {"OpDPdyCoarse", 214, true, true, false},
298 {"OpFwidthCoarse", 215, true, true, false},
299 {"OpEmitVertex", 218, false, false, false},
300 {"OpEndPrimitive", 219, false, false, false},
301 {"OpEmitStreamVertex", 220, false, false, false},
302 {"OpEndStreamPrimitive", 221, false, false, false},
303 {"OpControlBarrier", 224, false, false, false},
304 {"OpMemoryBarrier", 225, false, false, false},
305 {"OpAtomicLoad", 227, true, true, false},
306 {"OpAtomicStore", 228, false, false, false},
307 {"OpAtomicExchange", 229, true, true, false},
308 {"OpAtomicCompareExchange", 230, true, true, false},
309 {"OpAtomicCompareExchangeWeak", 231, true, true, false},
310 {"OpAtomicIIncrement", 232, true, true, false},
311 {"OpAtomicIDecrement", 233, true, true, false},
312 {"OpAtomicIAdd", 234, true, true, false},
313 {"OpAtomicISub", 235, true, true, false},
314 {"OpAtomicSMin", 236, true, true, false},
315 {"OpAtomicUMin", 237, true, true, false},
316 {"OpAtomicSMax", 238, true, true, false},
317 {"OpAtomicUMax", 239, true, true, false},
318 {"OpAtomicAnd", 240, true, true, false},
319 {"OpAtomicOr", 241, true, true, false},
320 {"OpAtomicXor", 242, true, true, false},
321 {"OpPhi", 245, true, true, false},
322 {"OpLoopMerge", 246, false, false, false},
323 {"OpSelectionMerge", 247, false, false, false},
324 {"OpLabel", 248, true, false, false},
325 {"OpBranch", 249, false, false, false},
326 {"OpBranchConditional", 250, false, false, false},
327 {"OpSwitch", 251, false, false, false},
328 {"OpKill", 252, false, false, false},
329 {"OpReturn", 253, false, false, false},
330 {"OpReturnValue", 254, false, false, false},
331 {"OpUnreachable", 255, false, false, false},
332 {"OpLifetimeStart", 256, false, false, false},
333 {"OpLifetimeStop", 257, false, false, false},
334 {"OpGroupAsyncCopy", 259, true, true, false},
335 {"OpGroupWaitEvents", 260, false, false, false},
336 {"OpGroupAll", 261, true, true, false},
337 {"OpGroupAny", 262, true, true, false},
338 {"OpGroupBroadcast", 263, true, true, false},
339 {"OpGroupIAdd", 264, true, true, false},
340 {"OpGroupFAdd", 265, true, true, false},
341 {"OpGroupFMin", 266, true, true, false},
342 {"OpGroupUMin", 267, true, true, false},
343 {"OpGroupSMin", 268, true, true, false},
344 {"OpGroupFMax", 269, true, true, false},
345 {"OpGroupUMax", 270, true, true, false},
346 {"OpGroupSMax", 271, true, true, false},
347 {"OpReadPipe", 274, true, true, false},
348 {"OpWritePipe", 275, true, true, false},
349 {"OpReservedReadPipe", 276, true, true, false},
350 {"OpReservedWritePipe", 277, true, true, false},
351 {"OpReserveReadPipePackets", 278, true, true, false},
352 {"OpReserveWritePipePackets", 279, true, true, false},
353 {"OpCommitReadPipe", 280, false, false, false},
354 {"OpCommitWritePipe", 281, false, false, false},
355 {"OpIsValidReserveId", 282, true, true, false},
356 {"OpGetNumPipePackets", 283, true, true, false},
357 {"OpGetMaxPipePackets", 284, true, true, false},
358 {"OpGroupReserveReadPipePackets", 285, true, true, false},
359 {"OpGroupReserveWritePipePackets", 286, true, true, false},
360 {"OpGroupCommitReadPipe", 287, false, false, false},
361 {"OpGroupCommitWritePipe", 288, false, false, false},
362 {"OpEnqueueMarker", 291, true, true, false},
363 {"OpEnqueueKernel", 292, true, true, false},
364 {"OpGetKernelNDrangeSubGroupCount", 293, true, true, false},
365 {"OpGetKernelNDrangeMaxSubGroupSize", 294, true, true, false},
366 {"OpGetKernelWorkGroupSize", 295, true, true, false},
367 {"OpGetKernelPreferredWorkGroupSizeMultiple", 296, true, true, false},
368 {"OpRetainEvent", 297, false, false, false},
369 {"OpReleaseEvent", 298, false, false, false},
370 {"OpCreateUserEvent", 299, true, true, false},
371 {"OpIsValidEvent", 300, true, true, false},
372 {"OpSetUserEventStatus", 301, false, false, false},
373 {"OpCaptureEventProfilingInfo", 302, false, false, false},
374 {"OpGetDefaultQueue", 303, true, true, false},
375 {"OpBuildNDRange", 304, true, true, false},
376 {"OpImageSparseSampleImplicitLod", 305, true, true, false},
377 {"OpImageSparseSampleExplicitLod", 306, true, true, false},
378 {"OpImageSparseSampleDrefImplicitLod", 307, true, true, false},
379 {"OpImageSparseSampleDrefExplicitLod", 308, true, true, false},
380 {"OpImageSparseSampleProjImplicitLod", 309, true, true, false},
381 {"OpImageSparseSampleProjExplicitLod", 310, true, true, false},
382 {"OpImageSparseSampleProjDrefImplicitLod", 311, true, true, false},
383 {"OpImageSparseSampleProjDrefExplicitLod", 312, true, true, false},
384 {"OpImageSparseFetch", 313, true, true, false},
385 {"OpImageSparseGather", 314, true, true, false},
386 {"OpImageSparseDrefGather", 315, true, true, false},
387 {"OpImageSparseTexelsResident", 316, true, true, false},
388 {"OpNoLine", 317, false, false, false},
389 {"OpAtomicFlagTestAndSet", 318, true, true, false},
390 {"OpAtomicFlagClear", 319, false, false, false},
391 {"OpImageSparseRead", 320, true, true, false},
392 {"OpSizeOf", 321, true, true, false},
393 {"OpTypePipeStorage", 322, true, false, false},
394 {"OpConstantPipeStorage", 323, true, true, false},
395 {"OpCreatePipeFromPipeStorage", 324, true, true, false},
396 {"OpGetKernelLocalSizeForSubgroupCount", 325, true, true, false},
397 {"OpGetKernelMaxNumSubgroups", 326, true, true, false},
398 {"OpTypeNamedBarrier", 327, true, false, false},
399 {"OpNamedBarrierInitialize", 328, true, true, false},
400 {"OpMemoryNamedBarrier", 329, false, false, false},
401 {"OpModuleProcessed", 330, false, false, false},
402 {"OpExecutionModeId", 331, false, false, false},
403 {"OpDecorateId", 332, false, false, false},
404 {"OpSubgroupBallotKHR", 4421, true, true, false},
405 {"OpSubgroupFirstInvocationKHR", 4422, true, true, false},
406 {"OpSubgroupReadInvocationKHR", 4432, true, true, false},
407 {"OpGroupIAddNonUniformAMD", 5000, true, true, false},
408 {"OpGroupFAddNonUniformAMD", 5001, true, true, false},
409 {"OpGroupFMinNonUniformAMD", 5002, true, true, false},
410 {"OpGroupUMinNonUniformAMD", 5003, true, true, false},
411 {"OpGroupSMinNonUniformAMD", 5004, true, true, false},
412 {"OpGroupFMaxNonUniformAMD", 5005, true, true, false},
413 {"OpGroupUMaxNonUniformAMD", 5006, true, true, false},
414 {"OpGroupSMaxNonUniformAMD", 5007, true, true, false}};
415 #pragma GCC diagnostic pop
416 static const SPIRVOpCode OP_CODE_NULL{};
417 const SPIRVOpCode& FindOpCode( uint32_t code )
419 for( auto&& opcode : OP_CODE_ARRAY )
421 if( opcode.code == code )
429 } // namespace Vulkan
430 } // namespace Graphics
433 #endif //DALI_GRAPHICS_VULKAN_SPIRV_SPIRV_OPCODES_H