2 * Copyright 2017 Jacob Lifshay
4 * Permission is hereby granted, free of charge, to any person obtaining a copy
5 * of this software and associated documentation files (the "Software"), to deal
6 * in the Software without restriction, including without limitation the rights
7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 * copies of the Software, and to permit persons to whom the Software is
9 * furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice shall be included in all
12 * copies or substantial portions of the Software.
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23 #ifndef VULKAN_API_OBJECTS_H_
24 #define VULKAN_API_OBJECTS_H_
26 #include "vulkan/vulkan.h"
27 #include "vulkan/vk_icd.h"
28 #include "vulkan/remove_xlib_macros.h"
29 #include "util/enum.h"
30 #include "util/string_view.h"
31 #include "util/variant.h"
32 #include "util/system_memory_info.h"
33 #include "util/constexpr_array.h"
34 #include "util/optional.h"
35 #include "util/circular_queue.h"
43 #include <condition_variable>
51 enum class Supported_extension
60 kazan_util_generate_enum_traits(Supported_extension
,
61 Supported_extension::Not_supported
,
62 Supported_extension::KHR_surface
,
63 Supported_extension::KHR_xcb_surface
,
64 Supported_extension::KHR_xlib_surface
,
65 Supported_extension::KHR_swapchain
);
67 typedef util::Enum_set
<Supported_extension
> Supported_extensions
;
69 enum class Extension_scope
76 constexpr Extension_scope
get_extension_scope(Supported_extension extension
) noexcept
80 case Supported_extension::Not_supported
:
81 return Extension_scope::Not_supported
;
82 case Supported_extension::KHR_surface
:
83 return Extension_scope::Instance
;
84 case Supported_extension::KHR_xcb_surface
:
85 #ifdef VK_USE_PLATFORM_XCB_KHR
86 return Extension_scope::Instance
;
88 return Extension_scope::Not_supported
;
90 case Supported_extension::KHR_xlib_surface
:
91 #ifdef VK_USE_PLATFORM_XLIB_KHR
92 return Extension_scope::Instance
;
94 return Extension_scope::Not_supported
;
96 case Supported_extension::KHR_swapchain
:
97 return Extension_scope::Device
;
99 assert(!"unknown extension");
100 return Extension_scope::Not_supported
;
103 constexpr VkExtensionProperties
get_extension_properties(Supported_extension extension
) noexcept
107 case Supported_extension::Not_supported
:
109 case Supported_extension::KHR_surface
:
111 .extensionName
= VK_KHR_SURFACE_EXTENSION_NAME
,
112 .specVersion
= VK_KHR_SURFACE_SPEC_VERSION
,
114 case Supported_extension::KHR_xcb_surface
:
115 #ifdef VK_USE_PLATFORM_XCB_KHR
117 .extensionName
= VK_KHR_XCB_SURFACE_EXTENSION_NAME
,
118 .specVersion
= VK_KHR_XCB_SURFACE_SPEC_VERSION
,
123 case Supported_extension::KHR_xlib_surface
:
124 #ifdef VK_USE_PLATFORM_XLIB_KHR
126 .extensionName
= VK_KHR_XLIB_SURFACE_EXTENSION_NAME
,
127 .specVersion
= VK_KHR_XLIB_SURFACE_SPEC_VERSION
,
132 case Supported_extension::KHR_swapchain
:
134 .extensionName
= VK_KHR_SWAPCHAIN_EXTENSION_NAME
,
135 .specVersion
= VK_KHR_SWAPCHAIN_SPEC_VERSION
,
138 assert(!"unknown extension");
142 constexpr std::size_t get_extension_count(Extension_scope scope
) noexcept
144 std::size_t retval
= 0;
145 for(auto extension
: util::Enum_traits
<Supported_extension
>::values
)
146 if(get_extension_scope(extension
) == scope
)
151 template <Extension_scope Scope
>
152 constexpr util::Constexpr_array
<VkExtensionProperties
, get_extension_count(Scope
)>
153 get_extensions() noexcept
155 util::Constexpr_array
<VkExtensionProperties
, get_extension_count(Scope
)> retval
{};
156 std::size_t index
= 0;
157 for(auto extension
: util::Enum_traits
<Supported_extension
>::values
)
158 if(get_extension_scope(extension
) == Scope
)
159 retval
[index
++] = get_extension_properties(extension
);
160 assert(index
== retval
.size());
164 constexpr Supported_extensions
get_extension_dependencies(Supported_extension extension
) noexcept
168 case Supported_extension::Not_supported
:
170 case Supported_extension::KHR_surface
:
172 case Supported_extension::KHR_xcb_surface
:
173 return {Supported_extension::KHR_surface
};
174 case Supported_extension::KHR_xlib_surface
:
175 return {Supported_extension::KHR_surface
};
176 case Supported_extension::KHR_swapchain
:
177 return {Supported_extension::KHR_surface
};
179 assert(!"unknown extension");
183 inline Supported_extension
parse_extension_name(util::string_view name
) noexcept
186 return Supported_extension::Not_supported
;
187 for(auto extension
: util::Enum_traits
<Supported_extension
>::values
)
189 if(extension
== Supported_extension::Not_supported
)
191 if(get_extension_properties(extension
).extensionName
== name
)
194 return Supported_extension::Not_supported
;
197 constexpr VkFormatProperties
get_format_properties(VkFormat format
) noexcept
201 case VK_FORMAT_UNDEFINED
:
203 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
205 case VK_FORMAT_R4G4_UNORM_PACK8
:
207 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
209 case VK_FORMAT_R4G4B4A4_UNORM_PACK16
:
211 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
213 case VK_FORMAT_B4G4R4A4_UNORM_PACK16
:
214 #warning implement VK_FORMAT_B4G4R4A4_UNORM_PACK16
216 .linearTilingFeatures
= 0,
217 .optimalTilingFeatures
= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT
218 | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR
219 | VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR
220 | VK_FORMAT_FEATURE_BLIT_SRC_BIT
221 | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT
,
224 case VK_FORMAT_R5G6B5_UNORM_PACK16
:
225 #warning implement VK_FORMAT_R5G6B5_UNORM_PACK16
227 .linearTilingFeatures
= 0,
228 .optimalTilingFeatures
= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT
229 | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR
230 | VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR
231 | VK_FORMAT_FEATURE_BLIT_SRC_BIT
232 | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT
233 | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT
234 | VK_FORMAT_FEATURE_BLIT_DST_BIT
235 | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT
,
238 case VK_FORMAT_B5G6R5_UNORM_PACK16
:
240 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
242 case VK_FORMAT_R5G5B5A1_UNORM_PACK16
:
244 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
246 case VK_FORMAT_B5G5R5A1_UNORM_PACK16
:
248 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
250 case VK_FORMAT_A1R5G5B5_UNORM_PACK16
:
251 #warning implement VK_FORMAT_A1R5G5B5_UNORM_PACK16
253 .linearTilingFeatures
= 0,
254 .optimalTilingFeatures
= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT
255 | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR
256 | VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR
257 | VK_FORMAT_FEATURE_BLIT_SRC_BIT
258 | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT
259 | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT
260 | VK_FORMAT_FEATURE_BLIT_DST_BIT
261 | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT
,
264 case VK_FORMAT_R8_UNORM
:
265 #warning implement VK_FORMAT_R8_UNORM
267 .linearTilingFeatures
= 0,
268 .optimalTilingFeatures
= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT
269 | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR
270 | VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR
271 | VK_FORMAT_FEATURE_BLIT_SRC_BIT
272 | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT
273 | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT
274 | VK_FORMAT_FEATURE_BLIT_DST_BIT
275 | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT
,
277 VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT
| VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT
,
279 case VK_FORMAT_R8_SNORM
:
280 #warning implement VK_FORMAT_R8_SNORM
282 .linearTilingFeatures
= 0,
283 .optimalTilingFeatures
= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT
284 | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR
285 | VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR
286 | VK_FORMAT_FEATURE_BLIT_SRC_BIT
287 | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT
,
289 VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT
| VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT
,
291 case VK_FORMAT_R8_USCALED
:
293 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
295 case VK_FORMAT_R8_SSCALED
:
297 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
299 case VK_FORMAT_R8_UINT
:
300 #warning implement VK_FORMAT_R8_UINT
302 .linearTilingFeatures
= 0,
303 .optimalTilingFeatures
= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT
304 | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR
305 | VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR
306 | VK_FORMAT_FEATURE_BLIT_SRC_BIT
307 | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT
308 | VK_FORMAT_FEATURE_BLIT_DST_BIT
,
310 VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT
| VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT
,
312 case VK_FORMAT_R8_SINT
:
313 #warning implement VK_FORMAT_R8_SINT
315 .linearTilingFeatures
= 0,
316 .optimalTilingFeatures
= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT
317 | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR
318 | VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR
319 | VK_FORMAT_FEATURE_BLIT_SRC_BIT
320 | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT
321 | VK_FORMAT_FEATURE_BLIT_DST_BIT
,
323 VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT
| VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT
,
325 case VK_FORMAT_R8_SRGB
:
327 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
329 case VK_FORMAT_R8G8_UNORM
:
330 #warning implement VK_FORMAT_R8G8_UNORM
332 .linearTilingFeatures
= 0,
333 .optimalTilingFeatures
= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT
334 | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR
335 | VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR
336 | VK_FORMAT_FEATURE_BLIT_SRC_BIT
337 | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT
338 | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT
339 | VK_FORMAT_FEATURE_BLIT_DST_BIT
340 | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT
,
342 VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT
| VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT
,
344 case VK_FORMAT_R8G8_SNORM
:
345 #warning implement VK_FORMAT_R8G8_SNORM
347 .linearTilingFeatures
= 0,
348 .optimalTilingFeatures
= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT
349 | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR
350 | VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR
351 | VK_FORMAT_FEATURE_BLIT_SRC_BIT
352 | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT
,
354 VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT
| VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT
,
356 case VK_FORMAT_R8G8_USCALED
:
358 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
360 case VK_FORMAT_R8G8_SSCALED
:
362 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
364 case VK_FORMAT_R8G8_UINT
:
365 #warning implement VK_FORMAT_R8G8_UINT
367 .linearTilingFeatures
= 0,
368 .optimalTilingFeatures
= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT
369 | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR
370 | VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR
371 | VK_FORMAT_FEATURE_BLIT_SRC_BIT
372 | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT
373 | VK_FORMAT_FEATURE_BLIT_DST_BIT
,
375 VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT
| VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT
,
377 case VK_FORMAT_R8G8_SINT
:
378 #warning implement VK_FORMAT_R8G8_SINT
380 .linearTilingFeatures
= 0,
381 .optimalTilingFeatures
= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT
382 | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR
383 | VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR
384 | VK_FORMAT_FEATURE_BLIT_SRC_BIT
385 | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT
386 | VK_FORMAT_FEATURE_BLIT_DST_BIT
,
388 VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT
| VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT
,
390 case VK_FORMAT_R8G8_SRGB
:
392 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
394 case VK_FORMAT_R8G8B8_UNORM
:
396 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
398 case VK_FORMAT_R8G8B8_SNORM
:
400 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
402 case VK_FORMAT_R8G8B8_USCALED
:
404 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
406 case VK_FORMAT_R8G8B8_SSCALED
:
408 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
410 case VK_FORMAT_R8G8B8_UINT
:
412 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
414 case VK_FORMAT_R8G8B8_SINT
:
416 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
418 case VK_FORMAT_R8G8B8_SRGB
:
420 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
422 case VK_FORMAT_B8G8R8_UNORM
:
424 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
426 case VK_FORMAT_B8G8R8_SNORM
:
428 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
430 case VK_FORMAT_B8G8R8_USCALED
:
432 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
434 case VK_FORMAT_B8G8R8_SSCALED
:
436 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
438 case VK_FORMAT_B8G8R8_UINT
:
440 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
442 case VK_FORMAT_B8G8R8_SINT
:
444 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
446 case VK_FORMAT_B8G8R8_SRGB
:
448 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
450 case VK_FORMAT_R8G8B8A8_UNORM
:
451 #warning implement VK_FORMAT_R8G8B8A8_UNORM
453 .linearTilingFeatures
= 0,
454 .optimalTilingFeatures
= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT
455 | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR
456 | VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR
457 | VK_FORMAT_FEATURE_BLIT_SRC_BIT
458 | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT
459 | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT
460 | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT
461 | VK_FORMAT_FEATURE_BLIT_DST_BIT
462 | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT
,
463 .bufferFeatures
= VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT
464 | VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT
465 | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT
,
467 case VK_FORMAT_R8G8B8A8_SNORM
:
468 #warning implement VK_FORMAT_R8G8B8A8_SNORM
470 .linearTilingFeatures
= 0,
471 .optimalTilingFeatures
= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT
472 | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR
473 | VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR
474 | VK_FORMAT_FEATURE_BLIT_SRC_BIT
475 | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT
476 | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT
,
477 .bufferFeatures
= VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT
478 | VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT
479 | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT
,
481 case VK_FORMAT_R8G8B8A8_USCALED
:
483 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
485 case VK_FORMAT_R8G8B8A8_SSCALED
:
487 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
489 case VK_FORMAT_R8G8B8A8_UINT
:
490 #warning implement VK_FORMAT_R8G8B8A8_UINT
492 .linearTilingFeatures
= 0,
493 .optimalTilingFeatures
= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT
494 | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR
495 | VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR
496 | VK_FORMAT_FEATURE_BLIT_SRC_BIT
497 | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT
498 | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT
499 | VK_FORMAT_FEATURE_BLIT_DST_BIT
,
500 .bufferFeatures
= VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT
501 | VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT
502 | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT
,
504 case VK_FORMAT_R8G8B8A8_SINT
:
505 #warning implement VK_FORMAT_R8G8B8A8_SINT
507 .linearTilingFeatures
= 0,
508 .optimalTilingFeatures
= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT
509 | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR
510 | VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR
511 | VK_FORMAT_FEATURE_BLIT_SRC_BIT
512 | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT
513 | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT
514 | VK_FORMAT_FEATURE_BLIT_DST_BIT
,
515 .bufferFeatures
= VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT
516 | VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT
517 | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT
,
519 case VK_FORMAT_R8G8B8A8_SRGB
:
520 #warning implement VK_FORMAT_R8G8B8A8_SRGB
522 .linearTilingFeatures
= 0,
523 .optimalTilingFeatures
= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT
524 | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR
525 | VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR
526 | VK_FORMAT_FEATURE_BLIT_SRC_BIT
527 | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT
528 | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT
529 | VK_FORMAT_FEATURE_BLIT_DST_BIT
530 | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT
,
533 case VK_FORMAT_B8G8R8A8_UNORM
:
534 #warning implement VK_FORMAT_B8G8R8A8_UNORM
536 .linearTilingFeatures
= 0,
537 .optimalTilingFeatures
= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT
538 | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR
539 | VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR
540 | VK_FORMAT_FEATURE_BLIT_SRC_BIT
541 | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT
542 | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT
543 | VK_FORMAT_FEATURE_BLIT_DST_BIT
544 | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT
,
546 VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT
| VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT
,
548 case VK_FORMAT_B8G8R8A8_SNORM
:
550 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
552 case VK_FORMAT_B8G8R8A8_USCALED
:
554 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
556 case VK_FORMAT_B8G8R8A8_SSCALED
:
558 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
560 case VK_FORMAT_B8G8R8A8_UINT
:
562 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
564 case VK_FORMAT_B8G8R8A8_SINT
:
566 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
568 case VK_FORMAT_B8G8R8A8_SRGB
:
569 #warning implement VK_FORMAT_B8G8R8A8_SRGB
571 .linearTilingFeatures
= 0,
572 .optimalTilingFeatures
= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT
573 | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR
574 | VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR
575 | VK_FORMAT_FEATURE_BLIT_SRC_BIT
576 | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT
577 | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT
578 | VK_FORMAT_FEATURE_BLIT_DST_BIT
579 | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT
,
582 case VK_FORMAT_A8B8G8R8_UNORM_PACK32
:
583 #warning implement VK_FORMAT_A8B8G8R8_UNORM_PACK32
585 .linearTilingFeatures
= 0,
586 .optimalTilingFeatures
= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT
587 | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR
588 | VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR
589 | VK_FORMAT_FEATURE_BLIT_SRC_BIT
590 | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT
591 | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT
592 | VK_FORMAT_FEATURE_BLIT_DST_BIT
593 | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT
,
594 .bufferFeatures
= VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT
595 | VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT
596 | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT
,
598 case VK_FORMAT_A8B8G8R8_SNORM_PACK32
:
599 #warning implement VK_FORMAT_A8B8G8R8_SNORM_PACK32
601 .linearTilingFeatures
= 0,
602 .optimalTilingFeatures
= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT
603 | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR
604 | VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR
605 | VK_FORMAT_FEATURE_BLIT_SRC_BIT
606 | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT
,
607 .bufferFeatures
= VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT
608 | VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT
609 | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT
,
611 case VK_FORMAT_A8B8G8R8_USCALED_PACK32
:
613 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
615 case VK_FORMAT_A8B8G8R8_SSCALED_PACK32
:
617 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
619 case VK_FORMAT_A8B8G8R8_UINT_PACK32
:
620 #warning implement VK_FORMAT_A8B8G8R8_UINT_PACK32
622 .linearTilingFeatures
= 0,
623 .optimalTilingFeatures
= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT
624 | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR
625 | VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR
626 | VK_FORMAT_FEATURE_BLIT_SRC_BIT
627 | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT
628 | VK_FORMAT_FEATURE_BLIT_DST_BIT
,
629 .bufferFeatures
= VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT
630 | VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT
631 | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT
,
633 case VK_FORMAT_A8B8G8R8_SINT_PACK32
:
634 #warning implement VK_FORMAT_A8B8G8R8_SINT_PACK32
636 .linearTilingFeatures
= 0,
637 .optimalTilingFeatures
= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT
638 | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR
639 | VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR
640 | VK_FORMAT_FEATURE_BLIT_SRC_BIT
641 | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT
642 | VK_FORMAT_FEATURE_BLIT_DST_BIT
,
643 .bufferFeatures
= VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT
644 | VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT
645 | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT
,
647 case VK_FORMAT_A8B8G8R8_SRGB_PACK32
:
648 #warning implement VK_FORMAT_A8B8G8R8_SRGB_PACK32
650 .linearTilingFeatures
= 0,
651 .optimalTilingFeatures
= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT
652 | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR
653 | VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR
654 | VK_FORMAT_FEATURE_BLIT_SRC_BIT
655 | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT
656 | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT
657 | VK_FORMAT_FEATURE_BLIT_DST_BIT
658 | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT
,
661 case VK_FORMAT_A2R10G10B10_UNORM_PACK32
:
663 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
665 case VK_FORMAT_A2R10G10B10_SNORM_PACK32
:
667 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
669 case VK_FORMAT_A2R10G10B10_USCALED_PACK32
:
671 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
673 case VK_FORMAT_A2R10G10B10_SSCALED_PACK32
:
675 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
677 case VK_FORMAT_A2R10G10B10_UINT_PACK32
:
679 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
681 case VK_FORMAT_A2R10G10B10_SINT_PACK32
:
683 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
685 case VK_FORMAT_A2B10G10R10_UNORM_PACK32
:
686 #warning implement VK_FORMAT_A2B10G10R10_UNORM_PACK32
688 .linearTilingFeatures
= 0,
689 .optimalTilingFeatures
= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT
690 | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR
691 | VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR
692 | VK_FORMAT_FEATURE_BLIT_SRC_BIT
693 | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT
694 | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT
695 | VK_FORMAT_FEATURE_BLIT_DST_BIT
696 | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT
,
698 VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT
| VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT
,
700 case VK_FORMAT_A2B10G10R10_SNORM_PACK32
:
702 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
704 case VK_FORMAT_A2B10G10R10_USCALED_PACK32
:
706 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
708 case VK_FORMAT_A2B10G10R10_SSCALED_PACK32
:
710 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
712 case VK_FORMAT_A2B10G10R10_UINT_PACK32
:
713 #warning implement VK_FORMAT_A2B10G10R10_UINT_PACK32
715 .linearTilingFeatures
= 0,
716 .optimalTilingFeatures
= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT
717 | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR
718 | VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR
719 | VK_FORMAT_FEATURE_BLIT_SRC_BIT
720 | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT
721 | VK_FORMAT_FEATURE_BLIT_DST_BIT
,
722 .bufferFeatures
= VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT
,
724 case VK_FORMAT_A2B10G10R10_SINT_PACK32
:
726 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
728 case VK_FORMAT_R16_UNORM
:
729 #warning implement VK_FORMAT_R16_UNORM
731 .linearTilingFeatures
= 0,
732 .optimalTilingFeatures
= 0,
733 .bufferFeatures
= VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT
,
735 case VK_FORMAT_R16_SNORM
:
736 #warning implement VK_FORMAT_R16_SNORM
738 .linearTilingFeatures
= 0,
739 .optimalTilingFeatures
= 0,
740 .bufferFeatures
= VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT
,
742 case VK_FORMAT_R16_USCALED
:
744 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
746 case VK_FORMAT_R16_SSCALED
:
748 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
750 case VK_FORMAT_R16_UINT
:
751 #warning implement VK_FORMAT_R16_UINT
753 .linearTilingFeatures
= 0,
754 .optimalTilingFeatures
= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT
755 | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR
756 | VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR
757 | VK_FORMAT_FEATURE_BLIT_SRC_BIT
758 | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT
759 | VK_FORMAT_FEATURE_BLIT_DST_BIT
,
761 VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT
| VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT
,
763 case VK_FORMAT_R16_SINT
:
764 #warning implement VK_FORMAT_R16_SINT
766 .linearTilingFeatures
= 0,
767 .optimalTilingFeatures
= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT
768 | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR
769 | VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR
770 | VK_FORMAT_FEATURE_BLIT_SRC_BIT
771 | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT
772 | VK_FORMAT_FEATURE_BLIT_DST_BIT
,
774 VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT
| VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT
,
776 case VK_FORMAT_R16_SFLOAT
:
777 #warning implement VK_FORMAT_R16_SFLOAT
779 .linearTilingFeatures
= 0,
780 .optimalTilingFeatures
= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT
781 | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR
782 | VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR
783 | VK_FORMAT_FEATURE_BLIT_SRC_BIT
784 | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT
785 | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT
786 | VK_FORMAT_FEATURE_BLIT_DST_BIT
787 | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT
,
789 VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT
| VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT
,
791 case VK_FORMAT_R16G16_UNORM
:
792 #warning implement VK_FORMAT_R16G16_UNORM
794 .linearTilingFeatures
= 0,
795 .optimalTilingFeatures
= 0,
796 .bufferFeatures
= VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT
,
798 case VK_FORMAT_R16G16_SNORM
:
799 #warning implement VK_FORMAT_R16G16_SNORM
801 .linearTilingFeatures
= 0,
802 .optimalTilingFeatures
= 0,
803 .bufferFeatures
= VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT
,
805 case VK_FORMAT_R16G16_USCALED
:
807 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
809 case VK_FORMAT_R16G16_SSCALED
:
811 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
813 case VK_FORMAT_R16G16_UINT
:
814 #warning implement VK_FORMAT_R16G16_UINT
816 .linearTilingFeatures
= 0,
817 .optimalTilingFeatures
= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT
818 | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR
819 | VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR
820 | VK_FORMAT_FEATURE_BLIT_SRC_BIT
821 | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT
822 | VK_FORMAT_FEATURE_BLIT_DST_BIT
,
824 VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT
| VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT
,
826 case VK_FORMAT_R16G16_SINT
:
827 #warning implement VK_FORMAT_R16G16_SINT
829 .linearTilingFeatures
= 0,
830 .optimalTilingFeatures
= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT
831 | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR
832 | VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR
833 | VK_FORMAT_FEATURE_BLIT_SRC_BIT
834 | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT
835 | VK_FORMAT_FEATURE_BLIT_DST_BIT
,
837 VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT
| VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT
,
839 case VK_FORMAT_R16G16_SFLOAT
:
840 #warning implement VK_FORMAT_R16G16_SFLOAT
842 .linearTilingFeatures
= 0,
843 .optimalTilingFeatures
= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT
844 | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR
845 | VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR
846 | VK_FORMAT_FEATURE_BLIT_SRC_BIT
847 | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT
848 | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT
849 | VK_FORMAT_FEATURE_BLIT_DST_BIT
850 | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT
,
852 VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT
| VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT
,
854 case VK_FORMAT_R16G16B16_UNORM
:
856 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
858 case VK_FORMAT_R16G16B16_SNORM
:
860 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
862 case VK_FORMAT_R16G16B16_USCALED
:
864 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
866 case VK_FORMAT_R16G16B16_SSCALED
:
868 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
870 case VK_FORMAT_R16G16B16_UINT
:
872 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
874 case VK_FORMAT_R16G16B16_SINT
:
876 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
878 case VK_FORMAT_R16G16B16_SFLOAT
:
880 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
882 case VK_FORMAT_R16G16B16A16_UNORM
:
883 #warning implement VK_FORMAT_R16G16B16A16_UNORM
885 .linearTilingFeatures
= 0,
886 .optimalTilingFeatures
= 0,
887 .bufferFeatures
= VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT
,
889 case VK_FORMAT_R16G16B16A16_SNORM
:
890 #warning implement VK_FORMAT_R16G16B16A16_SNORM
892 .linearTilingFeatures
= 0,
893 .optimalTilingFeatures
= 0,
894 .bufferFeatures
= VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT
,
896 case VK_FORMAT_R16G16B16A16_USCALED
:
898 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
900 case VK_FORMAT_R16G16B16A16_SSCALED
:
902 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
904 case VK_FORMAT_R16G16B16A16_UINT
:
905 #warning implement VK_FORMAT_R16G16B16A16_UINT
907 .linearTilingFeatures
= 0,
908 .optimalTilingFeatures
= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT
909 | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR
910 | VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR
911 | VK_FORMAT_FEATURE_BLIT_SRC_BIT
912 | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT
913 | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT
914 | VK_FORMAT_FEATURE_BLIT_DST_BIT
,
915 .bufferFeatures
= VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT
916 | VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT
917 | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT
,
919 case VK_FORMAT_R16G16B16A16_SINT
:
920 #warning implement VK_FORMAT_R16G16B16A16_SINT
922 .linearTilingFeatures
= 0,
923 .optimalTilingFeatures
= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT
924 | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR
925 | VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR
926 | VK_FORMAT_FEATURE_BLIT_SRC_BIT
927 | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT
928 | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT
929 | VK_FORMAT_FEATURE_BLIT_DST_BIT
,
930 .bufferFeatures
= VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT
931 | VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT
932 | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT
,
934 case VK_FORMAT_R16G16B16A16_SFLOAT
:
935 #warning implement VK_FORMAT_R16G16B16A16_SFLOAT
937 .linearTilingFeatures
= 0,
938 .optimalTilingFeatures
= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT
939 | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR
940 | VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR
941 | VK_FORMAT_FEATURE_BLIT_SRC_BIT
942 | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT
943 | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT
944 | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT
945 | VK_FORMAT_FEATURE_BLIT_DST_BIT
946 | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT
,
947 .bufferFeatures
= VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT
948 | VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT
949 | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT
,
951 case VK_FORMAT_R32_UINT
:
952 #warning implement VK_FORMAT_R32_UINT
954 .linearTilingFeatures
= 0,
955 .optimalTilingFeatures
= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT
956 | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR
957 | VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR
958 | VK_FORMAT_FEATURE_BLIT_SRC_BIT
959 | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT
960 | VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT
961 | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT
962 | VK_FORMAT_FEATURE_BLIT_DST_BIT
,
963 .bufferFeatures
= VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT
964 | VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT
965 | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT
966 | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT
,
968 case VK_FORMAT_R32_SINT
:
969 #warning implement VK_FORMAT_R32_SINT
971 .linearTilingFeatures
= 0,
972 .optimalTilingFeatures
= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT
973 | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR
974 | VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR
975 | VK_FORMAT_FEATURE_BLIT_SRC_BIT
976 | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT
977 | VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT
978 | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT
979 | VK_FORMAT_FEATURE_BLIT_DST_BIT
,
980 .bufferFeatures
= VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT
981 | VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT
982 | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT
983 | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT
,
985 case VK_FORMAT_R32_SFLOAT
:
986 #warning implement VK_FORMAT_R32_SFLOAT
988 .linearTilingFeatures
= 0,
989 .optimalTilingFeatures
= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT
990 | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR
991 | VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR
992 | VK_FORMAT_FEATURE_BLIT_SRC_BIT
993 | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT
994 | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT
995 | VK_FORMAT_FEATURE_BLIT_DST_BIT
,
996 .bufferFeatures
= VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT
997 | VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT
998 | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT
,
1000 case VK_FORMAT_R32G32_UINT
:
1001 #warning implement VK_FORMAT_R32G32_UINT
1003 .linearTilingFeatures
= 0,
1004 .optimalTilingFeatures
= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT
1005 | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR
1006 | VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR
1007 | VK_FORMAT_FEATURE_BLIT_SRC_BIT
1008 | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT
1009 | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT
1010 | VK_FORMAT_FEATURE_BLIT_DST_BIT
,
1011 .bufferFeatures
= VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT
1012 | VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT
1013 | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT
,
1015 case VK_FORMAT_R32G32_SINT
:
1016 #warning implement VK_FORMAT_R32G32_SINT
1018 .linearTilingFeatures
= 0,
1019 .optimalTilingFeatures
= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT
1020 | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR
1021 | VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR
1022 | VK_FORMAT_FEATURE_BLIT_SRC_BIT
1023 | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT
1024 | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT
1025 | VK_FORMAT_FEATURE_BLIT_DST_BIT
,
1026 .bufferFeatures
= VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT
1027 | VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT
1028 | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT
,
1030 case VK_FORMAT_R32G32_SFLOAT
:
1031 #warning implement VK_FORMAT_R32G32_SFLOAT
1033 .linearTilingFeatures
= 0,
1034 .optimalTilingFeatures
= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT
1035 | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR
1036 | VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR
1037 | VK_FORMAT_FEATURE_BLIT_SRC_BIT
1038 | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT
1039 | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT
1040 | VK_FORMAT_FEATURE_BLIT_DST_BIT
,
1041 .bufferFeatures
= VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT
1042 | VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT
1043 | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT
,
1045 case VK_FORMAT_R32G32B32_UINT
:
1046 #warning implement VK_FORMAT_R32G32B32_UINT
1048 .linearTilingFeatures
= 0,
1049 .optimalTilingFeatures
= 0,
1050 .bufferFeatures
= VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT
,
1052 case VK_FORMAT_R32G32B32_SINT
:
1053 #warning implement VK_FORMAT_R32G32B32_SINT
1055 .linearTilingFeatures
= 0,
1056 .optimalTilingFeatures
= 0,
1057 .bufferFeatures
= VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT
,
1059 case VK_FORMAT_R32G32B32_SFLOAT
:
1060 #warning implement VK_FORMAT_R32G32B32_SFLOAT
1062 .linearTilingFeatures
= 0,
1063 .optimalTilingFeatures
= 0,
1064 .bufferFeatures
= VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT
,
1066 case VK_FORMAT_R32G32B32A32_UINT
:
1067 #warning implement VK_FORMAT_R32G32B32A32_UINT
1069 .linearTilingFeatures
= 0,
1070 .optimalTilingFeatures
= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT
1071 | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR
1072 | VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR
1073 | VK_FORMAT_FEATURE_BLIT_SRC_BIT
1074 | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT
1075 | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT
1076 | VK_FORMAT_FEATURE_BLIT_DST_BIT
,
1077 .bufferFeatures
= VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT
1078 | VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT
1079 | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT
,
1081 case VK_FORMAT_R32G32B32A32_SINT
:
1082 #warning implement VK_FORMAT_R32G32B32A32_SINT
1084 .linearTilingFeatures
= 0,
1085 .optimalTilingFeatures
= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT
1086 | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR
1087 | VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR
1088 | VK_FORMAT_FEATURE_BLIT_SRC_BIT
1089 | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT
1090 | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT
1091 | VK_FORMAT_FEATURE_BLIT_DST_BIT
,
1092 .bufferFeatures
= VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT
1093 | VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT
1094 | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT
,
1096 case VK_FORMAT_R32G32B32A32_SFLOAT
:
1097 #warning implement VK_FORMAT_R32G32B32A32_SFLOAT
1099 .linearTilingFeatures
= 0,
1100 .optimalTilingFeatures
= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT
1101 | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR
1102 | VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR
1103 | VK_FORMAT_FEATURE_BLIT_SRC_BIT
1104 | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT
1105 | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT
1106 | VK_FORMAT_FEATURE_BLIT_DST_BIT
,
1107 .bufferFeatures
= VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT
1108 | VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT
1109 | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT
,
1111 case VK_FORMAT_R64_UINT
:
1113 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1115 case VK_FORMAT_R64_SINT
:
1117 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1119 case VK_FORMAT_R64_SFLOAT
:
1121 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1123 case VK_FORMAT_R64G64_UINT
:
1125 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1127 case VK_FORMAT_R64G64_SINT
:
1129 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1131 case VK_FORMAT_R64G64_SFLOAT
:
1133 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1135 case VK_FORMAT_R64G64B64_UINT
:
1137 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1139 case VK_FORMAT_R64G64B64_SINT
:
1141 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1143 case VK_FORMAT_R64G64B64_SFLOAT
:
1145 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1147 case VK_FORMAT_R64G64B64A64_UINT
:
1149 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1151 case VK_FORMAT_R64G64B64A64_SINT
:
1153 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1155 case VK_FORMAT_R64G64B64A64_SFLOAT
:
1157 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1159 case VK_FORMAT_B10G11R11_UFLOAT_PACK32
:
1160 #warning implement VK_FORMAT_B10G11R11_UFLOAT_PACK32
1162 .linearTilingFeatures
= 0,
1163 .optimalTilingFeatures
= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT
1164 | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR
1165 | VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR
1166 | VK_FORMAT_FEATURE_BLIT_SRC_BIT
1167 | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT
,
1168 .bufferFeatures
= VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT
,
1170 case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32
:
1171 #warning implement VK_FORMAT_E5B9G9R9_UFLOAT_PACK32
1173 .linearTilingFeatures
= 0,
1174 .optimalTilingFeatures
= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT
1175 | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR
1176 | VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR
1177 | VK_FORMAT_FEATURE_BLIT_SRC_BIT
1178 | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT
,
1179 .bufferFeatures
= 0,
1181 case VK_FORMAT_D16_UNORM
:
1182 #warning implement VK_FORMAT_D16_UNORM
1184 .linearTilingFeatures
= 0,
1185 .optimalTilingFeatures
= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT
1186 | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR
1187 | VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR
1188 | VK_FORMAT_FEATURE_BLIT_SRC_BIT
1189 | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT
,
1190 .bufferFeatures
= 0,
1192 case VK_FORMAT_X8_D24_UNORM_PACK32
:
1194 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1196 case VK_FORMAT_D32_SFLOAT
:
1198 .linearTilingFeatures
= 0,
1199 .optimalTilingFeatures
= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT
1200 | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR
1201 | VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR
1202 | VK_FORMAT_FEATURE_BLIT_SRC_BIT
1203 | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT
,
1204 .bufferFeatures
= 0,
1206 case VK_FORMAT_S8_UINT
:
1208 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1210 case VK_FORMAT_D16_UNORM_S8_UINT
:
1212 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1214 case VK_FORMAT_D24_UNORM_S8_UINT
:
1216 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1218 case VK_FORMAT_D32_SFLOAT_S8_UINT
:
1219 #warning implement VK_FORMAT_D32_SFLOAT_S8_UINT
1221 .linearTilingFeatures
= 0,
1222 .optimalTilingFeatures
= VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT
,
1223 .bufferFeatures
= 0,
1225 case VK_FORMAT_BC1_RGB_UNORM_BLOCK
:
1226 #warning implement compressed image formats
1228 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1230 case VK_FORMAT_BC1_RGB_SRGB_BLOCK
:
1232 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1234 case VK_FORMAT_BC1_RGBA_UNORM_BLOCK
:
1236 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1238 case VK_FORMAT_BC1_RGBA_SRGB_BLOCK
:
1240 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1242 case VK_FORMAT_BC2_UNORM_BLOCK
:
1244 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1246 case VK_FORMAT_BC2_SRGB_BLOCK
:
1248 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1250 case VK_FORMAT_BC3_UNORM_BLOCK
:
1252 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1254 case VK_FORMAT_BC3_SRGB_BLOCK
:
1256 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1258 case VK_FORMAT_BC4_UNORM_BLOCK
:
1260 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1262 case VK_FORMAT_BC4_SNORM_BLOCK
:
1264 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1266 case VK_FORMAT_BC5_UNORM_BLOCK
:
1268 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1270 case VK_FORMAT_BC5_SNORM_BLOCK
:
1272 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1274 case VK_FORMAT_BC6H_UFLOAT_BLOCK
:
1276 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1278 case VK_FORMAT_BC6H_SFLOAT_BLOCK
:
1280 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1282 case VK_FORMAT_BC7_UNORM_BLOCK
:
1284 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1286 case VK_FORMAT_BC7_SRGB_BLOCK
:
1288 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1290 case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK
:
1292 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1294 case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK
:
1296 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1298 case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK
:
1300 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1302 case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK
:
1304 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1306 case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK
:
1308 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1310 case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK
:
1312 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1314 case VK_FORMAT_EAC_R11_UNORM_BLOCK
:
1316 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1318 case VK_FORMAT_EAC_R11_SNORM_BLOCK
:
1320 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1322 case VK_FORMAT_EAC_R11G11_UNORM_BLOCK
:
1324 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1326 case VK_FORMAT_EAC_R11G11_SNORM_BLOCK
:
1328 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1330 case VK_FORMAT_ASTC_4x4_UNORM_BLOCK
:
1332 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1334 case VK_FORMAT_ASTC_4x4_SRGB_BLOCK
:
1336 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1338 case VK_FORMAT_ASTC_5x4_UNORM_BLOCK
:
1340 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1342 case VK_FORMAT_ASTC_5x4_SRGB_BLOCK
:
1344 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1346 case VK_FORMAT_ASTC_5x5_UNORM_BLOCK
:
1348 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1350 case VK_FORMAT_ASTC_5x5_SRGB_BLOCK
:
1352 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1354 case VK_FORMAT_ASTC_6x5_UNORM_BLOCK
:
1356 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1358 case VK_FORMAT_ASTC_6x5_SRGB_BLOCK
:
1360 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1362 case VK_FORMAT_ASTC_6x6_UNORM_BLOCK
:
1364 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1366 case VK_FORMAT_ASTC_6x6_SRGB_BLOCK
:
1368 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1370 case VK_FORMAT_ASTC_8x5_UNORM_BLOCK
:
1372 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1374 case VK_FORMAT_ASTC_8x5_SRGB_BLOCK
:
1376 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1378 case VK_FORMAT_ASTC_8x6_UNORM_BLOCK
:
1380 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1382 case VK_FORMAT_ASTC_8x6_SRGB_BLOCK
:
1384 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1386 case VK_FORMAT_ASTC_8x8_UNORM_BLOCK
:
1388 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1390 case VK_FORMAT_ASTC_8x8_SRGB_BLOCK
:
1392 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1394 case VK_FORMAT_ASTC_10x5_UNORM_BLOCK
:
1396 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1398 case VK_FORMAT_ASTC_10x5_SRGB_BLOCK
:
1400 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1402 case VK_FORMAT_ASTC_10x6_UNORM_BLOCK
:
1404 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1406 case VK_FORMAT_ASTC_10x6_SRGB_BLOCK
:
1408 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1410 case VK_FORMAT_ASTC_10x8_UNORM_BLOCK
:
1412 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1414 case VK_FORMAT_ASTC_10x8_SRGB_BLOCK
:
1416 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1418 case VK_FORMAT_ASTC_10x10_UNORM_BLOCK
:
1420 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1422 case VK_FORMAT_ASTC_10x10_SRGB_BLOCK
:
1424 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1426 case VK_FORMAT_ASTC_12x10_UNORM_BLOCK
:
1428 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1430 case VK_FORMAT_ASTC_12x10_SRGB_BLOCK
:
1432 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1434 case VK_FORMAT_ASTC_12x12_UNORM_BLOCK
:
1436 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1438 case VK_FORMAT_ASTC_12x12_SRGB_BLOCK
:
1440 .linearTilingFeatures
= 0, .optimalTilingFeatures
= 0, .bufferFeatures
= 0,
1442 case VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG
:
1443 case VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG
:
1444 case VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG
:
1445 case VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG
:
1446 case VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG
:
1447 case VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG
:
1448 case VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG
:
1449 case VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG
:
1450 case VK_FORMAT_RANGE_SIZE
:
1451 case VK_FORMAT_MAX_ENUM
:
1454 assert(!"invalid format enum");
1458 template <typename Object_type
, typename Vulkan_handle_type
>
1459 struct Vulkan_dispatchable_object
1461 VK_LOADER_DATA vulkan_loader_data
{.loaderMagic
= ICD_LOADER_MAGIC
};
1462 typedef Vulkan_handle_type Vulkan_handle
;
1463 typedef Object_type Object
;
1464 static Object_type
*from_handle(Vulkan_handle_type v
) noexcept
1466 return static_cast<Object_type
*>(reinterpret_cast<Vulkan_dispatchable_object
*>(v
));
1468 static std::unique_ptr
<Object_type
> move_from_handle(Vulkan_handle_type v
) noexcept
1470 return std::unique_ptr
<Object_type
>(from_handle(v
));
1474 template <typename Object_type
, typename Vulkan_handle_type
>
1475 struct Vulkan_nondispatchable_object
1477 typedef Vulkan_handle_type Vulkan_handle
;
1478 typedef Object_type Object
;
1479 static Object_type
*from_handle(Vulkan_handle_type v
) noexcept
1481 return static_cast<Object_type
*>(reinterpret_cast<Vulkan_nondispatchable_object
*>(v
));
1483 static std::unique_ptr
<Object_type
> move_from_handle(Vulkan_handle_type v
) noexcept
1485 return std::unique_ptr
<Object_type
>(from_handle(v
));
1489 template <typename Object_type
>
1491 enable_if
<std::is_base_of
<Vulkan_dispatchable_object
<Object_type
,
1492 typename
Object_type::Vulkan_handle
>,
1493 Object_type
>::value
,
1494 typename
Object_type::Vulkan_handle
>::type
1495 to_handle(Object_type
*object
) noexcept
1497 return reinterpret_cast<typename
Object_type::Vulkan_handle
>(
1498 static_cast<Vulkan_dispatchable_object
<Object_type
, typename
Object_type::Vulkan_handle
> *>(
1502 template <typename Object_type
>
1503 decltype(to_handle(static_cast<Object_type
*>(nullptr))) move_to_handle(
1504 std::unique_ptr
<Object_type
> v
) noexcept
1506 return to_handle(v
.release());
1509 template <typename Object_type
, typename
= void>
1511 enable_if
<std::is_base_of
<Vulkan_nondispatchable_object
<Object_type
,
1512 typename
Object_type::Vulkan_handle
>,
1513 Object_type
>::value
,
1514 typename
Object_type::Vulkan_handle
>::type
1515 to_handle(Object_type
*object
) noexcept
1517 return reinterpret_cast<typename
Object_type::Vulkan_handle
>(
1518 static_cast<Vulkan_nondispatchable_object
<Object_type
, typename
Object_type::Vulkan_handle
>
1522 struct Vulkan_instance
;
1524 struct Vulkan_physical_device
1525 : public Vulkan_dispatchable_object
<Vulkan_physical_device
, VkPhysicalDevice
>
1527 Vulkan_instance
&instance
;
1528 VkPhysicalDeviceProperties properties
;
1529 static constexpr std::size_t queue_family_property_count
= 1;
1530 VkQueueFamilyProperties queue_family_properties
[queue_family_property_count
];
1531 VkPhysicalDeviceMemoryProperties memory_properties
;
1532 VkPhysicalDeviceFeatures features
;
1533 static VkDeviceSize
calculate_heap_size() noexcept
1535 std::uintmax_t total_usable_ram
= util::System_memory_info::get().total_usable_ram
;
1536 constexpr std::uintmax_t transition_memory_size
= 4ULL << 30; // 4 GiB
1537 std::uintmax_t heap_size
;
1538 if(total_usable_ram
>= transition_memory_size
)
1539 heap_size
= total_usable_ram
* 3 / 4;
1541 heap_size
= total_usable_ram
/ 2;
1542 if(heap_size
> std::numeric_limits
<VkDeviceSize
>::max())
1543 heap_size
= std::numeric_limits
<VkDeviceSize
>::max();
1546 Vulkan_physical_device(Vulkan_instance
&instance
) noexcept
1547 : instance(instance
),
1549 .apiVersion
= VK_MAKE_VERSION(1, 0, VK_HEADER_VERSION
),
1551 .vendorID
= 0x10003UL
,
1553 .deviceType
= VK_PHYSICAL_DEVICE_TYPE_CPU
,
1554 .deviceName
= "Kazan Software Renderer",
1555 #warning calculate the correct value of pipelineCacheUUID as the hash of the target cpu info and the hashed source code
1556 .pipelineCacheUUID
= {},
1559 .maxImageDimension1D
= 1UL << 20,
1560 .maxImageDimension2D
= 1UL << 20,
1561 .maxImageDimension3D
= 1UL << 20,
1562 .maxImageDimensionCube
= 1UL << 20,
1563 .maxImageArrayLayers
= static_cast<std::uint32_t>(-1),
1564 .maxTexelBufferElements
= static_cast<std::uint32_t>(-1),
1565 .maxUniformBufferRange
= static_cast<std::uint32_t>(-1),
1566 .maxStorageBufferRange
= static_cast<std::uint32_t>(-1),
1567 .maxPushConstantsSize
= static_cast<std::uint32_t>(-1),
1568 .maxMemoryAllocationCount
= static_cast<std::uint32_t>(-1),
1569 .maxSamplerAllocationCount
= static_cast<std::uint32_t>(-1),
1570 .bufferImageGranularity
= 1,
1571 .sparseAddressSpaceSize
= 0,
1572 .maxBoundDescriptorSets
= static_cast<std::uint32_t>(-1),
1573 .maxPerStageDescriptorSamplers
= static_cast<std::uint32_t>(-1),
1574 .maxPerStageDescriptorUniformBuffers
= static_cast<std::uint32_t>(-1),
1575 .maxPerStageDescriptorStorageBuffers
= static_cast<std::uint32_t>(-1),
1576 .maxPerStageDescriptorSampledImages
= static_cast<std::uint32_t>(-1),
1577 .maxPerStageDescriptorStorageImages
= static_cast<std::uint32_t>(-1),
1578 .maxPerStageDescriptorInputAttachments
= static_cast<std::uint32_t>(-1),
1579 .maxPerStageResources
= static_cast<std::uint32_t>(-1),
1580 .maxDescriptorSetSamplers
= static_cast<std::uint32_t>(-1),
1581 .maxDescriptorSetUniformBuffers
= static_cast<std::uint32_t>(-1),
1582 .maxDescriptorSetUniformBuffersDynamic
= static_cast<std::uint32_t>(-1),
1583 .maxDescriptorSetStorageBuffers
= static_cast<std::uint32_t>(-1),
1584 .maxDescriptorSetStorageBuffersDynamic
= static_cast<std::uint32_t>(-1),
1585 .maxDescriptorSetSampledImages
= static_cast<std::uint32_t>(-1),
1586 .maxDescriptorSetStorageImages
= static_cast<std::uint32_t>(-1),
1587 .maxDescriptorSetInputAttachments
= static_cast<std::uint32_t>(-1),
1588 .maxVertexInputAttributes
= static_cast<std::uint32_t>(-1),
1589 .maxVertexInputBindings
= static_cast<std::uint32_t>(-1),
1590 .maxVertexInputAttributeOffset
= static_cast<std::uint32_t>(-1),
1591 .maxVertexInputBindingStride
= static_cast<std::uint32_t>(-1),
1592 .maxVertexOutputComponents
= static_cast<std::uint32_t>(-1),
1593 .maxTessellationGenerationLevel
= 0,
1594 .maxTessellationPatchSize
= 0,
1595 .maxTessellationControlPerVertexInputComponents
= 0,
1596 .maxTessellationControlPerVertexOutputComponents
= 0,
1597 .maxTessellationControlPerPatchOutputComponents
= 0,
1598 .maxTessellationControlTotalOutputComponents
= 0,
1599 .maxTessellationEvaluationInputComponents
= 0,
1600 .maxTessellationEvaluationOutputComponents
= 0,
1601 .maxGeometryShaderInvocations
= 0,
1602 .maxGeometryInputComponents
= 0,
1603 .maxGeometryOutputComponents
= 0,
1604 .maxGeometryOutputVertices
= 0,
1605 .maxGeometryTotalOutputComponents
= 0,
1606 .maxFragmentInputComponents
= static_cast<std::uint32_t>(-1),
1607 .maxFragmentOutputAttachments
= static_cast<std::uint32_t>(-1),
1608 .maxFragmentDualSrcAttachments
= 0,
1609 .maxFragmentCombinedOutputResources
= static_cast<std::uint32_t>(-1),
1610 .maxComputeSharedMemorySize
= static_cast<std::uint32_t>(-1),
1611 .maxComputeWorkGroupCount
=
1613 static_cast<std::uint32_t>(-1),
1614 static_cast<std::uint32_t>(-1),
1615 static_cast<std::uint32_t>(-1),
1617 .maxComputeWorkGroupInvocations
= static_cast<std::uint32_t>(-1),
1618 .maxComputeWorkGroupSize
=
1620 static_cast<std::uint32_t>(-1),
1621 static_cast<std::uint32_t>(-1),
1622 static_cast<std::uint32_t>(-1),
1624 .subPixelPrecisionBits
= 16,
1625 .subTexelPrecisionBits
= 8,
1626 .mipmapPrecisionBits
= 8,
1627 .maxDrawIndexedIndexValue
= static_cast<std::uint32_t>(-1),
1628 .maxDrawIndirectCount
= static_cast<std::uint32_t>(-1),
1629 .maxSamplerLodBias
= 65536.0f
,
1630 .maxSamplerAnisotropy
= 1,
1632 .maxViewportDimensions
=
1634 1UL << 20, 1UL << 20,
1636 .viewportBoundsRange
=
1638 static_cast<float>(-1) * (1UL << 21), 1UL << 21,
1640 .viewportSubPixelBits
= 16,
1641 .minMemoryMapAlignment
= 64,
1642 .minTexelBufferOffsetAlignment
= alignof(std::max_align_t
),
1643 .minUniformBufferOffsetAlignment
= alignof(std::max_align_t
),
1644 .minStorageBufferOffsetAlignment
= alignof(std::max_align_t
),
1645 .minTexelOffset
= std::numeric_limits
<std::int32_t>::min(),
1646 .maxTexelOffset
= std::numeric_limits
<std::int32_t>::max(),
1647 .minTexelGatherOffset
= 0,
1648 .maxTexelGatherOffset
= 0,
1649 .minInterpolationOffset
= 0,
1650 .maxInterpolationOffset
= 0,
1651 .subPixelInterpolationOffsetBits
= 0,
1652 .maxFramebufferWidth
= 1UL << 20,
1653 .maxFramebufferHeight
= 1UL << 20,
1654 .maxFramebufferLayers
= static_cast<std::uint32_t>(-1),
1655 #warning fix up sample counts after adding multisampling
1656 .framebufferColorSampleCounts
= VK_SAMPLE_COUNT_1_BIT
,
1657 .framebufferDepthSampleCounts
= VK_SAMPLE_COUNT_1_BIT
,
1658 .framebufferStencilSampleCounts
= VK_SAMPLE_COUNT_1_BIT
,
1659 .framebufferNoAttachmentsSampleCounts
= VK_SAMPLE_COUNT_1_BIT
,
1660 .maxColorAttachments
= static_cast<std::uint32_t>(-1),
1661 .sampledImageColorSampleCounts
= VK_SAMPLE_COUNT_1_BIT
,
1662 .sampledImageIntegerSampleCounts
= VK_SAMPLE_COUNT_1_BIT
,
1663 .sampledImageDepthSampleCounts
= VK_SAMPLE_COUNT_1_BIT
,
1664 .sampledImageStencilSampleCounts
= VK_SAMPLE_COUNT_1_BIT
,
1665 .storageImageSampleCounts
= VK_SAMPLE_COUNT_1_BIT
,
1666 .maxSampleMaskWords
= 1,
1667 .timestampComputeAndGraphics
= true,
1669 std::chrono::duration_cast
<std::chrono::duration
<double, std::nano
>>(
1670 std::chrono::steady_clock::duration(1))
1672 .maxClipDistances
= 0,
1673 .maxCullDistances
= 0,
1674 .maxCombinedClipAndCullDistances
= 0,
1675 .discreteQueuePriorities
= 2,
1684 .pointSizeGranularity
= 0,
1685 .lineWidthGranularity
= 0,
1686 #warning update strictLines when the line rasterizer is implemented
1687 .strictLines
= true,
1688 .standardSampleLocations
= true,
1689 .optimalBufferCopyOffsetAlignment
= 16,
1690 .optimalBufferCopyRowPitchAlignment
= 16,
1691 .nonCoherentAtomSize
= 1,
1695 #warning update upon implementation of sparse memory
1696 .residencyStandard2DBlockShape
= false,
1697 .residencyStandard2DMultisampleBlockShape
= false,
1698 .residencyStandard3DBlockShape
= false,
1699 .residencyAlignedMipSize
= false,
1700 .residencyNonResidentStrict
= false,
1703 queue_family_properties
{
1705 .queueFlags
= VK_QUEUE_GRAPHICS_BIT
| VK_QUEUE_COMPUTE_BIT
,
1707 .timestampValidBits
= std::numeric_limits
<std::chrono::steady_clock::rep
>::digits
1708 + 1, // 1 extra for sign bit
1709 .minImageTransferGranularity
=
1716 .memoryTypeCount
= 1,
1720 .propertyFlags
= VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT
1721 | VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
1722 | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT
1723 | VK_MEMORY_PROPERTY_HOST_CACHED_BIT
,
1727 .memoryHeapCount
= 1,
1731 .size
= calculate_heap_size(), .flags
= VK_MEMORY_HEAP_DEVICE_LOCAL_BIT
,
1736 #warning implement robust buffer access
1737 .robustBufferAccess
= false,
1738 .fullDrawIndexUint32
= true,
1739 .imageCubeArray
= false,
1740 .independentBlend
= true,
1741 .geometryShader
= false,
1742 .tessellationShader
= false,
1743 .sampleRateShading
= false,
1744 .dualSrcBlend
= false,
1746 .multiDrawIndirect
= true,
1747 .drawIndirectFirstInstance
= true,
1748 .depthClamp
= false,
1749 .depthBiasClamp
= false,
1750 .fillModeNonSolid
= false,
1751 .depthBounds
= false,
1753 .largePoints
= false,
1754 .alphaToOne
= false,
1755 .multiViewport
= false,
1756 .samplerAnisotropy
= false,
1757 .textureCompressionETC2
= false,
1758 .textureCompressionASTC_LDR
= false,
1759 .textureCompressionBC
= false,
1760 .occlusionQueryPrecise
= false,
1761 .pipelineStatisticsQuery
= false,
1762 .vertexPipelineStoresAndAtomics
= false,
1763 .fragmentStoresAndAtomics
= false,
1764 .shaderTessellationAndGeometryPointSize
= false,
1765 .shaderImageGatherExtended
= false,
1766 .shaderStorageImageExtendedFormats
= false,
1767 .shaderStorageImageMultisample
= false,
1768 .shaderStorageImageReadWithoutFormat
= false,
1769 .shaderStorageImageWriteWithoutFormat
= false,
1770 .shaderUniformBufferArrayDynamicIndexing
= true,
1771 .shaderSampledImageArrayDynamicIndexing
= true,
1772 .shaderStorageBufferArrayDynamicIndexing
= true,
1773 .shaderStorageImageArrayDynamicIndexing
= true,
1774 .shaderClipDistance
= false,
1775 .shaderCullDistance
= false,
1776 .shaderFloat64
= false,
1777 .shaderInt64
= true,
1778 .shaderInt16
= false,
1779 .shaderResourceResidency
= false,
1780 .shaderResourceMinLod
= false,
1781 .sparseBinding
= false,
1782 .sparseResidencyBuffer
= false,
1783 .sparseResidencyImage2D
= false,
1784 .sparseResidencyImage3D
= false,
1785 .sparseResidency2Samples
= false,
1786 .sparseResidency4Samples
= false,
1787 .sparseResidency8Samples
= false,
1788 .sparseResidency16Samples
= false,
1789 .sparseResidencyAliased
= false,
1790 .variableMultisampleRate
= false,
1791 .inheritedQueries
= false,
1797 struct Vulkan_instance
: public Vulkan_dispatchable_object
<Vulkan_instance
, VkInstance
>
1799 Vulkan_instance(const Vulkan_instance
&) = delete;
1800 Vulkan_instance
&operator=(const Vulkan_instance
&) = delete;
1804 std::string application_name
;
1805 std::uint32_t application_version
;
1806 std::string engine_name
;
1807 std::uint32_t engine_version
;
1808 std::uint32_t api_version
;
1809 App_info(std::string application_name
,
1810 std::uint32_t application_version
,
1811 std::string engine_name
,
1812 std::uint32_t engine_version
,
1813 std::uint32_t api_version
) noexcept
1814 : application_name(std::move(application_name
)),
1815 application_version(application_version
),
1816 engine_name(std::move(engine_name
)),
1817 engine_version(engine_version
),
1818 api_version(api_version
)
1821 explicit App_info(const VkApplicationInfo
&application_info
)
1823 application_info
.pApplicationName
? application_info
.pApplicationName
: ""),
1824 application_version(application_info
.applicationVersion
),
1825 engine_name(application_info
.pEngineName
? application_info
.pEngineName
: ""),
1826 engine_version(application_info
.engineVersion
),
1827 api_version(application_info
.apiVersion
)
1829 assert(application_info
.sType
== VK_STRUCTURE_TYPE_APPLICATION_INFO
);
1831 App_info() noexcept
: application_name(),
1832 application_version(),
1840 Supported_extensions extensions
;
1841 Vulkan_physical_device physical_device
;
1842 Vulkan_instance(App_info app_info
, Supported_extensions extensions
) noexcept
1843 : app_info(std::move(app_info
)),
1844 extensions(std::move(extensions
)),
1845 physical_device(*this)
1848 static util::variant
<std::unique_ptr
<Vulkan_instance
>, VkResult
> create(
1849 const VkInstanceCreateInfo
&create_info
);
1850 #warning finish implementing Vulkan_instance
1853 struct Vulkan_device
;
1855 struct Vulkan_semaphore
: public Vulkan_nondispatchable_object
<Vulkan_semaphore
, VkSemaphore
>
1857 void signal() // empty function for if semaphores are needed later
1860 void wait() // empty function for if semaphores are needed later
1863 static std::unique_ptr
<Vulkan_semaphore
> create(Vulkan_device
&device
,
1864 const VkSemaphoreCreateInfo
&create_info
);
1867 class Vulkan_fence
: public Vulkan_nondispatchable_object
<Vulkan_fence
, VkFence
>
1873 std::condition_variable cond
;
1874 std::uint32_t wait_count
;
1875 explicit Waiter(std::uint32_t wait_count
) : lock(), cond(), wait_count(wait_count
)
1878 void notify(bool notify_condition_variable
)
1880 std::unique_lock
<std::mutex
> lock_it(lock
);
1884 if(notify_condition_variable
&& wait_count
== 0)
1888 bool wait(util::optional
<std::chrono::steady_clock::time_point
> end_time
)
1890 std::unique_lock
<std::mutex
> lock_it(lock
);
1891 while(wait_count
!= 0)
1895 if(cond
.wait_until(lock_it
, *end_time
) == std::cv_status::timeout
)
1901 return wait_count
== 0;
1908 std::list
<Waiter
*> waiters
;
1911 explicit Vulkan_fence(VkFenceCreateFlags flags
)
1912 : lock(), signaled(flags
& VK_FENCE_CREATE_SIGNALED_BIT
), waiters()
1917 std::unique_lock
<std::mutex
> lock_it(lock
);
1920 void set_signaled(bool new_signaled
)
1922 std::unique_lock
<std::mutex
> lock_it(lock
);
1923 if(signaled
== new_signaled
)
1925 signaled
= new_signaled
;
1928 for(auto *waiter
: waiters
)
1929 waiter
->notify(true);
1938 set_signaled(false);
1940 static VkResult
wait_multiple(std::uint32_t fence_count
,
1941 const VkFence
*fences
,
1943 std::uint64_t timeout
);
1944 VkResult
wait(std::uint64_t timeout
)
1946 constexpr std::size_t fence_count
= 1;
1947 VkFence fences
[fence_count
] = {
1950 return wait_multiple(fence_count
, fences
, true, timeout
);
1952 static std::unique_ptr
<Vulkan_fence
> create(Vulkan_device
&device
,
1953 const VkFenceCreateInfo
&create_info
);
1956 struct Vulkan_device
: public Vulkan_dispatchable_object
<Vulkan_device
, VkDevice
>
1960 virtual ~Job() = default;
1961 virtual void run() noexcept
= 0;
1963 class Queue
: public Vulkan_dispatchable_object
<Queue
, VkQueue
>
1967 std::condition_variable cond
;
1968 util::Static_circular_deque
<std::unique_ptr
<Job
>, 0x10> jobs
;
1969 std::thread executor_thread
;
1974 void thread_fn() noexcept
1976 std::unique_lock
<std::mutex
> lock(mutex
);
1986 auto job
= std::move(jobs
.front());
1987 bool was_full
= jobs
.full();
1995 running_job
= false;
2000 Queue() : mutex(), cond(), jobs(), executor_thread(), quit(false), running_job(false)
2002 executor_thread
= std::thread(&Queue::thread_fn
, this);
2006 std::unique_lock
<std::mutex
> lock(mutex
);
2010 executor_thread
.join();
2014 bool is_idle(std::unique_lock
<std::mutex
> &lock
)
2026 std::unique_lock
<std::mutex
> lock(mutex
);
2027 return is_idle(lock
);
2031 std::unique_lock
<std::mutex
> lock(mutex
);
2032 while(!is_idle(lock
))
2035 void queue_job(std::unique_ptr
<Job
> job
)
2037 std::unique_lock
<std::mutex
> lock(mutex
);
2040 bool was_idle
= is_idle(lock
);
2041 jobs
.push_back(std::move(job
));
2045 void queue_fence_signal(Vulkan_fence
&fence
)
2047 struct Signal_fence_job final
: public Job
2049 Vulkan_fence
&fence
;
2050 explicit Signal_fence_job(Vulkan_fence
&fence
) noexcept
: fence(fence
)
2053 virtual void run() noexcept override
2058 queue_job(std::make_unique
<Signal_fence_job
>(fence
));
2061 Vulkan_instance
&instance
;
2062 Vulkan_physical_device
&physical_device
;
2063 VkPhysicalDeviceFeatures enabled_features
;
2064 static constexpr std::size_t queue_count
= 1;
2065 std::unique_ptr
<Queue
> queues
[queue_count
];
2066 Supported_extensions extensions
; // includes both device and instance extensions
2067 explicit Vulkan_device(Vulkan_physical_device
&physical_device
,
2068 const VkPhysicalDeviceFeatures
&enabled_features
,
2069 const Supported_extensions
&extensions
) noexcept
2070 : instance(physical_device
.instance
),
2071 physical_device(physical_device
),
2072 enabled_features(enabled_features
),
2074 extensions(extensions
)
2076 for(auto &queue
: queues
)
2077 queue
= std::make_unique
<Queue
>();
2081 for(auto &queue
: queues
)
2084 static util::variant
<std::unique_ptr
<Vulkan_device
>, VkResult
> create(
2085 Vulkan_physical_device
&physical_device
, const VkDeviceCreateInfo
&create_info
);
2088 struct Vulkan_image_descriptor
2090 static constexpr VkImageCreateFlags supported_flags
=
2091 VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT
| VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT
;
2092 VkImageCreateFlags flags
;
2096 std::uint32_t mip_levels
;
2097 std::uint32_t array_layers
;
2098 static constexpr VkSampleCountFlags supported_samples
= VK_SAMPLE_COUNT_1_BIT
;
2099 VkSampleCountFlagBits samples
;
2100 VkImageTiling tiling
;
2101 constexpr Vulkan_image_descriptor() noexcept
: flags(),
2111 constexpr explicit Vulkan_image_descriptor(const VkImageCreateInfo
&image_create_info
) noexcept
2112 : flags(image_create_info
.flags
),
2113 type(image_create_info
.imageType
),
2114 format(image_create_info
.format
),
2115 extent(image_create_info
.extent
),
2116 mip_levels(image_create_info
.mipLevels
),
2117 array_layers(image_create_info
.arrayLayers
),
2118 samples(image_create_info
.samples
),
2119 tiling(image_create_info
.tiling
)
2121 assert(image_create_info
.sType
== VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO
);
2122 assert((flags
& ~supported_flags
) == 0);
2123 assert((samples
& ~supported_samples
) == 0);
2124 assert(extent
.width
> 0);
2125 assert(extent
.height
> 0);
2126 assert(extent
.depth
> 0);
2128 #warning finish implementing Image
2129 assert(type
== VK_IMAGE_TYPE_2D
&& "unimplemented image type");
2130 assert(extent
.depth
== 1);
2132 assert(format
== VK_FORMAT_B8G8R8A8_UNORM
&& "unimplemented image format");
2133 assert(mip_levels
== 1 && "mipmapping is unimplemented");
2134 assert(array_layers
== 1 && "array images are unimplemented");
2135 assert(tiling
== VK_IMAGE_TILING_LINEAR
&& "non-linear image tiling is unimplemented");
2136 assert(image_create_info
.initialLayout
== VK_IMAGE_LAYOUT_UNDEFINED
2137 && "preinitialized images are unimplemented");
2139 constexpr Vulkan_image_descriptor(VkImageCreateFlags flags
,
2143 std::uint32_t mip_levels
,
2144 std::uint32_t array_layers
,
2145 VkSampleCountFlagBits samples
,
2146 VkImageTiling tiling
) noexcept
: flags(flags
),
2150 mip_levels(mip_levels
),
2151 array_layers(array_layers
),
2156 constexpr std::size_t get_memory_size() const noexcept
2158 #warning finish implementing Image
2159 assert(samples
== VK_SAMPLE_COUNT_1_BIT
&& "multisample images are unimplemented");
2160 assert(extent
.width
> 0);
2161 assert(extent
.height
> 0);
2162 assert(extent
.depth
> 0);
2164 assert(type
== VK_IMAGE_TYPE_2D
&& "unimplemented image type");
2165 assert(extent
.depth
== 1);
2167 assert(format
== VK_FORMAT_B8G8R8A8_UNORM
&& "unimplemented image format");
2168 assert(mip_levels
== 1 && "mipmapping is unimplemented");
2169 assert(array_layers
== 1 && "array images are unimplemented");
2170 assert(tiling
== VK_IMAGE_TILING_LINEAR
&& "non-linear image tiling is unimplemented");
2171 std::size_t retval
= sizeof(std::uint32_t);
2172 retval
*= extent
.width
;
2173 retval
*= extent
.height
;
2176 constexpr std::size_t get_memory_stride() const noexcept
2178 #warning finish implementing Image
2179 assert(samples
== VK_SAMPLE_COUNT_1_BIT
&& "multisample images are unimplemented");
2180 assert(extent
.width
> 0);
2181 assert(extent
.height
> 0);
2182 assert(extent
.depth
> 0);
2184 assert(type
== VK_IMAGE_TYPE_2D
&& "unimplemented image type");
2185 assert(extent
.depth
== 1);
2187 assert(format
== VK_FORMAT_B8G8R8A8_UNORM
&& "unimplemented image format");
2188 assert(mip_levels
== 1 && "mipmapping is unimplemented");
2189 assert(array_layers
== 1 && "array images are unimplemented");
2190 assert(tiling
== VK_IMAGE_TILING_LINEAR
&& "non-linear image tiling is unimplemented");
2191 std::size_t retval
= sizeof(std::uint32_t);
2192 retval
*= extent
.width
;
2195 constexpr std::size_t get_memory_pixel_size() const noexcept
2197 #warning finish implementing Image
2198 assert(samples
== VK_SAMPLE_COUNT_1_BIT
&& "multisample images are unimplemented");
2199 assert(extent
.width
> 0);
2200 assert(extent
.height
> 0);
2201 assert(extent
.depth
> 0);
2203 assert(type
== VK_IMAGE_TYPE_2D
&& "unimplemented image type");
2204 assert(extent
.depth
== 1);
2206 assert(format
== VK_FORMAT_B8G8R8A8_UNORM
&& "unimplemented image format");
2207 assert(mip_levels
== 1 && "mipmapping is unimplemented");
2208 assert(array_layers
== 1 && "array images are unimplemented");
2209 assert(tiling
== VK_IMAGE_TILING_LINEAR
&& "non-linear image tiling is unimplemented");
2210 std::size_t retval
= sizeof(std::uint32_t);
2215 struct Vulkan_image
: public Vulkan_nondispatchable_object
<Vulkan_image
, VkImage
>
2217 const Vulkan_image_descriptor descriptor
;
2218 std::shared_ptr
<void> memory
;
2219 Vulkan_image(const Vulkan_image_descriptor
&descriptor
,
2220 std::shared_ptr
<void> memory
= nullptr) noexcept
: descriptor(descriptor
),
2221 memory(std::move(memory
))
2224 static std::unique_ptr
<Vulkan_image
> create_with_memory(
2225 const Vulkan_image_descriptor
&descriptor
)
2227 std::shared_ptr
<unsigned char> memory(new unsigned char[descriptor
.get_memory_size()],
2228 [](unsigned char *p
) noexcept
2232 return std::make_unique
<Vulkan_image
>(descriptor
, std::move(memory
));
2234 void clear(VkClearColorValue color
) noexcept
;
2235 virtual ~Vulkan_image() = default;
2236 #warning finish implementing Vulkan_image
2237 static std::unique_ptr
<Vulkan_image
> create(Vulkan_device
&device
,
2238 const VkImageCreateInfo
&create_info
);
2241 struct Vulkan_command_pool
;
2243 struct Vulkan_command_buffer
2244 : public Vulkan_dispatchable_object
<Vulkan_command_buffer
, VkCommandBuffer
>
2246 struct Running_state
2248 const Vulkan_command_buffer
&command_buffer
;
2249 Vulkan_device
&device
;
2250 explicit Running_state(const Vulkan_command_buffer
&command_buffer
) noexcept
2251 : command_buffer(command_buffer
),
2252 device(command_buffer
.device
)
2255 #warning finish implementing Vulkan_command_buffer
2260 virtual ~Command() = default;
2261 virtual void run(Running_state
&state
) noexcept
= 0;
2262 virtual void on_record_end(Vulkan_command_buffer
&command_buffer
);
2264 enum class Command_buffer_state
2271 std::list
<std::unique_ptr
<Vulkan_command_buffer
>>::iterator iter
;
2272 Vulkan_command_pool
&command_pool
;
2273 Vulkan_device
&device
;
2274 std::vector
<std::unique_ptr
<Command
>> commands
;
2275 Command_buffer_state state
;
2276 Vulkan_command_buffer(std::list
<std::unique_ptr
<Vulkan_command_buffer
>>::iterator iter
,
2277 Vulkan_command_pool
&command_pool
,
2278 Vulkan_device
&device
) noexcept
;
2279 void reset(VkCommandBufferResetFlags flags
);
2280 void begin(const VkCommandBufferBeginInfo
&begin_info
);
2281 template <typename Fn
>
2282 void record_command_and_keep_errors(Fn fn
) noexcept
2284 if(state
== Command_buffer_state::Out_of_memory
)
2286 assert(state
== Command_buffer_state::Recording
);
2291 catch(std::bad_alloc
&)
2293 state
= Command_buffer_state::Out_of_memory
;
2296 VkResult
end() noexcept
;
2297 void run() const noexcept
;
2300 struct Vulkan_command_pool
2301 : public Vulkan_nondispatchable_object
<Vulkan_command_pool
, VkCommandPool
>
2303 std::list
<std::unique_ptr
<Vulkan_command_buffer
>> command_buffers
;
2304 void reset(VkCommandPoolResetFlags flags
)
2306 VkCommandBufferResetFlags buffer_flags
= 0;
2307 assert((flags
& ~(VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT
)) == 0);
2308 if(flags
& VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT
)
2309 buffer_flags
|= VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT
;
2310 for(auto &command_buffer
: command_buffers
)
2311 command_buffer
->reset(buffer_flags
);
2313 void allocate_multiple(Vulkan_device
&device
,
2314 const VkCommandBufferAllocateInfo
&allocate_info
,
2315 VkCommandBuffer
*allocated_command_buffers
);
2316 void free_command_buffer(VkCommandBuffer command_buffer_handle
) noexcept
2318 if(!command_buffer_handle
)
2320 auto *command_buffer
= Vulkan_command_buffer::from_handle(command_buffer_handle
);
2321 assert(&command_buffer
->command_pool
== this);
2322 command_buffers
.erase(command_buffer
->iter
);
2324 void free_multiple(const VkCommandBuffer
*allocated_command_buffers
,
2325 std::uint32_t command_buffer_count
) noexcept
2327 for(std::uint32_t i
= 0; i
< command_buffer_count
; i
++)
2328 free_command_buffer(allocated_command_buffers
[i
]);
2330 static std::unique_ptr
<Vulkan_command_pool
> create(Vulkan_device
&device
,
2331 const VkCommandPoolCreateInfo
&create_info
);
2336 #endif // VULKAN_API_OBJECTS_H_