SPARK  0.1.0
A general purpose game engine written in C++.
Loading...
Searching...
No Matches
Conversions.h
1#pragma once
2
3#include "spark/render/Buffer.h"
4#include "spark/render/Image.h"
5#include "spark/render/InputAssembler.h"
6#include "spark/render/Rasterizer.h"
7#include "spark/render/RenderTarget.h"
8#include "spark/render/ShaderStages.h"
9#include "spark/render/vk/Export.h"
10
11#include "spark/base/Exception.h"
12
13#include "vulkan/vulkan.h"
14
15namespace spark::render::vk::conversions
16{
25 [[nodiscard]] SPARK_RENDER_VK_EXPORT constexpr VkImageViewType to_image_view(const ImageDimensions dimension, const unsigned layers)
26 {
27 switch (dimension)
28 {
29 case ImageDimensions::DIM_1:
30 return layers == 1 ? VkImageViewType::VK_IMAGE_VIEW_TYPE_1D : VkImageViewType::VK_IMAGE_VIEW_TYPE_1D_ARRAY;
31 case ImageDimensions::DIM_2:
32 return layers == 1 ? VkImageViewType::VK_IMAGE_VIEW_TYPE_2D : VkImageViewType::VK_IMAGE_VIEW_TYPE_2D_ARRAY;
33 case ImageDimensions::DIM_3:
34 return VkImageViewType::VK_IMAGE_VIEW_TYPE_3D;
35 case ImageDimensions::CUBE:
36 return VkImageViewType::VK_IMAGE_VIEW_TYPE_CUBE;
37 }
38 throw base::BadArgumentException("Unsupported image dimension.");
39 }
40
48 [[nodiscard]] SPARK_RENDER_VK_EXPORT constexpr VkFormat to_format(const Format format)
49 {
50 switch (format)
51 {
52 case Format::R4G4_UNORM:
53 return VK_FORMAT_R4G4_UNORM_PACK8;
54 case Format::R4G4B4A4_UNORM:
55 return VK_FORMAT_R4G4B4A4_UNORM_PACK16;
56 case Format::B4G4R4A4_UNORM:
57 return VK_FORMAT_B4G4R4A4_UNORM_PACK16;
58 case Format::R5G6B5_UNORM:
59 return VK_FORMAT_R5G6B5_UNORM_PACK16;
60 case Format::B5G6R5_UNORM:
61 return VK_FORMAT_B5G6R5_UNORM_PACK16;
62 case Format::R5G5B5A1_UNORM:
63 return VK_FORMAT_R5G5B5A1_UNORM_PACK16;
64 case Format::B5G5R5A1_UNORM:
65 return VK_FORMAT_B5G5R5A1_UNORM_PACK16;
66 case Format::A1R5G5B5_UNORM:
67 return VK_FORMAT_A1R5G5B5_UNORM_PACK16;
68 case Format::R8_UNORM:
69 return VK_FORMAT_R8_UNORM;
70 case Format::R8_SNORM:
71 return VK_FORMAT_R8_SNORM;
72 case Format::R8_USCALED:
73 return VK_FORMAT_R8_USCALED;
74 case Format::R8_SSCALED:
75 return VK_FORMAT_R8_SSCALED;
76 case Format::R8_UINT:
77 return VK_FORMAT_R8_UINT;
78 case Format::R8_SINT:
79 return VK_FORMAT_R8_SINT;
80 case Format::R8_SRGB:
81 return VK_FORMAT_R8_SRGB;
82 case Format::R8G8_UNORM:
83 return VK_FORMAT_R8G8_UNORM;
84 case Format::R8G8_SNORM:
85 return VK_FORMAT_R8G8_SNORM;
86 case Format::R8G8_USCALED:
87 return VK_FORMAT_R8G8_USCALED;
88 case Format::R8G8_SSCALED:
89 return VK_FORMAT_R8G8_SSCALED;
90 case Format::R8G8_UINT:
91 return VK_FORMAT_R8G8_UINT;
92 case Format::R8G8_SINT:
93 return VK_FORMAT_R8G8_SINT;
94 case Format::R8G8_SRGB:
95 return VK_FORMAT_R8G8_SRGB;
96 case Format::R8G8B8_UNORM:
97 return VK_FORMAT_R8G8B8_UNORM;
98 case Format::R8G8B8_SNORM:
99 return VK_FORMAT_R8G8B8_SNORM;
100 case Format::R8G8B8_USCALED:
101 return VK_FORMAT_R8G8B8_USCALED;
102 case Format::R8G8B8_SSCALED:
103 return VK_FORMAT_R8G8B8_SSCALED;
104 case Format::R8G8B8_UINT:
105 return VK_FORMAT_R8G8B8_UINT;
106 case Format::R8G8B8_SINT:
107 return VK_FORMAT_R8G8B8_SINT;
108 case Format::R8G8B8_SRGB:
109 return VK_FORMAT_R8G8B8_SRGB;
110 case Format::B8G8R8_UNORM:
111 return VK_FORMAT_B8G8R8_UNORM;
112 case Format::B8G8R8_SNORM:
113 return VK_FORMAT_B8G8R8_SNORM;
114 case Format::B8G8R8_USCALED:
115 return VK_FORMAT_B8G8R8_USCALED;
116 case Format::B8G8R8_SSCALED:
117 return VK_FORMAT_B8G8R8_SSCALED;
118 case Format::B8G8R8_UINT:
119 return VK_FORMAT_B8G8R8_UINT;
120 case Format::B8G8R8_SINT:
121 return VK_FORMAT_B8G8R8_SINT;
122 case Format::B8G8R8_SRGB:
123 return VK_FORMAT_B8G8R8_SRGB;
124 case Format::R8G8B8A8_UNORM:
125 return VK_FORMAT_R8G8B8A8_UNORM;
126 case Format::R8G8B8A8_SNORM:
127 return VK_FORMAT_R8G8B8A8_SNORM;
128 case Format::R8G8B8A8_USCALED:
129 return VK_FORMAT_R8G8B8A8_USCALED;
130 case Format::R8G8B8A8_SSCALED:
131 return VK_FORMAT_R8G8B8A8_SSCALED;
132 case Format::R8G8B8A8_UINT:
133 return VK_FORMAT_R8G8B8A8_UINT;
134 case Format::R8G8B8A8_SINT:
135 return VK_FORMAT_R8G8B8A8_SINT;
136 case Format::R8G8B8A8_SRGB:
137 return VK_FORMAT_R8G8B8A8_SRGB;
138 case Format::B8G8R8A8_UNORM:
139 return VK_FORMAT_B8G8R8A8_UNORM;
140 case Format::B8G8R8A8_SNORM:
141 return VK_FORMAT_B8G8R8A8_SNORM;
142 case Format::B8G8R8A8_USCALED:
143 return VK_FORMAT_B8G8R8A8_USCALED;
144 case Format::B8G8R8A8_SSCALED:
145 return VK_FORMAT_B8G8R8A8_SSCALED;
146 case Format::B8G8R8A8_UINT:
147 return VK_FORMAT_B8G8R8A8_UINT;
148 case Format::B8G8R8A8_SINT:
149 return VK_FORMAT_B8G8R8A8_SINT;
150 case Format::B8G8R8A8_SRGB:
151 return VK_FORMAT_B8G8R8A8_SRGB;
152 case Format::A8B8G8R8_UNORM:
153 return VK_FORMAT_A8B8G8R8_UNORM_PACK32;
154 case Format::A8B8G8R8_SNORM:
155 return VK_FORMAT_A8B8G8R8_SNORM_PACK32;
156 case Format::A8B8G8R8_USCALED:
157 return VK_FORMAT_A8B8G8R8_USCALED_PACK32;
158 case Format::A8B8G8R8_SSCALED:
159 return VK_FORMAT_A8B8G8R8_SSCALED_PACK32;
160 case Format::A8B8G8R8_UINT:
161 return VK_FORMAT_A8B8G8R8_UINT_PACK32;
162 case Format::A8B8G8R8_SINT:
163 return VK_FORMAT_A8B8G8R8_SINT_PACK32;
164 case Format::A8B8G8R8_SRGB:
165 return VK_FORMAT_A8B8G8R8_SRGB_PACK32;
166 case Format::A2R10G10B10_UNORM:
167 return VK_FORMAT_A2R10G10B10_UNORM_PACK32;
168 case Format::A2R10G10B10_SNORM:
169 return VK_FORMAT_A2R10G10B10_SNORM_PACK32;
170 case Format::A2R10G10B10_USCALED:
171 return VK_FORMAT_A2R10G10B10_USCALED_PACK32;
172 case Format::A2R10G10B10_SSCALED:
173 return VK_FORMAT_A2R10G10B10_SSCALED_PACK32;
174 case Format::A2R10G10B10_UINT:
175 return VK_FORMAT_A2R10G10B10_UINT_PACK32;
176 case Format::A2R10G10B10_SINT:
177 return VK_FORMAT_A2R10G10B10_SINT_PACK32;
178 case Format::A2B10G10R10_UNORM:
179 return VK_FORMAT_A2B10G10R10_UNORM_PACK32;
180 case Format::A2B10G10R10_SNORM:
181 return VK_FORMAT_A2B10G10R10_SNORM_PACK32;
182 case Format::A2B10G10R10_USCALED:
183 return VK_FORMAT_A2B10G10R10_USCALED_PACK32;
184 case Format::A2B10G10R10_SSCALED:
185 return VK_FORMAT_A2B10G10R10_SSCALED_PACK32;
186 case Format::A2B10G10R10_UINT:
187 return VK_FORMAT_A2B10G10R10_UINT_PACK32;
188 case Format::A2B10G10R10_SINT:
189 return VK_FORMAT_A2B10G10R10_SINT_PACK32;
190 case Format::R16_UNORM:
191 return VK_FORMAT_R16_UNORM;
192 case Format::R16_SNORM:
193 return VK_FORMAT_R16_SNORM;
194 case Format::R16_USCALED:
195 return VK_FORMAT_R16_USCALED;
196 case Format::R16_SSCALED:
197 return VK_FORMAT_R16_SSCALED;
198 case Format::R16_UINT:
199 return VK_FORMAT_R16_UINT;
200 case Format::R16_SINT:
201 return VK_FORMAT_R16_SINT;
202 case Format::R16_SFLOAT:
203 return VK_FORMAT_R16_SFLOAT;
204 case Format::R16G16_UNORM:
205 return VK_FORMAT_R16G16_UNORM;
206 case Format::R16G16_SNORM:
207 return VK_FORMAT_R16G16_SNORM;
208 case Format::R16G16_USCALED:
209 return VK_FORMAT_R16G16_USCALED;
210 case Format::R16G16_SSCALED:
211 return VK_FORMAT_R16G16_SSCALED;
212 case Format::R16G16_UINT:
213 return VK_FORMAT_R16G16_UINT;
214 case Format::R16G16_SINT:
215 return VK_FORMAT_R16G16_SINT;
216 case Format::R16G16_SFLOAT:
217 return VK_FORMAT_R16G16_SFLOAT;
218 case Format::R16G16B16_UNORM:
219 return VK_FORMAT_R16G16B16_UNORM;
220 case Format::R16G16B16_SNORM:
221 return VK_FORMAT_R16G16B16_SNORM;
222 case Format::R16G16B16_USCALED:
223 return VK_FORMAT_R16G16B16_USCALED;
224 case Format::R16G16B16_SSCALED:
225 return VK_FORMAT_R16G16B16_SSCALED;
226 case Format::R16G16B16_UINT:
227 return VK_FORMAT_R16G16B16_UINT;
228 case Format::R16G16B16_SINT:
229 return VK_FORMAT_R16G16B16_SINT;
230 case Format::R16G16B16_SFLOAT:
231 return VK_FORMAT_R16G16B16_SFLOAT;
232 case Format::R16G16B16A16_UNORM:
233 return VK_FORMAT_R16G16B16A16_UNORM;
234 case Format::R16G16B16A16_SNORM:
235 return VK_FORMAT_R16G16B16A16_SNORM;
236 case Format::R16G16B16A16_USCALED:
237 return VK_FORMAT_R16G16B16A16_USCALED;
238 case Format::R16G16B16A16_SSCALED:
239 return VK_FORMAT_R16G16B16A16_SSCALED;
240 case Format::R16G16B16A16_UINT:
241 return VK_FORMAT_R16G16B16A16_UINT;
242 case Format::R16G16B16A16_SINT:
243 return VK_FORMAT_R16G16B16A16_SINT;
244 case Format::R16G16B16A16_SFLOAT:
245 return VK_FORMAT_R16G16B16A16_SFLOAT;
246 case Format::R32_UINT:
247 return VK_FORMAT_R32_UINT;
248 case Format::R32_SINT:
249 return VK_FORMAT_R32_SINT;
250 case Format::R32_SFLOAT:
251 return VK_FORMAT_R32_SFLOAT;
252 case Format::R32G32_UINT:
253 return VK_FORMAT_R32G32_UINT;
254 case Format::R32G32_SINT:
255 return VK_FORMAT_R32G32_SINT;
256 case Format::R32G32_SFLOAT:
257 return VK_FORMAT_R32G32_SFLOAT;
258 case Format::R32G32B32_UINT:
259 return VK_FORMAT_R32G32B32_UINT;
260 case Format::R32G32B32_SINT:
261 return VK_FORMAT_R32G32B32_SINT;
262 case Format::R32G32B32_SFLOAT:
263 return VK_FORMAT_R32G32B32_SFLOAT;
264 case Format::R32G32B32A32_UINT:
265 return VK_FORMAT_R32G32B32A32_UINT;
266 case Format::R32G32B32A32_SINT:
267 return VK_FORMAT_R32G32B32A32_SINT;
268 case Format::R32G32B32A32_SFLOAT:
269 return VK_FORMAT_R32G32B32A32_SFLOAT;
270 case Format::R64_UINT:
271 return VK_FORMAT_R64_UINT;
272 case Format::R64_SINT:
273 return VK_FORMAT_R64_SINT;
274 case Format::R64_SFLOAT:
275 return VK_FORMAT_R64_SFLOAT;
276 case Format::R64G64_UINT:
277 return VK_FORMAT_R64G64_UINT;
278 case Format::R64G64_SINT:
279 return VK_FORMAT_R64G64_SINT;
280 case Format::R64G64_SFLOAT:
281 return VK_FORMAT_R64G64_SFLOAT;
282 case Format::R64G64B64_UINT:
283 return VK_FORMAT_R64G64B64_UINT;
284 case Format::R64G64B64_SINT:
285 return VK_FORMAT_R64G64B64_SINT;
286 case Format::R64G64B64_SFLOAT:
287 return VK_FORMAT_R64G64B64_SFLOAT;
288 case Format::R64G64B64A64_UINT:
289 return VK_FORMAT_R64G64B64A64_UINT;
290 case Format::R64G64B64A64_SINT:
291 return VK_FORMAT_R64G64B64A64_SINT;
292 case Format::R64G64B64A64_SFLOAT:
293 return VK_FORMAT_R64G64B64A64_SFLOAT;
294 case Format::B10G11R11_UFLOAT:
295 return VK_FORMAT_B10G11R11_UFLOAT_PACK32;
296 case Format::E5B9G9R9_UFLOAT:
297 return VK_FORMAT_E5B9G9R9_UFLOAT_PACK32;
298 case Format::D16_UNORM:
299 return VK_FORMAT_D16_UNORM;
300 case Format::X8_D24_UNORM:
301 return VK_FORMAT_X8_D24_UNORM_PACK32;
302 case Format::D32_SFLOAT:
303 return VK_FORMAT_D32_SFLOAT;
304 case Format::S8_UINT:
305 return VK_FORMAT_S8_UINT;
306 case Format::D16_UNORM_S8_UINT:
307 return VK_FORMAT_D16_UNORM_S8_UINT;
308 case Format::D24_UNORM_S8_UINT:
309 return VK_FORMAT_D24_UNORM_S8_UINT;
310 case Format::D32_SFLOAT_S8_UINT:
311 return VK_FORMAT_D32_SFLOAT_S8_UINT;
312 case Format::BC1_RGB_UNORM:
313 return VK_FORMAT_BC1_RGB_UNORM_BLOCK;
314 case Format::BC1_RGB_SRGB:
315 return VK_FORMAT_BC1_RGB_SRGB_BLOCK;
316 case Format::BC1_RGBA_UNORM:
317 return VK_FORMAT_BC1_RGBA_UNORM_BLOCK;
318 case Format::BC1_RGBA_SRGB:
319 return VK_FORMAT_BC1_RGBA_SRGB_BLOCK;
320 case Format::BC2_UNORM:
321 return VK_FORMAT_BC2_UNORM_BLOCK;
322 case Format::BC2_SRGB:
323 return VK_FORMAT_BC2_SRGB_BLOCK;
324 case Format::BC3_UNORM:
325 return VK_FORMAT_BC3_UNORM_BLOCK;
326 case Format::BC3_SRGB:
327 return VK_FORMAT_BC3_SRGB_BLOCK;
328 case Format::BC4_UNORM:
329 return VK_FORMAT_BC4_UNORM_BLOCK;
330 case Format::BC4_SNORM:
331 return VK_FORMAT_BC4_SNORM_BLOCK;
332 case Format::BC5_UNORM:
333 return VK_FORMAT_BC5_UNORM_BLOCK;
334 case Format::BC5_SNORM:
335 return VK_FORMAT_BC5_SNORM_BLOCK;
336 case Format::BC6H_UFLOAT:
337 return VK_FORMAT_BC6H_UFLOAT_BLOCK;
338 case Format::BC6H_SFLOAT:
339 return VK_FORMAT_BC6H_SFLOAT_BLOCK;
340 case Format::BC7_UNORM:
341 return VK_FORMAT_BC7_UNORM_BLOCK;
342 case Format::BC7_SRGB:
343 return VK_FORMAT_BC7_SRGB_BLOCK;
344 default:
345 break;
346 }
347 throw base::BadArgumentException("Unsupported format.");
348 }
349
355 [[nodiscard]] SPARK_RENDER_VK_EXPORT constexpr VkFormat to_format(const BufferFormat format)
356 {
357 switch (format)
358 {
359 case BufferFormat::X16F:
360 return VK_FORMAT_R16_SFLOAT;
361 case BufferFormat::X16I:
362 return VK_FORMAT_R16_SINT;
363 case BufferFormat::X16U:
364 return VK_FORMAT_R16_UINT;
365 case BufferFormat::XY16F:
366 return VK_FORMAT_R16G16_SFLOAT;
367 case BufferFormat::XY16I:
368 return VK_FORMAT_R16G16_SINT;
369 case BufferFormat::XY16U:
370 return VK_FORMAT_R16G16_UINT;
371 case BufferFormat::XYZ16F:
372 return VK_FORMAT_R16G16B16_SFLOAT;
373 case BufferFormat::XYZ16I:
374 return VK_FORMAT_R16G16B16_SINT;
375 case BufferFormat::XYZ16U:
376 return VK_FORMAT_R16G16B16_UINT;
377 case BufferFormat::XYZW16F:
378 return VK_FORMAT_R16G16B16A16_SFLOAT;
379 case BufferFormat::XYZW16I:
380 return VK_FORMAT_R16G16B16A16_SINT;
381 case BufferFormat::XYZW16U:
382 return VK_FORMAT_R16G16B16A16_UINT;
383 case BufferFormat::X32F:
384 return VK_FORMAT_R32_SFLOAT;
385 case BufferFormat::X32I:
386 return VK_FORMAT_R32_SINT;
387 case BufferFormat::X32U:
388 return VK_FORMAT_R32_UINT;
389 case BufferFormat::XY32F:
390 return VK_FORMAT_R32G32_SFLOAT;
391 case BufferFormat::XY32I:
392 return VK_FORMAT_R32G32_SINT;
393 case BufferFormat::XY32U:
394 return VK_FORMAT_R32G32_UINT;
395 case BufferFormat::XYZ32F:
396 return VK_FORMAT_R32G32B32_SFLOAT;
397 case BufferFormat::XYZ32I:
398 return VK_FORMAT_R32G32B32_SINT;
399 case BufferFormat::XYZ32U:
400 return VK_FORMAT_R32G32B32_UINT;
401 case BufferFormat::XYZW32F:
402 return VK_FORMAT_R32G32B32A32_SFLOAT;
403 case BufferFormat::XYZW32I:
404 return VK_FORMAT_R32G32B32A32_SINT;
405 case BufferFormat::XYZW32U:
406 return VK_FORMAT_R32G32B32A32_UINT;
407 default:
408 break;
409 }
410 throw base::BadArgumentException("Unsupported buffer format.");
411 }
412
418 [[nodiscard]] SPARK_RENDER_VK_EXPORT constexpr Format from_format(const VkFormat format)
419 {
420 switch (format)
421 {
422 case VK_FORMAT_R4G4_UNORM_PACK8:
423 return Format::R4G4_UNORM;
424 case VK_FORMAT_R4G4B4A4_UNORM_PACK16:
425 return Format::R4G4B4A4_UNORM;
426 case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
427 return Format::B4G4R4A4_UNORM;
428 case VK_FORMAT_R5G6B5_UNORM_PACK16:
429 return Format::R5G6B5_UNORM;
430 case VK_FORMAT_B5G6R5_UNORM_PACK16:
431 return Format::B5G6R5_UNORM;
432 case VK_FORMAT_R5G5B5A1_UNORM_PACK16:
433 return Format::R5G5B5A1_UNORM;
434 case VK_FORMAT_B5G5R5A1_UNORM_PACK16:
435 return Format::B5G5R5A1_UNORM;
436 case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
437 return Format::A1R5G5B5_UNORM;
438 case VK_FORMAT_R8_UNORM:
439 return Format::R8_UNORM;
440 case VK_FORMAT_R8_SNORM:
441 return Format::R8_SNORM;
442 case VK_FORMAT_R8_USCALED:
443 return Format::R8_USCALED;
444 case VK_FORMAT_R8_SSCALED:
445 return Format::R8_SSCALED;
446 case VK_FORMAT_R8_UINT:
447 return Format::R8_UINT;
448 case VK_FORMAT_R8_SINT:
449 return Format::R8_SINT;
450 case VK_FORMAT_R8_SRGB:
451 return Format::R8_SRGB;
452 case VK_FORMAT_R8G8_UNORM:
453 return Format::R8G8_UNORM;
454 case VK_FORMAT_R8G8_SNORM:
455 return Format::R8G8_SNORM;
456 case VK_FORMAT_R8G8_USCALED:
457 return Format::R8G8_USCALED;
458 case VK_FORMAT_R8G8_SSCALED:
459 return Format::R8G8_SSCALED;
460 case VK_FORMAT_R8G8_UINT:
461 return Format::R8G8_UINT;
462 case VK_FORMAT_R8G8_SINT:
463 return Format::R8G8_SINT;
464 case VK_FORMAT_R8G8_SRGB:
465 return Format::R8G8_SRGB;
466 case VK_FORMAT_R8G8B8_UNORM:
467 return Format::R8G8B8_UNORM;
468 case VK_FORMAT_R8G8B8_SNORM:
469 return Format::R8G8B8_SNORM;
470 case VK_FORMAT_R8G8B8_USCALED:
471 return Format::R8G8B8_USCALED;
472 case VK_FORMAT_R8G8B8_SSCALED:
473 return Format::R8G8B8_SSCALED;
474 case VK_FORMAT_R8G8B8_UINT:
475 return Format::R8G8B8_UINT;
476 case VK_FORMAT_R8G8B8_SINT:
477 return Format::R8G8B8_SINT;
478 case VK_FORMAT_R8G8B8_SRGB:
479 return Format::R8G8B8_SRGB;
480 case VK_FORMAT_B8G8R8_UNORM:
481 return Format::B8G8R8_UNORM;
482 case VK_FORMAT_B8G8R8_SNORM:
483 return Format::B8G8R8_SNORM;
484 case VK_FORMAT_B8G8R8_USCALED:
485 return Format::B8G8R8_USCALED;
486 case VK_FORMAT_B8G8R8_SSCALED:
487 return Format::B8G8R8_SSCALED;
488 case VK_FORMAT_B8G8R8_UINT:
489 return Format::B8G8R8_UINT;
490 case VK_FORMAT_B8G8R8_SINT:
491 return Format::B8G8R8_SINT;
492 case VK_FORMAT_B8G8R8_SRGB:
493 return Format::B8G8R8_SRGB;
494 case VK_FORMAT_R8G8B8A8_UNORM:
495 return Format::R8G8B8A8_UNORM;
496 case VK_FORMAT_R8G8B8A8_SNORM:
497 return Format::R8G8B8A8_SNORM;
498 case VK_FORMAT_R8G8B8A8_USCALED:
499 return Format::R8G8B8A8_USCALED;
500 case VK_FORMAT_R8G8B8A8_SSCALED:
501 return Format::R8G8B8A8_SSCALED;
502 case VK_FORMAT_R8G8B8A8_UINT:
503 return Format::R8G8B8A8_UINT;
504 case VK_FORMAT_R8G8B8A8_SINT:
505 return Format::R8G8B8A8_SINT;
506 case VK_FORMAT_R8G8B8A8_SRGB:
507 return Format::R8G8B8A8_SRGB;
508 case VK_FORMAT_B8G8R8A8_UNORM:
509 return Format::B8G8R8A8_UNORM;
510 case VK_FORMAT_B8G8R8A8_SNORM:
511 return Format::B8G8R8A8_SNORM;
512 case VK_FORMAT_B8G8R8A8_USCALED:
513 return Format::B8G8R8A8_USCALED;
514 case VK_FORMAT_B8G8R8A8_SSCALED:
515 return Format::B8G8R8A8_SSCALED;
516 case VK_FORMAT_B8G8R8A8_UINT:
517 return Format::B8G8R8A8_UINT;
518 case VK_FORMAT_B8G8R8A8_SINT:
519 return Format::B8G8R8A8_SINT;
520 case VK_FORMAT_B8G8R8A8_SRGB:
521 return Format::B8G8R8A8_SRGB;
522 case VK_FORMAT_A8B8G8R8_UNORM_PACK32:
523 return Format::A8B8G8R8_UNORM;
524 case VK_FORMAT_A8B8G8R8_SNORM_PACK32:
525 return Format::A8B8G8R8_SNORM;
526 case VK_FORMAT_A8B8G8R8_USCALED_PACK32:
527 return Format::A8B8G8R8_USCALED;
528 case VK_FORMAT_A8B8G8R8_SSCALED_PACK32:
529 return Format::A8B8G8R8_SSCALED;
530 case VK_FORMAT_A8B8G8R8_UINT_PACK32:
531 return Format::A8B8G8R8_UINT;
532 case VK_FORMAT_A8B8G8R8_SINT_PACK32:
533 return Format::A8B8G8R8_SINT;
534 case VK_FORMAT_A8B8G8R8_SRGB_PACK32:
535 return Format::A8B8G8R8_SRGB;
536 case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
537 return Format::A2R10G10B10_UNORM;
538 case VK_FORMAT_A2R10G10B10_SNORM_PACK32:
539 return Format::A2R10G10B10_SNORM;
540 case VK_FORMAT_A2R10G10B10_USCALED_PACK32:
541 return Format::A2R10G10B10_USCALED;
542 case VK_FORMAT_A2R10G10B10_SSCALED_PACK32:
543 return Format::A2R10G10B10_SSCALED;
544 case VK_FORMAT_A2R10G10B10_UINT_PACK32:
545 return Format::A2R10G10B10_UINT;
546 case VK_FORMAT_A2R10G10B10_SINT_PACK32:
547 return Format::A2R10G10B10_SINT;
548 case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
549 return Format::A2B10G10R10_UNORM;
550 case VK_FORMAT_A2B10G10R10_SNORM_PACK32:
551 return Format::A2B10G10R10_SNORM;
552 case VK_FORMAT_A2B10G10R10_USCALED_PACK32:
553 return Format::A2B10G10R10_USCALED;
554 case VK_FORMAT_A2B10G10R10_SSCALED_PACK32:
555 return Format::A2B10G10R10_SSCALED;
556 case VK_FORMAT_A2B10G10R10_UINT_PACK32:
557 return Format::A2B10G10R10_UINT;
558 case VK_FORMAT_A2B10G10R10_SINT_PACK32:
559 return Format::A2B10G10R10_SINT;
560 case VK_FORMAT_R16_UNORM:
561 return Format::R16_UNORM;
562 case VK_FORMAT_R16_SNORM:
563 return Format::R16_SNORM;
564 case VK_FORMAT_R16_USCALED:
565 return Format::R16_USCALED;
566 case VK_FORMAT_R16_SSCALED:
567 return Format::R16_SSCALED;
568 case VK_FORMAT_R16_UINT:
569 return Format::R16_UINT;
570 case VK_FORMAT_R16_SINT:
571 return Format::R16_SINT;
572 case VK_FORMAT_R16_SFLOAT:
573 return Format::R16_SFLOAT;
574 case VK_FORMAT_R16G16_UNORM:
575 return Format::R16G16_UNORM;
576 case VK_FORMAT_R16G16_SNORM:
577 return Format::R16G16_SNORM;
578 case VK_FORMAT_R16G16_USCALED:
579 return Format::R16G16_USCALED;
580 case VK_FORMAT_R16G16_SSCALED:
581 return Format::R16G16_SSCALED;
582 case VK_FORMAT_R16G16_UINT:
583 return Format::R16G16_UINT;
584 case VK_FORMAT_R16G16_SINT:
585 return Format::R16G16_SINT;
586 case VK_FORMAT_R16G16_SFLOAT:
587 return Format::R16G16_SFLOAT;
588 case VK_FORMAT_R16G16B16_UNORM:
589 return Format::R16G16B16_UNORM;
590 case VK_FORMAT_R16G16B16_SNORM:
591 return Format::R16G16B16_SNORM;
592 case VK_FORMAT_R16G16B16_USCALED:
593 return Format::R16G16B16_USCALED;
594 case VK_FORMAT_R16G16B16_SSCALED:
595 return Format::R16G16B16_SSCALED;
596 case VK_FORMAT_R16G16B16_UINT:
597 return Format::R16G16B16_UINT;
598 case VK_FORMAT_R16G16B16_SINT:
599 return Format::R16G16B16_SINT;
600 case VK_FORMAT_R16G16B16_SFLOAT:
601 return Format::R16G16B16_SFLOAT;
602 case VK_FORMAT_R16G16B16A16_UNORM:
603 return Format::R16G16B16A16_UNORM;
604 case VK_FORMAT_R16G16B16A16_SNORM:
605 return Format::R16G16B16A16_SNORM;
606 case VK_FORMAT_R16G16B16A16_USCALED:
607 return Format::R16G16B16A16_USCALED;
608 case VK_FORMAT_R16G16B16A16_SSCALED:
609 return Format::R16G16B16A16_SSCALED;
610 case VK_FORMAT_R16G16B16A16_UINT:
611 return Format::R16G16B16A16_UINT;
612 case VK_FORMAT_R16G16B16A16_SINT:
613 return Format::R16G16B16A16_SINT;
614 case VK_FORMAT_R16G16B16A16_SFLOAT:
615 return Format::R16G16B16A16_SFLOAT;
616 case VK_FORMAT_R32_UINT:
617 return Format::R32_UINT;
618 case VK_FORMAT_R32_SINT:
619 return Format::R32_SINT;
620 case VK_FORMAT_R32_SFLOAT:
621 return Format::R32_SFLOAT;
622 case VK_FORMAT_R32G32_UINT:
623 return Format::R32G32_UINT;
624 case VK_FORMAT_R32G32_SINT:
625 return Format::R32G32_SINT;
626 case VK_FORMAT_R32G32_SFLOAT:
627 return Format::R32G32_SFLOAT;
628 case VK_FORMAT_R32G32B32_UINT:
629 return Format::R32G32B32_UINT;
630 case VK_FORMAT_R32G32B32_SINT:
631 return Format::R32G32B32_SINT;
632 case VK_FORMAT_R32G32B32_SFLOAT:
633 return Format::R32G32B32_SFLOAT;
634 case VK_FORMAT_R32G32B32A32_UINT:
635 return Format::R32G32B32A32_UINT;
636 case VK_FORMAT_R32G32B32A32_SINT:
637 return Format::R32G32B32A32_SINT;
638 case VK_FORMAT_R32G32B32A32_SFLOAT:
639 return Format::R32G32B32A32_SFLOAT;
640 case VK_FORMAT_R64_UINT:
641 return Format::R64_UINT;
642 case VK_FORMAT_R64_SINT:
643 return Format::R64_SINT;
644 case VK_FORMAT_R64_SFLOAT:
645 return Format::R64_SFLOAT;
646 case VK_FORMAT_R64G64_UINT:
647 return Format::R64G64_UINT;
648 case VK_FORMAT_R64G64_SINT:
649 return Format::R64G64_SINT;
650 case VK_FORMAT_R64G64_SFLOAT:
651 return Format::R64G64_SFLOAT;
652 case VK_FORMAT_R64G64B64_UINT:
653 return Format::R64G64B64_UINT;
654 case VK_FORMAT_R64G64B64_SINT:
655 return Format::R64G64B64_SINT;
656 case VK_FORMAT_R64G64B64_SFLOAT:
657 return Format::R64G64B64_SFLOAT;
658 case VK_FORMAT_R64G64B64A64_UINT:
659 return Format::R64G64B64A64_UINT;
660 case VK_FORMAT_R64G64B64A64_SINT:
661 return Format::R64G64B64A64_SINT;
662 case VK_FORMAT_R64G64B64A64_SFLOAT:
663 return Format::R64G64B64A64_SFLOAT;
664 case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
665 return Format::B10G11R11_UFLOAT;
666 case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:
667 return Format::E5B9G9R9_UFLOAT;
668 case VK_FORMAT_D16_UNORM:
669 return Format::D16_UNORM;
670 case VK_FORMAT_X8_D24_UNORM_PACK32:
671 return Format::X8_D24_UNORM;
672 case VK_FORMAT_D32_SFLOAT:
673 return Format::D32_SFLOAT;
674 case VK_FORMAT_S8_UINT:
675 return Format::S8_UINT;
676 case VK_FORMAT_D16_UNORM_S8_UINT:
677 return Format::D16_UNORM_S8_UINT;
678 case VK_FORMAT_D24_UNORM_S8_UINT:
679 return Format::D24_UNORM_S8_UINT;
680 case VK_FORMAT_D32_SFLOAT_S8_UINT:
681 return Format::D32_SFLOAT_S8_UINT;
682 case VK_FORMAT_BC1_RGB_UNORM_BLOCK:
683 return Format::BC1_RGB_UNORM;
684 case VK_FORMAT_BC1_RGB_SRGB_BLOCK:
685 return Format::BC1_RGB_SRGB;
686 case VK_FORMAT_BC1_RGBA_UNORM_BLOCK:
687 return Format::BC1_RGBA_UNORM;
688 case VK_FORMAT_BC1_RGBA_SRGB_BLOCK:
689 return Format::BC1_RGBA_SRGB;
690 case VK_FORMAT_BC2_UNORM_BLOCK:
691 return Format::BC2_UNORM;
692 case VK_FORMAT_BC2_SRGB_BLOCK:
693 return Format::BC2_SRGB;
694 case VK_FORMAT_BC3_UNORM_BLOCK:
695 return Format::BC3_UNORM;
696 case VK_FORMAT_BC3_SRGB_BLOCK:
697 return Format::BC3_SRGB;
698 case VK_FORMAT_BC4_UNORM_BLOCK:
699 return Format::BC4_UNORM;
700 case VK_FORMAT_BC4_SNORM_BLOCK:
701 return Format::BC4_SNORM;
702 case VK_FORMAT_BC5_UNORM_BLOCK:
703 return Format::BC5_UNORM;
704 case VK_FORMAT_BC5_SNORM_BLOCK:
705 return Format::BC5_SNORM;
706 case VK_FORMAT_BC6H_UFLOAT_BLOCK:
707 return Format::BC6H_UFLOAT;
708 case VK_FORMAT_BC6H_SFLOAT_BLOCK:
709 return Format::BC6H_SFLOAT;
710 case VK_FORMAT_BC7_UNORM_BLOCK:
711 return Format::BC7_UNORM;
712 case VK_FORMAT_BC7_SRGB_BLOCK:
713 return Format::BC7_SRGB;
714 default:
715 break;
716 }
717 return Format::Other;
718 }
719
725 [[nodiscard]] SPARK_RENDER_VK_EXPORT constexpr VkShaderStageFlagBits to_shader_stage(const ShaderStage stage)
726 {
727 switch (stage)
728 {
729 case ShaderStage::Vertex:
730 return VkShaderStageFlagBits::VK_SHADER_STAGE_VERTEX_BIT;
731 case ShaderStage::TessellationControl:
732 return VkShaderStageFlagBits::VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
733 case ShaderStage::TessellationEvaluation:
734 return VkShaderStageFlagBits::VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
735 case ShaderStage::Geometry:
736 return VkShaderStageFlagBits::VK_SHADER_STAGE_GEOMETRY_BIT;
737 case ShaderStage::Fragment:
738 return VkShaderStageFlagBits::VK_SHADER_STAGE_FRAGMENT_BIT;
739 case ShaderStage::Compute:
740 return VkShaderStageFlagBits::VK_SHADER_STAGE_COMPUTE_BIT;
741 default:
742 break;
743 }
744 throw base::BadArgumentException("Unsupported shader type.");
745 }
746
752 [[nodiscard]] SPARK_RENDER_VK_EXPORT constexpr VkPolygonMode to_polygon_mode(const PolygonMode mode)
753 {
754 switch (mode)
755 {
756 case PolygonMode::Solid:
757 return VkPolygonMode::VK_POLYGON_MODE_FILL;
758 case PolygonMode::WireFrame:
759 return VkPolygonMode::VK_POLYGON_MODE_LINE;
760 case PolygonMode::Point:
761 return VkPolygonMode::VK_POLYGON_MODE_POINT;
762 }
763 throw base::BadArgumentException("Unsupported polygon mode.");
764 }
765
771 [[nodiscard]] SPARK_RENDER_VK_EXPORT constexpr VkCullModeFlags to_cull_mode(const CullMode mode)
772 {
773 switch (mode)
774 {
775 case CullMode::BackFaces:
776 return VkCullModeFlagBits::VK_CULL_MODE_BACK_BIT;
777 case CullMode::FrontFaces:
778 return VkCullModeFlagBits::VK_CULL_MODE_FRONT_BIT;
779 case CullMode::Both:
780 return VkCullModeFlagBits::VK_CULL_MODE_FRONT_AND_BACK;
781 case CullMode::Disabled:
782 return VkCullModeFlagBits::VK_CULL_MODE_NONE;
783 }
784 throw base::BadArgumentException("Unsupported cull mode.");
785 }
786
792 [[nodiscard]] SPARK_RENDER_VK_EXPORT constexpr VkPrimitiveTopology to_primitive_topology(const PrimitiveTopology topology)
793 {
794 switch (topology)
795 {
796 case PrimitiveTopology::LineList:
797 return VkPrimitiveTopology::VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
798 case PrimitiveTopology::LineStrip:
799 return VkPrimitiveTopology::VK_PRIMITIVE_TOPOLOGY_LINE_STRIP;
800 case PrimitiveTopology::PointList:
801 return VkPrimitiveTopology::VK_PRIMITIVE_TOPOLOGY_POINT_LIST;
802 case PrimitiveTopology::TriangleList:
803 return VkPrimitiveTopology::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
804 case PrimitiveTopology::TriangleStrip:
805 return VkPrimitiveTopology::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
806 }
807 throw base::BadArgumentException("Unsupported primitive topology.");
808 }
809
815 [[nodiscard]] SPARK_RENDER_VK_EXPORT constexpr VkSampleCountFlagBits to_samples(const MultiSamplingLevel level)
816 {
817 switch (level)
818 {
819 case MultiSamplingLevel::X1:
820 return VkSampleCountFlagBits::VK_SAMPLE_COUNT_1_BIT;
821 case MultiSamplingLevel::X2:
822 return VkSampleCountFlagBits::VK_SAMPLE_COUNT_2_BIT;
823 case MultiSamplingLevel::X4:
824 return VkSampleCountFlagBits::VK_SAMPLE_COUNT_4_BIT;
825 case MultiSamplingLevel::X8:
826 return VkSampleCountFlagBits::VK_SAMPLE_COUNT_8_BIT;
827 case MultiSamplingLevel::X16:
828 return VkSampleCountFlagBits::VK_SAMPLE_COUNT_16_BIT;
829 case MultiSamplingLevel::X32:
830 return VkSampleCountFlagBits::VK_SAMPLE_COUNT_32_BIT;
831 case MultiSamplingLevel::X64:
832 return VkSampleCountFlagBits::VK_SAMPLE_COUNT_64_BIT;
833 }
834 throw base::BadArgumentException("Unsupported multi sampling level.");
835 }
836
842 [[nodiscard]] SPARK_RENDER_VK_EXPORT constexpr VkBlendFactor to_blend_factor(const BlendFactor factor)
843 {
844 switch (factor)
845 {
846 case BlendFactor::Zero:
847 return VkBlendFactor::VK_BLEND_FACTOR_ZERO;
848 case BlendFactor::One:
849 return VkBlendFactor::VK_BLEND_FACTOR_ONE;
850 case BlendFactor::SourceColor:
851 return VkBlendFactor::VK_BLEND_FACTOR_SRC_COLOR;
852 case BlendFactor::OneMinusSourceColor:
853 return VK_BLEND_FACTOR_ONE_MINUS_SRC_COLOR;
854 case BlendFactor::DestinationColor:
855 return VK_BLEND_FACTOR_DST_COLOR;
856 case BlendFactor::OneMinusDestinationColor:
857 return VK_BLEND_FACTOR_ONE_MINUS_DST_COLOR;
858 case BlendFactor::SourceAlpha:
859 return VK_BLEND_FACTOR_SRC_ALPHA;
860 case BlendFactor::OneMinusSourceAlpha:
861 return VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA;
862 case BlendFactor::DestinationAlpha:
863 return VK_BLEND_FACTOR_DST_ALPHA;
864 case BlendFactor::OneMinusDestinationAlpha:
865 return VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA;
866 case BlendFactor::ConstantColor:
867 return VK_BLEND_FACTOR_CONSTANT_COLOR;
868 case BlendFactor::OneMinusConstantColor:
869 return VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_COLOR;
870 case BlendFactor::ConstantAlpha:
871 return VK_BLEND_FACTOR_CONSTANT_ALPHA;
872 case BlendFactor::OneMinusConstantAlpha:
873 return VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_ALPHA;
874 case BlendFactor::SourceAlphaSaturate:
875 return VK_BLEND_FACTOR_SRC_ALPHA_SATURATE;
876 case BlendFactor::Source1Color:
877 return VK_BLEND_FACTOR_ONE_MINUS_SRC1_COLOR;
878 case BlendFactor::OneMinusSource1Color:
879 return VK_BLEND_FACTOR_ONE_MINUS_SRC1_COLOR;
880 case BlendFactor::Source1Alpha:
881 return VK_BLEND_FACTOR_SRC1_ALPHA;
882 case BlendFactor::OneMinusSource1Alpha:
883 return VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA;
884 }
885 throw base::BadArgumentException("Unsupported blend factor.");
886 }
887
893 [[nodiscard]] SPARK_RENDER_VK_EXPORT constexpr VkBlendOp to_blend_operation(const BlendOperation operation)
894 {
895 switch (operation)
896 {
897 case BlendOperation::Add:
898 return VkBlendOp::VK_BLEND_OP_ADD;
899 case BlendOperation::Subtract:
900 return VkBlendOp::VK_BLEND_OP_SUBTRACT;
901 case BlendOperation::ReverseSubtract:
902 return VkBlendOp::VK_BLEND_OP_REVERSE_SUBTRACT;
903 case BlendOperation::Minimum:
904 return VkBlendOp::VK_BLEND_OP_MIN;
905 case BlendOperation::Maximum:
906 return VkBlendOp::VK_BLEND_OP_MAX;
907 }
908 throw base::BadArgumentException("Unsupported blend operation.");
909 }
910
916 [[nodiscard]] SPARK_RENDER_VK_EXPORT constexpr VkCompareOp to_compare_operation(const CompareOperation operation)
917 {
918 switch (operation)
919 {
920 case CompareOperation::Never:
921 return VkCompareOp::VK_COMPARE_OP_NEVER;
922 case CompareOperation::Less:
923 return VkCompareOp::VK_COMPARE_OP_LESS;
924 case CompareOperation::Greater:
925 return VkCompareOp::VK_COMPARE_OP_GREATER;
926 case CompareOperation::Equal:
927 return VkCompareOp::VK_COMPARE_OP_EQUAL;
928 case CompareOperation::LessEqual:
929 return VkCompareOp::VK_COMPARE_OP_LESS_OR_EQUAL;
930 case CompareOperation::GreaterEqual:
931 return VkCompareOp::VK_COMPARE_OP_GREATER_OR_EQUAL;
932 case CompareOperation::NotEqual:
933 return VkCompareOp::VK_COMPARE_OP_NOT_EQUAL;
934 case CompareOperation::Always:
935 return VkCompareOp::VK_COMPARE_OP_ALWAYS;
936 }
937 throw base::BadArgumentException("Unsupported compare operation.");
938 }
939
945 [[nodiscard]] SPARK_RENDER_VK_EXPORT constexpr VkStencilOp to_stencil_operation(const StencilOperation operation)
946 {
947 switch (operation)
948 {
949 case StencilOperation::Keep:
950 return VkStencilOp::VK_STENCIL_OP_KEEP;
951 case StencilOperation::Zero:
952 return VkStencilOp::VK_STENCIL_OP_ZERO;
953 case StencilOperation::Invert:
954 return VkStencilOp::VK_STENCIL_OP_INVERT;
955 case StencilOperation::Replace:
956 return VkStencilOp::VK_STENCIL_OP_REPLACE;
957 case StencilOperation::IncrementClamp:
958 return VkStencilOp::VK_STENCIL_OP_INCREMENT_AND_CLAMP;
959 case StencilOperation::IncrementWrap:
960 return VkStencilOp::VK_STENCIL_OP_INCREMENT_AND_WRAP;
961 case StencilOperation::DecrementClamp:
962 return VkStencilOp::VK_STENCIL_OP_DECREMENT_AND_CLAMP;
963 case StencilOperation::DecrementWrap:
964 return VkStencilOp::VK_STENCIL_OP_DECREMENT_AND_WRAP;
965 }
966 throw base::BadArgumentException("Unsupported stencil operation.");
967 }
968
975 [[nodiscard]] SPARK_RENDER_VK_EXPORT constexpr VkImageViewType to_image_view_type(const ImageDimensions dimension, const unsigned layers = 1)
976 {
977 switch (dimension)
978 {
979 case ImageDimensions::DIM_1:
980 return layers == 1 ? VkImageViewType::VK_IMAGE_VIEW_TYPE_1D : VkImageViewType::VK_IMAGE_VIEW_TYPE_1D_ARRAY;
981 case ImageDimensions::DIM_2:
982 return layers == 1 ? VkImageViewType::VK_IMAGE_VIEW_TYPE_2D : VkImageViewType::VK_IMAGE_VIEW_TYPE_2D_ARRAY;
983 case ImageDimensions::DIM_3:
984 return VkImageViewType::VK_IMAGE_VIEW_TYPE_3D;
985 case ImageDimensions::CUBE:
986 return VkImageViewType::VK_IMAGE_VIEW_TYPE_CUBE;
987 }
988 throw base::BadArgumentException("Unsupported image dimensions.");
989 }
990
996 [[nodiscard]] SPARK_RENDER_VK_EXPORT constexpr VkImageType to_image_type(const ImageDimensions dimension)
997 {
998 switch (dimension)
999 {
1000 case ImageDimensions::DIM_1:
1001 return VkImageType::VK_IMAGE_TYPE_1D;
1002 case ImageDimensions::DIM_2:
1003 case ImageDimensions::CUBE:
1004 return VkImageType::VK_IMAGE_TYPE_2D;
1005 case ImageDimensions::DIM_3:
1006 return VkImageType::VK_IMAGE_TYPE_3D;
1007 }
1008 throw base::BadArgumentException("Unsupported image dimensions.");
1009 }
1010}