81cd2e065c0379c18700f0f63b0da45646bfb4a8
[platform/core/uifw/dali-core.git] / dali / graphics / vulkan / spirv / vulkan-spirv-opcode.h
1 /*
2  * Copyright (c) 2018 Samsung Electronics Co., Ltd.
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  *
16  */
17
18 #ifndef DALI_GRAPHICS_VULKAN_SPIRV_SPIRV_OPCODES_H
19 #define DALI_GRAPHICS_VULKAN_SPIRV_SPIRV_OPCODES_H
20
21 namespace Dali
22 {
23 namespace Graphics
24 {
25 namespace Vulkan
26 {
27 namespace SpirV
28 {
29 struct SPIRVOpCode
30 {
31   std::string name{"OpNull"};
32   uint32_t    code{static_cast<uint32_t>( -1u )};
33   bool        hasResult{false};
34   bool        hasResultType{false};
35   bool        isType{false};
36   bool        isTrivial{false}; // trivial types do not reference to any other result
37
38   /** Defines local data */
39   struct LocalData
40   {
41     uint32_t* start{nullptr};
42     uint32_t  count{0u};
43     uint32_t  resultId{0u};
44     int32_t   resultType{-1};
45   };
46
47   LocalData localData{};
48
49   bool operator!=( const SPIRVOpCode& opcode ) const
50   {
51     return opcode.code != code;
52   }
53
54   bool operator==( const SPIRVOpCode& opcode ) const
55   {
56     return opcode.code == code;
57   }
58
59   bool operator==( SpvOp op ) const
60   {
61     return ( code == static_cast<uint32_t>(op) );
62   }
63
64   template<class T>
65   T GetParameter( uint32_t index ) const
66   {
67     return static_cast<T>( *( localData.start + index + 1 ) );
68   }
69
70   uint32_t GetParameterU32( uint32_t index ) const
71   {
72     return GetParameter<uint32_t>( index );
73   }
74
75   std::string GetParameterAsString( uint32_t index ) const
76   {
77     return reinterpret_cast<const char*>( localData.start + index + 1 );
78   }
79
80   template<class T>
81   T operator[]( uint32_t index ) const
82   {
83     return GetParameter<T>( index );
84   }
85
86   SPIRVOpCode()  = default;
87   ~SPIRVOpCode() = default;
88 };
89
90 namespace
91 {
92 #pragma GCC diagnostic push
93 #pragma GCC diagnostic ignored "-Wlarger-than="
94 /**
95  * List of all the SPIR-V opcodes
96  * OpCodes describing types: 19-39
97  */
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 )
418 {
419   for( auto&& opcode : OP_CODE_ARRAY )
420   {
421     if( opcode.code == code )
422       return opcode;
423   }
424   return OP_CODE_NULL;
425 }
426
427 } // namespace
428 } // namespace SpirV
429 } // namespace Vulkan
430 } // namespace Graphics
431 } // namespace Dali
432
433 #endif //DALI_GRAPHICS_VULKAN_SPIRV_SPIRV_OPCODES_H