wren
Vulkan-based game engine
Loading...
Searching...
No Matches
spirv.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <spirv/1.2/spirv.hpp>
4#include <system_error>
5#include <tl/expected.hpp>
6#include <vulkan/vulkan.hpp>
7#include <vulkan/vulkan_enums.hpp>
8
9namespace wren::reflect {
10
11using spirv_t = std::vector<uint32_t>;
12
14 spv::ExecutionModel const &execution_model)
15 -> tl::expected<VK_NS::ShaderStageFlagBits, std::error_code> {
16 switch (execution_model) {
17 case spv::ExecutionModelVertex:
18 return VK_NS::ShaderStageFlagBits::eVertex;
19 case spv::ExecutionModelTessellationControl:
20 return VK_NS::ShaderStageFlagBits::eTessellationControl;
21 case spv::ExecutionModelTessellationEvaluation:
22 return VK_NS::ShaderStageFlagBits::eTessellationEvaluation;
23 case spv::ExecutionModelGeometry:
24 return VK_NS::ShaderStageFlagBits::eGeometry;
25 case spv::ExecutionModelFragment:
26 return VK_NS::ShaderStageFlagBits::eFragment;
27 case spv::ExecutionModelGLCompute:
28 return VK_NS::ShaderStageFlagBits::eCompute;
29 default:
30 return tl::make_unexpected(
31 std::make_error_code(std::errc::invalid_argument));
32 }
33}
34
35} // namespace wren::reflect
36
37namespace spv {
38
39auto to_string(spv::StorageClass storage_class) {
40 switch (storage_class) {
41 case StorageClassUniformConstant:
42 case StorageClassInput:
43 return "input";
44 case StorageClassUniform:
45 case StorageClassOutput:
46 return "output";
47 case StorageClassWorkgroup:
48 case StorageClassCrossWorkgroup:
49 case StorageClassPrivate:
50 case StorageClassFunction:
51 case StorageClassGeneric:
52 case StorageClassPushConstant:
53 case StorageClassAtomicCounter:
54 case StorageClassImage:
55 case StorageClassStorageBuffer:
56 case StorageClassMax:
57 break;
58 }
59 return "";
60}
61
62auto to_string(spv::Op op) {
63 switch (op) {
64 case spv::OpNop:
65 case spv::OpUndef:
66 case spv::OpSourceContinued:
67 case spv::OpSource:
68 case spv::OpSourceExtension:
69 case spv::OpName:
70 case spv::OpMemberName:
71 case spv::OpString:
72 case spv::OpLine:
73 case spv::OpExtension:
74 case spv::OpExtInstImport:
75 case spv::OpExtInst:
76 case spv::OpMemoryModel:
77 case spv::OpEntryPoint:
78 return "OpEntryPoint";
79 case spv::OpExecutionMode:
80 case spv::OpCapability:
81 case spv::OpTypeVoid:
82 return "OpTypeVoid";
83 case spv::OpTypeBool:
84 return "OpTypeBool";
85 case spv::OpTypeInt:
86 return "OpTypeInt";
87 case spv::OpTypeFloat:
88 return "OpTypeFloat";
89 case spv::OpTypeVector:
90 return "OpTypeVector";
91 case spv::OpTypeMatrix:
92 case spv::OpTypeImage:
93 case spv::OpTypeSampler:
94 case spv::OpTypeSampledImage:
95 case spv::OpTypeArray:
96 case spv::OpTypeRuntimeArray:
97 case spv::OpTypeStruct:
98 case spv::OpTypeOpaque:
99 case spv::OpTypePointer:
100 return "OpTypePointer";
101 case spv::OpTypeFunction:
102 case spv::OpTypeEvent:
103 case spv::OpTypeDeviceEvent:
104 case spv::OpTypeReserveId:
105 case spv::OpTypeQueue:
106 case spv::OpTypePipe:
107 case spv::OpTypeForwardPointer:
108 case spv::OpConstantTrue:
109 case spv::OpConstantFalse:
110 case spv::OpConstant:
111 case spv::OpConstantComposite:
112 case spv::OpConstantSampler:
113 case spv::OpConstantNull:
114 case spv::OpSpecConstantTrue:
115 case spv::OpSpecConstantFalse:
116 case spv::OpSpecConstant:
117 case spv::OpSpecConstantComposite:
118 case spv::OpSpecConstantOp:
119 case spv::OpFunction:
120 case spv::OpFunctionParameter:
121 case spv::OpFunctionEnd:
122 case spv::OpFunctionCall:
123 case spv::OpVariable:
124 return "OpVariable";
125 case spv::OpImageTexelPointer:
126 case spv::OpLoad:
127 case spv::OpStore:
128 case spv::OpCopyMemory:
129 case spv::OpCopyMemorySized:
130 case spv::OpAccessChain:
131 case spv::OpInBoundsAccessChain:
132 case spv::OpPtrAccessChain:
133 case spv::OpArrayLength:
134 case spv::OpGenericPtrMemSemantics:
135 case spv::OpInBoundsPtrAccessChain:
136 case spv::OpDecorate:
137 case spv::OpMemberDecorate:
138 case spv::OpDecorationGroup:
139 case spv::OpGroupDecorate:
140 case spv::OpGroupMemberDecorate:
141 case spv::OpVectorExtractDynamic:
142 case spv::OpVectorInsertDynamic:
143 case spv::OpVectorShuffle:
144 case spv::OpCompositeConstruct:
145 case spv::OpCompositeExtract:
146 case spv::OpCompositeInsert:
147 case spv::OpCopyObject:
148 case spv::OpTranspose:
149 case spv::OpSampledImage:
150 case spv::OpImageSampleImplicitLod:
151 case spv::OpImageSampleExplicitLod:
152 case spv::OpImageSampleDrefImplicitLod:
153 case spv::OpImageSampleDrefExplicitLod:
154 case spv::OpImageSampleProjImplicitLod:
155 case spv::OpImageSampleProjExplicitLod:
156 case spv::OpImageSampleProjDrefImplicitLod:
157 case spv::OpImageSampleProjDrefExplicitLod:
158 case spv::OpImageFetch:
159 case spv::OpImageGather:
160 case spv::OpImageDrefGather:
161 case spv::OpImageRead:
162 case spv::OpImageWrite:
163 case spv::OpImage:
164 case spv::OpImageQueryFormat:
165 case spv::OpImageQueryOrder:
166 case spv::OpImageQuerySizeLod:
167 case spv::OpImageQuerySize:
168 case spv::OpImageQueryLod:
169 case spv::OpImageQueryLevels:
170 case spv::OpImageQuerySamples:
171 case spv::OpConvertFToU:
172 case spv::OpConvertFToS:
173 case spv::OpConvertSToF:
174 case spv::OpConvertUToF:
175 case spv::OpUConvert:
176 case spv::OpSConvert:
177 case spv::OpFConvert:
178 case spv::OpQuantizeToF16:
179 case spv::OpConvertPtrToU:
180 case spv::OpSatConvertSToU:
181 case spv::OpSatConvertUToS:
182 case spv::OpConvertUToPtr:
183 case spv::OpPtrCastToGeneric:
184 case spv::OpGenericCastToPtr:
185 case spv::OpGenericCastToPtrExplicit:
186 case spv::OpBitcast:
187 case spv::OpSNegate:
188 case spv::OpFNegate:
189 case spv::OpIAdd:
190 case spv::OpFAdd:
191 case spv::OpISub:
192 case spv::OpFSub:
193 case spv::OpIMul:
194 case spv::OpFMul:
195 case spv::OpUDiv:
196 case spv::OpSDiv:
197 case spv::OpFDiv:
198 case spv::OpUMod:
199 case spv::OpSRem:
200 case spv::OpSMod:
201 case spv::OpFRem:
202 case spv::OpFMod:
203 case spv::OpVectorTimesScalar:
204 case spv::OpMatrixTimesScalar:
205 case spv::OpVectorTimesMatrix:
206 case spv::OpMatrixTimesVector:
207 case spv::OpMatrixTimesMatrix:
208 case spv::OpOuterProduct:
209 case spv::OpDot:
210 case spv::OpIAddCarry:
211 case spv::OpISubBorrow:
212 case spv::OpUMulExtended:
213 case spv::OpSMulExtended:
214 case spv::OpAny:
215 case spv::OpAll:
216 case spv::OpIsNan:
217 case spv::OpIsInf:
218 case spv::OpIsFinite:
219 case spv::OpIsNormal:
220 case spv::OpSignBitSet:
221 case spv::OpLessOrGreater:
222 case spv::OpOrdered:
223 case spv::OpUnordered:
224 case spv::OpLogicalEqual:
225 case spv::OpLogicalNotEqual:
226 case spv::OpLogicalOr:
227 case spv::OpLogicalAnd:
228 case spv::OpLogicalNot:
229 case spv::OpSelect:
230 case spv::OpIEqual:
231 case spv::OpINotEqual:
232 case spv::OpUGreaterThan:
233 case spv::OpSGreaterThan:
234 case spv::OpUGreaterThanEqual:
235 case spv::OpSGreaterThanEqual:
236 case spv::OpULessThan:
237 case spv::OpSLessThan:
238 case spv::OpULessThanEqual:
239 case spv::OpSLessThanEqual:
240 case spv::OpFOrdEqual:
241 case spv::OpFUnordEqual:
242 case spv::OpFOrdNotEqual:
243 case spv::OpFUnordNotEqual:
244 case spv::OpFOrdLessThan:
245 case spv::OpFUnordLessThan:
246 case spv::OpFOrdGreaterThan:
247 case spv::OpFUnordGreaterThan:
248 case spv::OpFOrdLessThanEqual:
249 case spv::OpFUnordLessThanEqual:
250 case spv::OpFOrdGreaterThanEqual:
251 case spv::OpFUnordGreaterThanEqual:
252 case spv::OpShiftRightLogical:
253 case spv::OpShiftRightArithmetic:
254 case spv::OpShiftLeftLogical:
255 case spv::OpBitwiseOr:
256 case spv::OpBitwiseXor:
257 case spv::OpBitwiseAnd:
258 case spv::OpNot:
259 case spv::OpBitFieldInsert:
260 case spv::OpBitFieldSExtract:
261 case spv::OpBitFieldUExtract:
262 case spv::OpBitReverse:
263 case spv::OpBitCount:
264 case spv::OpDPdx:
265 case spv::OpDPdy:
266 case spv::OpFwidth:
267 case spv::OpDPdxFine:
268 case spv::OpDPdyFine:
269 case spv::OpFwidthFine:
270 case spv::OpDPdxCoarse:
271 case spv::OpDPdyCoarse:
272 case spv::OpFwidthCoarse:
273 case spv::OpEmitVertex:
274 case spv::OpEndPrimitive:
275 case spv::OpEmitStreamVertex:
276 case spv::OpEndStreamPrimitive:
277 case spv::OpControlBarrier:
278 case spv::OpMemoryBarrier:
279 case spv::OpAtomicLoad:
280 case spv::OpAtomicStore:
281 case spv::OpAtomicExchange:
282 case spv::OpAtomicCompareExchange:
283 case spv::OpAtomicCompareExchangeWeak:
284 case spv::OpAtomicIIncrement:
285 case spv::OpAtomicIDecrement:
286 case spv::OpAtomicIAdd:
287 case spv::OpAtomicISub:
288 case spv::OpAtomicSMin:
289 case spv::OpAtomicUMin:
290 case spv::OpAtomicSMax:
291 case spv::OpAtomicUMax:
292 case spv::OpAtomicAnd:
293 case spv::OpAtomicOr:
294 case spv::OpAtomicXor:
295 case spv::OpPhi:
296 case spv::OpLoopMerge:
297 case spv::OpSelectionMerge:
298 case spv::OpLabel:
299 case spv::OpBranch:
300 case spv::OpBranchConditional:
301 case spv::OpSwitch:
302 case spv::OpKill:
303 case spv::OpReturn:
304 case spv::OpReturnValue:
305 case spv::OpUnreachable:
306 case spv::OpLifetimeStart:
307 case spv::OpLifetimeStop:
308 case spv::OpGroupAsyncCopy:
309 case spv::OpGroupWaitEvents:
310 case spv::OpGroupAll:
311 case spv::OpGroupAny:
312 case spv::OpGroupBroadcast:
313 case spv::OpGroupIAdd:
314 case spv::OpGroupFAdd:
315 case spv::OpGroupFMin:
316 case spv::OpGroupUMin:
317 case spv::OpGroupSMin:
318 case spv::OpGroupFMax:
319 case spv::OpGroupUMax:
320 case spv::OpGroupSMax:
321 case spv::OpReadPipe:
322 case spv::OpWritePipe:
323 case spv::OpReservedReadPipe:
324 case spv::OpReservedWritePipe:
325 case spv::OpReserveReadPipePackets:
326 case spv::OpReserveWritePipePackets:
327 case spv::OpCommitReadPipe:
328 case spv::OpCommitWritePipe:
329 case spv::OpIsValidReserveId:
330 case spv::OpGetNumPipePackets:
331 case spv::OpGetMaxPipePackets:
332 case spv::OpGroupReserveReadPipePackets:
333 case spv::OpGroupReserveWritePipePackets:
334 case spv::OpGroupCommitReadPipe:
335 case spv::OpGroupCommitWritePipe:
336 case spv::OpEnqueueMarker:
337 case spv::OpEnqueueKernel:
338 case spv::OpGetKernelNDrangeSubGroupCount:
339 case spv::OpGetKernelNDrangeMaxSubGroupSize:
340 case spv::OpGetKernelWorkGroupSize:
341 case spv::OpGetKernelPreferredWorkGroupSizeMultiple:
342 case spv::OpRetainEvent:
343 case spv::OpReleaseEvent:
344 case spv::OpCreateUserEvent:
345 case spv::OpIsValidEvent:
346 case spv::OpSetUserEventStatus:
347 case spv::OpCaptureEventProfilingInfo:
348 case spv::OpGetDefaultQueue:
349 case spv::OpBuildNDRange:
350 case spv::OpImageSparseSampleImplicitLod:
351 case spv::OpImageSparseSampleExplicitLod:
352 case spv::OpImageSparseSampleDrefImplicitLod:
353 case spv::OpImageSparseSampleDrefExplicitLod:
354 case spv::OpImageSparseSampleProjImplicitLod:
355 case spv::OpImageSparseSampleProjExplicitLod:
356 case spv::OpImageSparseSampleProjDrefImplicitLod:
357 case spv::OpImageSparseSampleProjDrefExplicitLod:
358 case spv::OpImageSparseFetch:
359 case spv::OpImageSparseGather:
360 case spv::OpImageSparseDrefGather:
361 case spv::OpImageSparseTexelsResident:
362 case spv::OpNoLine:
363 case spv::OpAtomicFlagTestAndSet:
364 case spv::OpAtomicFlagClear:
365 case spv::OpImageSparseRead:
366 case spv::OpSizeOf:
367 case spv::OpTypePipeStorage:
368 case spv::OpConstantPipeStorage:
369 case spv::OpCreatePipeFromPipeStorage:
370 case spv::OpGetKernelLocalSizeForSubgroupCount:
371 case spv::OpGetKernelMaxNumSubgroups:
372 case spv::OpTypeNamedBarrier:
373 case spv::OpNamedBarrierInitialize:
374 case spv::OpMemoryNamedBarrier:
375 case spv::OpModuleProcessed:
376 case spv::OpExecutionModeId:
377 case spv::OpDecorateId:
378 case spv::OpSubgroupBallotKHR:
379 case spv::OpSubgroupFirstInvocationKHR:
380 case spv::OpSubgroupAllKHR:
381 case spv::OpSubgroupAnyKHR:
382 case spv::OpSubgroupAllEqualKHR:
383 case spv::OpSubgroupReadInvocationKHR:
384 case spv::OpGroupIAddNonUniformAMD:
385 case spv::OpGroupFAddNonUniformAMD:
386 case spv::OpGroupFMinNonUniformAMD:
387 case spv::OpGroupUMinNonUniformAMD:
388 case spv::OpGroupSMinNonUniformAMD:
389 case spv::OpGroupFMaxNonUniformAMD:
390 case spv::OpGroupUMaxNonUniformAMD:
391 case spv::OpGroupSMaxNonUniformAMD:
392 case spv::OpFragmentMaskFetchAMD:
393 case spv::OpFragmentFetchAMD:
394 case spv::OpSubgroupShuffleINTEL:
395 case spv::OpSubgroupShuffleDownINTEL:
396 case spv::OpSubgroupShuffleUpINTEL:
397 case spv::OpSubgroupShuffleXorINTEL:
398 case spv::OpSubgroupBlockReadINTEL:
399 case spv::OpSubgroupBlockWriteINTEL:
400 case spv::OpSubgroupImageBlockReadINTEL:
401 case spv::OpSubgroupImageBlockWriteINTEL:
402 case spv::OpDecorateStringGOOGLE:
403 case spv::OpMemberDecorateStringGOOGLE:
404 case spv::OpMax:
405 break;
406 }
407 return "";
408}
409} // namespace spv
Definition spirv.hpp:37
auto to_string(spv::StorageClass storage_class)
Definition spirv.hpp:39
Definition parser.hpp:11
std::vector< uint32_t > spirv_t
Definition parser.hpp:26
auto get_vk_shader_stage(spv::ExecutionModel const &execution_model) -> tl::expected< VK_NS::ShaderStageFlagBits, std::error_code >
Definition spirv.hpp:13