0ca1eb3b8773ceb5e13418e3ad3955cbfd033bc6
[kazan.git] / src / vulkan / api_objects.h
1 /*
2 * Copyright 2017 Jacob Lifshay
3 *
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:
10 *
11 * The above copyright notice and this permission notice shall be included in all
12 * copies or substantial portions of the Software.
13 *
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
20 * SOFTWARE.
21 *
22 */
23 #ifndef VULKAN_API_OBJECTS_H_
24 #define VULKAN_API_OBJECTS_H_
25
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"
36 #include <memory>
37 #include <cassert>
38 #include <chrono>
39 #include <limits>
40 #include <vector>
41 #include <list>
42 #include <mutex>
43 #include <condition_variable>
44 #include <chrono>
45 #include <thread>
46
47 namespace kazan
48 {
49 namespace vulkan
50 {
51 enum class Supported_extension
52 {
53 Not_supported,
54 KHR_surface,
55 KHR_xcb_surface,
56 KHR_xlib_surface,
57 KHR_swapchain,
58 };
59
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);
66
67 typedef util::Enum_set<Supported_extension> Supported_extensions;
68
69 enum class Extension_scope
70 {
71 Not_supported,
72 Instance,
73 Device,
74 };
75
76 constexpr Extension_scope get_extension_scope(Supported_extension extension) noexcept
77 {
78 switch(extension)
79 {
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;
87 #else
88 return Extension_scope::Not_supported;
89 #endif
90 case Supported_extension::KHR_xlib_surface:
91 #ifdef VK_USE_PLATFORM_XLIB_KHR
92 return Extension_scope::Instance;
93 #else
94 return Extension_scope::Not_supported;
95 #endif
96 case Supported_extension::KHR_swapchain:
97 return Extension_scope::Device;
98 }
99 assert(!"unknown extension");
100 return Extension_scope::Not_supported;
101 }
102
103 constexpr VkExtensionProperties get_extension_properties(Supported_extension extension) noexcept
104 {
105 switch(extension)
106 {
107 case Supported_extension::Not_supported:
108 return {};
109 case Supported_extension::KHR_surface:
110 return {
111 .extensionName = VK_KHR_SURFACE_EXTENSION_NAME,
112 .specVersion = VK_KHR_SURFACE_SPEC_VERSION,
113 };
114 case Supported_extension::KHR_xcb_surface:
115 #ifdef VK_USE_PLATFORM_XCB_KHR
116 return {
117 .extensionName = VK_KHR_XCB_SURFACE_EXTENSION_NAME,
118 .specVersion = VK_KHR_XCB_SURFACE_SPEC_VERSION,
119 };
120 #else
121 return {};
122 #endif
123 case Supported_extension::KHR_xlib_surface:
124 #ifdef VK_USE_PLATFORM_XLIB_KHR
125 return {
126 .extensionName = VK_KHR_XLIB_SURFACE_EXTENSION_NAME,
127 .specVersion = VK_KHR_XLIB_SURFACE_SPEC_VERSION,
128 };
129 #else
130 return {};
131 #endif
132 case Supported_extension::KHR_swapchain:
133 return {
134 .extensionName = VK_KHR_SWAPCHAIN_EXTENSION_NAME,
135 .specVersion = VK_KHR_SWAPCHAIN_SPEC_VERSION,
136 };
137 }
138 assert(!"unknown extension");
139 return {};
140 }
141
142 constexpr std::size_t get_extension_count(Extension_scope scope) noexcept
143 {
144 std::size_t retval = 0;
145 for(auto extension : util::Enum_traits<Supported_extension>::values)
146 if(get_extension_scope(extension) == scope)
147 retval++;
148 return retval;
149 }
150
151 template <Extension_scope Scope>
152 constexpr util::Constexpr_array<VkExtensionProperties, get_extension_count(Scope)>
153 get_extensions() noexcept
154 {
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());
161 return retval;
162 }
163
164 constexpr Supported_extensions get_extension_dependencies(Supported_extension extension) noexcept
165 {
166 switch(extension)
167 {
168 case Supported_extension::Not_supported:
169 return {};
170 case Supported_extension::KHR_surface:
171 return {};
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};
178 }
179 assert(!"unknown extension");
180 return {};
181 }
182
183 inline Supported_extension parse_extension_name(util::string_view name) noexcept
184 {
185 if(name.empty())
186 return Supported_extension::Not_supported;
187 for(auto extension : util::Enum_traits<Supported_extension>::values)
188 {
189 if(extension == Supported_extension::Not_supported)
190 continue;
191 if(get_extension_properties(extension).extensionName == name)
192 return extension;
193 }
194 return Supported_extension::Not_supported;
195 }
196
197 constexpr VkFormatProperties get_format_properties(VkFormat format) noexcept
198 {
199 switch(format)
200 {
201 case VK_FORMAT_UNDEFINED:
202 return {
203 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
204 };
205 case VK_FORMAT_R4G4_UNORM_PACK8:
206 return {
207 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
208 };
209 case VK_FORMAT_R4G4B4A4_UNORM_PACK16:
210 return {
211 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
212 };
213 case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
214 #warning implement VK_FORMAT_B4G4R4A4_UNORM_PACK16
215 return {
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,
222 .bufferFeatures = 0,
223 };
224 case VK_FORMAT_R5G6B5_UNORM_PACK16:
225 #warning implement VK_FORMAT_R5G6B5_UNORM_PACK16
226 return {
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,
236 .bufferFeatures = 0,
237 };
238 case VK_FORMAT_B5G6R5_UNORM_PACK16:
239 return {
240 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
241 };
242 case VK_FORMAT_R5G5B5A1_UNORM_PACK16:
243 return {
244 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
245 };
246 case VK_FORMAT_B5G5R5A1_UNORM_PACK16:
247 return {
248 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
249 };
250 case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
251 #warning implement VK_FORMAT_A1R5G5B5_UNORM_PACK16
252 return {
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,
262 .bufferFeatures = 0,
263 };
264 case VK_FORMAT_R8_UNORM:
265 #warning implement VK_FORMAT_R8_UNORM
266 return {
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,
276 .bufferFeatures =
277 VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT | VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT,
278 };
279 case VK_FORMAT_R8_SNORM:
280 #warning implement VK_FORMAT_R8_SNORM
281 return {
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,
288 .bufferFeatures =
289 VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT | VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT,
290 };
291 case VK_FORMAT_R8_USCALED:
292 return {
293 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
294 };
295 case VK_FORMAT_R8_SSCALED:
296 return {
297 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
298 };
299 case VK_FORMAT_R8_UINT:
300 #warning implement VK_FORMAT_R8_UINT
301 return {
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,
309 .bufferFeatures =
310 VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT | VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT,
311 };
312 case VK_FORMAT_R8_SINT:
313 #warning implement VK_FORMAT_R8_SINT
314 return {
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,
322 .bufferFeatures =
323 VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT | VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT,
324 };
325 case VK_FORMAT_R8_SRGB:
326 return {
327 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
328 };
329 case VK_FORMAT_R8G8_UNORM:
330 #warning implement VK_FORMAT_R8G8_UNORM
331 return {
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,
341 .bufferFeatures =
342 VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT | VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT,
343 };
344 case VK_FORMAT_R8G8_SNORM:
345 #warning implement VK_FORMAT_R8G8_SNORM
346 return {
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,
353 .bufferFeatures =
354 VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT | VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT,
355 };
356 case VK_FORMAT_R8G8_USCALED:
357 return {
358 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
359 };
360 case VK_FORMAT_R8G8_SSCALED:
361 return {
362 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
363 };
364 case VK_FORMAT_R8G8_UINT:
365 #warning implement VK_FORMAT_R8G8_UINT
366 return {
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,
374 .bufferFeatures =
375 VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT | VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT,
376 };
377 case VK_FORMAT_R8G8_SINT:
378 #warning implement VK_FORMAT_R8G8_SINT
379 return {
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,
387 .bufferFeatures =
388 VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT | VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT,
389 };
390 case VK_FORMAT_R8G8_SRGB:
391 return {
392 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
393 };
394 case VK_FORMAT_R8G8B8_UNORM:
395 return {
396 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
397 };
398 case VK_FORMAT_R8G8B8_SNORM:
399 return {
400 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
401 };
402 case VK_FORMAT_R8G8B8_USCALED:
403 return {
404 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
405 };
406 case VK_FORMAT_R8G8B8_SSCALED:
407 return {
408 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
409 };
410 case VK_FORMAT_R8G8B8_UINT:
411 return {
412 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
413 };
414 case VK_FORMAT_R8G8B8_SINT:
415 return {
416 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
417 };
418 case VK_FORMAT_R8G8B8_SRGB:
419 return {
420 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
421 };
422 case VK_FORMAT_B8G8R8_UNORM:
423 return {
424 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
425 };
426 case VK_FORMAT_B8G8R8_SNORM:
427 return {
428 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
429 };
430 case VK_FORMAT_B8G8R8_USCALED:
431 return {
432 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
433 };
434 case VK_FORMAT_B8G8R8_SSCALED:
435 return {
436 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
437 };
438 case VK_FORMAT_B8G8R8_UINT:
439 return {
440 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
441 };
442 case VK_FORMAT_B8G8R8_SINT:
443 return {
444 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
445 };
446 case VK_FORMAT_B8G8R8_SRGB:
447 return {
448 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
449 };
450 case VK_FORMAT_R8G8B8A8_UNORM:
451 #warning implement VK_FORMAT_R8G8B8A8_UNORM
452 return {
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,
466 };
467 case VK_FORMAT_R8G8B8A8_SNORM:
468 #warning implement VK_FORMAT_R8G8B8A8_SNORM
469 return {
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,
480 };
481 case VK_FORMAT_R8G8B8A8_USCALED:
482 return {
483 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
484 };
485 case VK_FORMAT_R8G8B8A8_SSCALED:
486 return {
487 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
488 };
489 case VK_FORMAT_R8G8B8A8_UINT:
490 #warning implement VK_FORMAT_R8G8B8A8_UINT
491 return {
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,
503 };
504 case VK_FORMAT_R8G8B8A8_SINT:
505 #warning implement VK_FORMAT_R8G8B8A8_SINT
506 return {
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,
518 };
519 case VK_FORMAT_R8G8B8A8_SRGB:
520 #warning implement VK_FORMAT_R8G8B8A8_SRGB
521 return {
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,
531 .bufferFeatures = 0,
532 };
533 case VK_FORMAT_B8G8R8A8_UNORM:
534 #warning implement VK_FORMAT_B8G8R8A8_UNORM
535 return {
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,
545 .bufferFeatures =
546 VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT | VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT,
547 };
548 case VK_FORMAT_B8G8R8A8_SNORM:
549 return {
550 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
551 };
552 case VK_FORMAT_B8G8R8A8_USCALED:
553 return {
554 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
555 };
556 case VK_FORMAT_B8G8R8A8_SSCALED:
557 return {
558 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
559 };
560 case VK_FORMAT_B8G8R8A8_UINT:
561 return {
562 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
563 };
564 case VK_FORMAT_B8G8R8A8_SINT:
565 return {
566 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
567 };
568 case VK_FORMAT_B8G8R8A8_SRGB:
569 #warning implement VK_FORMAT_B8G8R8A8_SRGB
570 return {
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,
580 .bufferFeatures = 0,
581 };
582 case VK_FORMAT_A8B8G8R8_UNORM_PACK32:
583 #warning implement VK_FORMAT_A8B8G8R8_UNORM_PACK32
584 return {
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,
597 };
598 case VK_FORMAT_A8B8G8R8_SNORM_PACK32:
599 #warning implement VK_FORMAT_A8B8G8R8_SNORM_PACK32
600 return {
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,
610 };
611 case VK_FORMAT_A8B8G8R8_USCALED_PACK32:
612 return {
613 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
614 };
615 case VK_FORMAT_A8B8G8R8_SSCALED_PACK32:
616 return {
617 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
618 };
619 case VK_FORMAT_A8B8G8R8_UINT_PACK32:
620 #warning implement VK_FORMAT_A8B8G8R8_UINT_PACK32
621 return {
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,
632 };
633 case VK_FORMAT_A8B8G8R8_SINT_PACK32:
634 #warning implement VK_FORMAT_A8B8G8R8_SINT_PACK32
635 return {
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,
646 };
647 case VK_FORMAT_A8B8G8R8_SRGB_PACK32:
648 #warning implement VK_FORMAT_A8B8G8R8_SRGB_PACK32
649 return {
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,
659 .bufferFeatures = 0,
660 };
661 case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
662 return {
663 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
664 };
665 case VK_FORMAT_A2R10G10B10_SNORM_PACK32:
666 return {
667 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
668 };
669 case VK_FORMAT_A2R10G10B10_USCALED_PACK32:
670 return {
671 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
672 };
673 case VK_FORMAT_A2R10G10B10_SSCALED_PACK32:
674 return {
675 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
676 };
677 case VK_FORMAT_A2R10G10B10_UINT_PACK32:
678 return {
679 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
680 };
681 case VK_FORMAT_A2R10G10B10_SINT_PACK32:
682 return {
683 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
684 };
685 case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
686 #warning implement VK_FORMAT_A2B10G10R10_UNORM_PACK32
687 return {
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,
697 .bufferFeatures =
698 VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT | VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT,
699 };
700 case VK_FORMAT_A2B10G10R10_SNORM_PACK32:
701 return {
702 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
703 };
704 case VK_FORMAT_A2B10G10R10_USCALED_PACK32:
705 return {
706 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
707 };
708 case VK_FORMAT_A2B10G10R10_SSCALED_PACK32:
709 return {
710 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
711 };
712 case VK_FORMAT_A2B10G10R10_UINT_PACK32:
713 #warning implement VK_FORMAT_A2B10G10R10_UINT_PACK32
714 return {
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,
723 };
724 case VK_FORMAT_A2B10G10R10_SINT_PACK32:
725 return {
726 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
727 };
728 case VK_FORMAT_R16_UNORM:
729 #warning implement VK_FORMAT_R16_UNORM
730 return {
731 .linearTilingFeatures = 0,
732 .optimalTilingFeatures = 0,
733 .bufferFeatures = VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT,
734 };
735 case VK_FORMAT_R16_SNORM:
736 #warning implement VK_FORMAT_R16_SNORM
737 return {
738 .linearTilingFeatures = 0,
739 .optimalTilingFeatures = 0,
740 .bufferFeatures = VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT,
741 };
742 case VK_FORMAT_R16_USCALED:
743 return {
744 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
745 };
746 case VK_FORMAT_R16_SSCALED:
747 return {
748 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
749 };
750 case VK_FORMAT_R16_UINT:
751 #warning implement VK_FORMAT_R16_UINT
752 return {
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,
760 .bufferFeatures =
761 VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT | VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT,
762 };
763 case VK_FORMAT_R16_SINT:
764 #warning implement VK_FORMAT_R16_SINT
765 return {
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,
773 .bufferFeatures =
774 VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT | VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT,
775 };
776 case VK_FORMAT_R16_SFLOAT:
777 #warning implement VK_FORMAT_R16_SFLOAT
778 return {
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,
788 .bufferFeatures =
789 VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT | VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT,
790 };
791 case VK_FORMAT_R16G16_UNORM:
792 #warning implement VK_FORMAT_R16G16_UNORM
793 return {
794 .linearTilingFeatures = 0,
795 .optimalTilingFeatures = 0,
796 .bufferFeatures = VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT,
797 };
798 case VK_FORMAT_R16G16_SNORM:
799 #warning implement VK_FORMAT_R16G16_SNORM
800 return {
801 .linearTilingFeatures = 0,
802 .optimalTilingFeatures = 0,
803 .bufferFeatures = VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT,
804 };
805 case VK_FORMAT_R16G16_USCALED:
806 return {
807 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
808 };
809 case VK_FORMAT_R16G16_SSCALED:
810 return {
811 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
812 };
813 case VK_FORMAT_R16G16_UINT:
814 #warning implement VK_FORMAT_R16G16_UINT
815 return {
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,
823 .bufferFeatures =
824 VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT | VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT,
825 };
826 case VK_FORMAT_R16G16_SINT:
827 #warning implement VK_FORMAT_R16G16_SINT
828 return {
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,
836 .bufferFeatures =
837 VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT | VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT,
838 };
839 case VK_FORMAT_R16G16_SFLOAT:
840 #warning implement VK_FORMAT_R16G16_SFLOAT
841 return {
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,
851 .bufferFeatures =
852 VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT | VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT,
853 };
854 case VK_FORMAT_R16G16B16_UNORM:
855 return {
856 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
857 };
858 case VK_FORMAT_R16G16B16_SNORM:
859 return {
860 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
861 };
862 case VK_FORMAT_R16G16B16_USCALED:
863 return {
864 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
865 };
866 case VK_FORMAT_R16G16B16_SSCALED:
867 return {
868 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
869 };
870 case VK_FORMAT_R16G16B16_UINT:
871 return {
872 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
873 };
874 case VK_FORMAT_R16G16B16_SINT:
875 return {
876 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
877 };
878 case VK_FORMAT_R16G16B16_SFLOAT:
879 return {
880 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
881 };
882 case VK_FORMAT_R16G16B16A16_UNORM:
883 #warning implement VK_FORMAT_R16G16B16A16_UNORM
884 return {
885 .linearTilingFeatures = 0,
886 .optimalTilingFeatures = 0,
887 .bufferFeatures = VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT,
888 };
889 case VK_FORMAT_R16G16B16A16_SNORM:
890 #warning implement VK_FORMAT_R16G16B16A16_SNORM
891 return {
892 .linearTilingFeatures = 0,
893 .optimalTilingFeatures = 0,
894 .bufferFeatures = VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT,
895 };
896 case VK_FORMAT_R16G16B16A16_USCALED:
897 return {
898 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
899 };
900 case VK_FORMAT_R16G16B16A16_SSCALED:
901 return {
902 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
903 };
904 case VK_FORMAT_R16G16B16A16_UINT:
905 #warning implement VK_FORMAT_R16G16B16A16_UINT
906 return {
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,
918 };
919 case VK_FORMAT_R16G16B16A16_SINT:
920 #warning implement VK_FORMAT_R16G16B16A16_SINT
921 return {
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,
933 };
934 case VK_FORMAT_R16G16B16A16_SFLOAT:
935 #warning implement VK_FORMAT_R16G16B16A16_SFLOAT
936 return {
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,
950 };
951 case VK_FORMAT_R32_UINT:
952 #warning implement VK_FORMAT_R32_UINT
953 return {
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,
967 };
968 case VK_FORMAT_R32_SINT:
969 #warning implement VK_FORMAT_R32_SINT
970 return {
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,
984 };
985 case VK_FORMAT_R32_SFLOAT:
986 #warning implement VK_FORMAT_R32_SFLOAT
987 return {
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,
999 };
1000 case VK_FORMAT_R32G32_UINT:
1001 #warning implement VK_FORMAT_R32G32_UINT
1002 return {
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,
1014 };
1015 case VK_FORMAT_R32G32_SINT:
1016 #warning implement VK_FORMAT_R32G32_SINT
1017 return {
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,
1029 };
1030 case VK_FORMAT_R32G32_SFLOAT:
1031 #warning implement VK_FORMAT_R32G32_SFLOAT
1032 return {
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,
1044 };
1045 case VK_FORMAT_R32G32B32_UINT:
1046 #warning implement VK_FORMAT_R32G32B32_UINT
1047 return {
1048 .linearTilingFeatures = 0,
1049 .optimalTilingFeatures = 0,
1050 .bufferFeatures = VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT,
1051 };
1052 case VK_FORMAT_R32G32B32_SINT:
1053 #warning implement VK_FORMAT_R32G32B32_SINT
1054 return {
1055 .linearTilingFeatures = 0,
1056 .optimalTilingFeatures = 0,
1057 .bufferFeatures = VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT,
1058 };
1059 case VK_FORMAT_R32G32B32_SFLOAT:
1060 #warning implement VK_FORMAT_R32G32B32_SFLOAT
1061 return {
1062 .linearTilingFeatures = 0,
1063 .optimalTilingFeatures = 0,
1064 .bufferFeatures = VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT,
1065 };
1066 case VK_FORMAT_R32G32B32A32_UINT:
1067 #warning implement VK_FORMAT_R32G32B32A32_UINT
1068 return {
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,
1080 };
1081 case VK_FORMAT_R32G32B32A32_SINT:
1082 #warning implement VK_FORMAT_R32G32B32A32_SINT
1083 return {
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,
1095 };
1096 case VK_FORMAT_R32G32B32A32_SFLOAT:
1097 #warning implement VK_FORMAT_R32G32B32A32_SFLOAT
1098 return {
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,
1110 };
1111 case VK_FORMAT_R64_UINT:
1112 return {
1113 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1114 };
1115 case VK_FORMAT_R64_SINT:
1116 return {
1117 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1118 };
1119 case VK_FORMAT_R64_SFLOAT:
1120 return {
1121 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1122 };
1123 case VK_FORMAT_R64G64_UINT:
1124 return {
1125 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1126 };
1127 case VK_FORMAT_R64G64_SINT:
1128 return {
1129 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1130 };
1131 case VK_FORMAT_R64G64_SFLOAT:
1132 return {
1133 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1134 };
1135 case VK_FORMAT_R64G64B64_UINT:
1136 return {
1137 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1138 };
1139 case VK_FORMAT_R64G64B64_SINT:
1140 return {
1141 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1142 };
1143 case VK_FORMAT_R64G64B64_SFLOAT:
1144 return {
1145 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1146 };
1147 case VK_FORMAT_R64G64B64A64_UINT:
1148 return {
1149 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1150 };
1151 case VK_FORMAT_R64G64B64A64_SINT:
1152 return {
1153 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1154 };
1155 case VK_FORMAT_R64G64B64A64_SFLOAT:
1156 return {
1157 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1158 };
1159 case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
1160 #warning implement VK_FORMAT_B10G11R11_UFLOAT_PACK32
1161 return {
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,
1169 };
1170 case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:
1171 #warning implement VK_FORMAT_E5B9G9R9_UFLOAT_PACK32
1172 return {
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,
1180 };
1181 case VK_FORMAT_D16_UNORM:
1182 #warning implement VK_FORMAT_D16_UNORM
1183 return {
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,
1191 };
1192 case VK_FORMAT_X8_D24_UNORM_PACK32:
1193 return {
1194 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1195 };
1196 case VK_FORMAT_D32_SFLOAT:
1197 return {
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,
1205 };
1206 case VK_FORMAT_S8_UINT:
1207 return {
1208 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1209 };
1210 case VK_FORMAT_D16_UNORM_S8_UINT:
1211 return {
1212 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1213 };
1214 case VK_FORMAT_D24_UNORM_S8_UINT:
1215 return {
1216 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1217 };
1218 case VK_FORMAT_D32_SFLOAT_S8_UINT:
1219 #warning implement VK_FORMAT_D32_SFLOAT_S8_UINT
1220 return {
1221 .linearTilingFeatures = 0,
1222 .optimalTilingFeatures = VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT,
1223 .bufferFeatures = 0,
1224 };
1225 case VK_FORMAT_BC1_RGB_UNORM_BLOCK:
1226 #warning implement compressed image formats
1227 return {
1228 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1229 };
1230 case VK_FORMAT_BC1_RGB_SRGB_BLOCK:
1231 return {
1232 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1233 };
1234 case VK_FORMAT_BC1_RGBA_UNORM_BLOCK:
1235 return {
1236 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1237 };
1238 case VK_FORMAT_BC1_RGBA_SRGB_BLOCK:
1239 return {
1240 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1241 };
1242 case VK_FORMAT_BC2_UNORM_BLOCK:
1243 return {
1244 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1245 };
1246 case VK_FORMAT_BC2_SRGB_BLOCK:
1247 return {
1248 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1249 };
1250 case VK_FORMAT_BC3_UNORM_BLOCK:
1251 return {
1252 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1253 };
1254 case VK_FORMAT_BC3_SRGB_BLOCK:
1255 return {
1256 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1257 };
1258 case VK_FORMAT_BC4_UNORM_BLOCK:
1259 return {
1260 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1261 };
1262 case VK_FORMAT_BC4_SNORM_BLOCK:
1263 return {
1264 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1265 };
1266 case VK_FORMAT_BC5_UNORM_BLOCK:
1267 return {
1268 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1269 };
1270 case VK_FORMAT_BC5_SNORM_BLOCK:
1271 return {
1272 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1273 };
1274 case VK_FORMAT_BC6H_UFLOAT_BLOCK:
1275 return {
1276 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1277 };
1278 case VK_FORMAT_BC6H_SFLOAT_BLOCK:
1279 return {
1280 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1281 };
1282 case VK_FORMAT_BC7_UNORM_BLOCK:
1283 return {
1284 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1285 };
1286 case VK_FORMAT_BC7_SRGB_BLOCK:
1287 return {
1288 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1289 };
1290 case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
1291 return {
1292 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1293 };
1294 case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:
1295 return {
1296 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1297 };
1298 case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:
1299 return {
1300 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1301 };
1302 case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:
1303 return {
1304 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1305 };
1306 case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:
1307 return {
1308 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1309 };
1310 case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:
1311 return {
1312 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1313 };
1314 case VK_FORMAT_EAC_R11_UNORM_BLOCK:
1315 return {
1316 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1317 };
1318 case VK_FORMAT_EAC_R11_SNORM_BLOCK:
1319 return {
1320 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1321 };
1322 case VK_FORMAT_EAC_R11G11_UNORM_BLOCK:
1323 return {
1324 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1325 };
1326 case VK_FORMAT_EAC_R11G11_SNORM_BLOCK:
1327 return {
1328 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1329 };
1330 case VK_FORMAT_ASTC_4x4_UNORM_BLOCK:
1331 return {
1332 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1333 };
1334 case VK_FORMAT_ASTC_4x4_SRGB_BLOCK:
1335 return {
1336 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1337 };
1338 case VK_FORMAT_ASTC_5x4_UNORM_BLOCK:
1339 return {
1340 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1341 };
1342 case VK_FORMAT_ASTC_5x4_SRGB_BLOCK:
1343 return {
1344 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1345 };
1346 case VK_FORMAT_ASTC_5x5_UNORM_BLOCK:
1347 return {
1348 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1349 };
1350 case VK_FORMAT_ASTC_5x5_SRGB_BLOCK:
1351 return {
1352 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1353 };
1354 case VK_FORMAT_ASTC_6x5_UNORM_BLOCK:
1355 return {
1356 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1357 };
1358 case VK_FORMAT_ASTC_6x5_SRGB_BLOCK:
1359 return {
1360 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1361 };
1362 case VK_FORMAT_ASTC_6x6_UNORM_BLOCK:
1363 return {
1364 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1365 };
1366 case VK_FORMAT_ASTC_6x6_SRGB_BLOCK:
1367 return {
1368 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1369 };
1370 case VK_FORMAT_ASTC_8x5_UNORM_BLOCK:
1371 return {
1372 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1373 };
1374 case VK_FORMAT_ASTC_8x5_SRGB_BLOCK:
1375 return {
1376 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1377 };
1378 case VK_FORMAT_ASTC_8x6_UNORM_BLOCK:
1379 return {
1380 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1381 };
1382 case VK_FORMAT_ASTC_8x6_SRGB_BLOCK:
1383 return {
1384 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1385 };
1386 case VK_FORMAT_ASTC_8x8_UNORM_BLOCK:
1387 return {
1388 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1389 };
1390 case VK_FORMAT_ASTC_8x8_SRGB_BLOCK:
1391 return {
1392 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1393 };
1394 case VK_FORMAT_ASTC_10x5_UNORM_BLOCK:
1395 return {
1396 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1397 };
1398 case VK_FORMAT_ASTC_10x5_SRGB_BLOCK:
1399 return {
1400 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1401 };
1402 case VK_FORMAT_ASTC_10x6_UNORM_BLOCK:
1403 return {
1404 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1405 };
1406 case VK_FORMAT_ASTC_10x6_SRGB_BLOCK:
1407 return {
1408 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1409 };
1410 case VK_FORMAT_ASTC_10x8_UNORM_BLOCK:
1411 return {
1412 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1413 };
1414 case VK_FORMAT_ASTC_10x8_SRGB_BLOCK:
1415 return {
1416 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1417 };
1418 case VK_FORMAT_ASTC_10x10_UNORM_BLOCK:
1419 return {
1420 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1421 };
1422 case VK_FORMAT_ASTC_10x10_SRGB_BLOCK:
1423 return {
1424 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1425 };
1426 case VK_FORMAT_ASTC_12x10_UNORM_BLOCK:
1427 return {
1428 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1429 };
1430 case VK_FORMAT_ASTC_12x10_SRGB_BLOCK:
1431 return {
1432 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1433 };
1434 case VK_FORMAT_ASTC_12x12_UNORM_BLOCK:
1435 return {
1436 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1437 };
1438 case VK_FORMAT_ASTC_12x12_SRGB_BLOCK:
1439 return {
1440 .linearTilingFeatures = 0, .optimalTilingFeatures = 0, .bufferFeatures = 0,
1441 };
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:
1452 break;
1453 }
1454 assert(!"invalid format enum");
1455 return {};
1456 }
1457
1458 template <typename Object_type, typename Vulkan_handle_type>
1459 struct Vulkan_dispatchable_object
1460 {
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
1465 {
1466 return static_cast<Object_type *>(reinterpret_cast<Vulkan_dispatchable_object *>(v));
1467 }
1468 static std::unique_ptr<Object_type> move_from_handle(Vulkan_handle_type v) noexcept
1469 {
1470 return std::unique_ptr<Object_type>(from_handle(v));
1471 }
1472 };
1473
1474 template <typename Object_type, typename Vulkan_handle_type>
1475 struct Vulkan_nondispatchable_object
1476 {
1477 typedef Vulkan_handle_type Vulkan_handle;
1478 typedef Object_type Object;
1479 static Object_type *from_handle(Vulkan_handle_type v) noexcept
1480 {
1481 return static_cast<Object_type *>(reinterpret_cast<Vulkan_nondispatchable_object *>(v));
1482 }
1483 static std::unique_ptr<Object_type> move_from_handle(Vulkan_handle_type v) noexcept
1484 {
1485 return std::unique_ptr<Object_type>(from_handle(v));
1486 }
1487 };
1488
1489 template <typename Object_type>
1490 typename std::
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
1496 {
1497 return reinterpret_cast<typename Object_type::Vulkan_handle>(
1498 static_cast<Vulkan_dispatchable_object<Object_type, typename Object_type::Vulkan_handle> *>(
1499 object));
1500 }
1501
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
1505 {
1506 return to_handle(v.release());
1507 }
1508
1509 template <typename Object_type, typename = void>
1510 typename std::
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
1516 {
1517 return reinterpret_cast<typename Object_type::Vulkan_handle>(
1518 static_cast<Vulkan_nondispatchable_object<Object_type, typename Object_type::Vulkan_handle>
1519 *>(object));
1520 }
1521
1522 struct Vulkan_instance;
1523
1524 struct Vulkan_physical_device
1525 : public Vulkan_dispatchable_object<Vulkan_physical_device, VkPhysicalDevice>
1526 {
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
1534 {
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;
1540 else
1541 heap_size = total_usable_ram / 2;
1542 if(heap_size > std::numeric_limits<VkDeviceSize>::max())
1543 heap_size = std::numeric_limits<VkDeviceSize>::max();
1544 return heap_size;
1545 }
1546 Vulkan_physical_device(Vulkan_instance &instance) noexcept
1547 : instance(instance),
1548 properties{
1549 .apiVersion = VK_MAKE_VERSION(1, 0, VK_HEADER_VERSION),
1550 .driverVersion = 0,
1551 .vendorID = 0x10003UL,
1552 .deviceID = 0,
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 = {},
1557 .limits =
1558 {
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 =
1612 {
1613 static_cast<std::uint32_t>(-1),
1614 static_cast<std::uint32_t>(-1),
1615 static_cast<std::uint32_t>(-1),
1616 },
1617 .maxComputeWorkGroupInvocations = static_cast<std::uint32_t>(-1),
1618 .maxComputeWorkGroupSize =
1619 {
1620 static_cast<std::uint32_t>(-1),
1621 static_cast<std::uint32_t>(-1),
1622 static_cast<std::uint32_t>(-1),
1623 },
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,
1631 .maxViewports = 1,
1632 .maxViewportDimensions =
1633 {
1634 1UL << 20, 1UL << 20,
1635 },
1636 .viewportBoundsRange =
1637 {
1638 static_cast<float>(-1) * (1UL << 21), 1UL << 21,
1639 },
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,
1668 .timestampPeriod =
1669 std::chrono::duration_cast<std::chrono::duration<double, std::nano>>(
1670 std::chrono::steady_clock::duration(1))
1671 .count(),
1672 .maxClipDistances = 0,
1673 .maxCullDistances = 0,
1674 .maxCombinedClipAndCullDistances = 0,
1675 .discreteQueuePriorities = 2,
1676 .pointSizeRange =
1677 {
1678 1, 1,
1679 },
1680 .lineWidthRange =
1681 {
1682 1, 1,
1683 },
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,
1692 },
1693 .sparseProperties =
1694 {
1695 #warning update upon implementation of sparse memory
1696 .residencyStandard2DBlockShape = false,
1697 .residencyStandard2DMultisampleBlockShape = false,
1698 .residencyStandard3DBlockShape = false,
1699 .residencyAlignedMipSize = false,
1700 .residencyNonResidentStrict = false,
1701 },
1702 },
1703 queue_family_properties{
1704 {
1705 .queueFlags = VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT,
1706 .queueCount = 1,
1707 .timestampValidBits = std::numeric_limits<std::chrono::steady_clock::rep>::digits
1708 + 1, // 1 extra for sign bit
1709 .minImageTransferGranularity =
1710 {
1711 1, 1, 1,
1712 },
1713 },
1714 },
1715 memory_properties{
1716 .memoryTypeCount = 1,
1717 .memoryTypes =
1718 {
1719 {
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,
1724 .heapIndex = 0,
1725 },
1726 },
1727 .memoryHeapCount = 1,
1728 .memoryHeaps =
1729 {
1730 {
1731 .size = calculate_heap_size(), .flags = VK_MEMORY_HEAP_DEVICE_LOCAL_BIT,
1732 },
1733 },
1734 },
1735 features{
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,
1745 .logicOp = false,
1746 .multiDrawIndirect = true,
1747 .drawIndirectFirstInstance = true,
1748 .depthClamp = false,
1749 .depthBiasClamp = false,
1750 .fillModeNonSolid = false,
1751 .depthBounds = false,
1752 .wideLines = 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,
1792 }
1793 {
1794 }
1795 };
1796
1797 struct Vulkan_instance : public Vulkan_dispatchable_object<Vulkan_instance, VkInstance>
1798 {
1799 Vulkan_instance(const Vulkan_instance &) = delete;
1800 Vulkan_instance &operator=(const Vulkan_instance &) = delete;
1801
1802 struct App_info
1803 {
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)
1819 {
1820 }
1821 explicit App_info(const VkApplicationInfo &application_info)
1822 : application_name(
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)
1828 {
1829 assert(application_info.sType == VK_STRUCTURE_TYPE_APPLICATION_INFO);
1830 }
1831 App_info() noexcept : application_name(),
1832 application_version(),
1833 engine_name(),
1834 engine_version(),
1835 api_version()
1836 {
1837 }
1838 };
1839 App_info app_info;
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)
1846 {
1847 }
1848 static util::variant<std::unique_ptr<Vulkan_instance>, VkResult> create(
1849 const VkInstanceCreateInfo &create_info);
1850 #warning finish implementing Vulkan_instance
1851 };
1852
1853 struct Vulkan_device;
1854
1855 struct Vulkan_semaphore : public Vulkan_nondispatchable_object<Vulkan_semaphore, VkSemaphore>
1856 {
1857 void signal() // empty function for if semaphores are needed later
1858 {
1859 }
1860 void wait() // empty function for if semaphores are needed later
1861 {
1862 }
1863 static std::unique_ptr<Vulkan_semaphore> create(Vulkan_device &device,
1864 const VkSemaphoreCreateInfo &create_info);
1865 };
1866
1867 class Vulkan_fence : public Vulkan_nondispatchable_object<Vulkan_fence, VkFence>
1868 {
1869 private:
1870 struct Waiter
1871 {
1872 std::mutex lock;
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)
1876 {
1877 }
1878 void notify(bool notify_condition_variable)
1879 {
1880 std::unique_lock<std::mutex> lock_it(lock);
1881 if(wait_count != 0)
1882 {
1883 wait_count--;
1884 if(notify_condition_variable && wait_count == 0)
1885 cond.notify_all();
1886 }
1887 }
1888 bool wait(util::optional<std::chrono::steady_clock::time_point> end_time)
1889 {
1890 std::unique_lock<std::mutex> lock_it(lock);
1891 while(wait_count != 0)
1892 {
1893 if(end_time)
1894 {
1895 if(cond.wait_until(lock_it, *end_time) == std::cv_status::timeout)
1896 break;
1897 }
1898 else
1899 cond.wait(lock_it);
1900 }
1901 return wait_count == 0;
1902 }
1903 };
1904
1905 private:
1906 std::mutex lock;
1907 bool signaled;
1908 std::list<Waiter *> waiters;
1909
1910 public:
1911 explicit Vulkan_fence(VkFenceCreateFlags flags)
1912 : lock(), signaled(flags & VK_FENCE_CREATE_SIGNALED_BIT), waiters()
1913 {
1914 }
1915 bool is_signaled()
1916 {
1917 std::unique_lock<std::mutex> lock_it(lock);
1918 return signaled;
1919 }
1920 void set_signaled(bool new_signaled)
1921 {
1922 std::unique_lock<std::mutex> lock_it(lock);
1923 if(signaled == new_signaled)
1924 return;
1925 signaled = new_signaled;
1926 if(new_signaled)
1927 {
1928 for(auto *waiter : waiters)
1929 waiter->notify(true);
1930 }
1931 }
1932 void signal()
1933 {
1934 set_signaled(true);
1935 }
1936 void reset()
1937 {
1938 set_signaled(false);
1939 }
1940 static VkResult wait_multiple(std::uint32_t fence_count,
1941 const VkFence *fences,
1942 bool wait_for_all,
1943 std::uint64_t timeout);
1944 VkResult wait(std::uint64_t timeout)
1945 {
1946 constexpr std::size_t fence_count = 1;
1947 VkFence fences[fence_count] = {
1948 to_handle(this),
1949 };
1950 return wait_multiple(fence_count, fences, true, timeout);
1951 }
1952 static std::unique_ptr<Vulkan_fence> create(Vulkan_device &device,
1953 const VkFenceCreateInfo &create_info);
1954 };
1955
1956 struct Vulkan_device : public Vulkan_dispatchable_object<Vulkan_device, VkDevice>
1957 {
1958 struct Job
1959 {
1960 virtual ~Job() = default;
1961 virtual void run() noexcept = 0;
1962 };
1963 class Queue : public Vulkan_dispatchable_object<Queue, VkQueue>
1964 {
1965 private:
1966 std::mutex mutex;
1967 std::condition_variable cond;
1968 util::Static_circular_deque<std::unique_ptr<Job>, 0x10> jobs;
1969 std::thread executor_thread;
1970 bool quit;
1971 bool running_job;
1972
1973 private:
1974 void thread_fn() noexcept
1975 {
1976 std::unique_lock<std::mutex> lock(mutex);
1977 while(true)
1978 {
1979 if(jobs.empty())
1980 {
1981 if(quit)
1982 return;
1983 cond.wait(lock);
1984 continue;
1985 }
1986 auto job = std::move(jobs.front());
1987 bool was_full = jobs.full();
1988 jobs.pop_front();
1989 if(was_full)
1990 cond.notify_all();
1991 running_job = true;
1992 lock.unlock();
1993 job->run();
1994 lock.lock();
1995 running_job = false;
1996 }
1997 }
1998
1999 public:
2000 Queue() : mutex(), cond(), jobs(), executor_thread(), quit(false), running_job(false)
2001 {
2002 executor_thread = std::thread(&Queue::thread_fn, this);
2003 }
2004 ~Queue()
2005 {
2006 std::unique_lock<std::mutex> lock(mutex);
2007 quit = true;
2008 cond.notify_all();
2009 lock.unlock();
2010 executor_thread.join();
2011 }
2012
2013 private:
2014 bool is_idle(std::unique_lock<std::mutex> &lock)
2015 {
2016 if(!jobs.empty())
2017 return false;
2018 if(running_job)
2019 return false;
2020 return true;
2021 }
2022
2023 public:
2024 bool is_idle()
2025 {
2026 std::unique_lock<std::mutex> lock(mutex);
2027 return is_idle(lock);
2028 }
2029 void wait_idle()
2030 {
2031 std::unique_lock<std::mutex> lock(mutex);
2032 while(!is_idle(lock))
2033 cond.wait(lock);
2034 }
2035 void queue_job(std::unique_ptr<Job> job)
2036 {
2037 std::unique_lock<std::mutex> lock(mutex);
2038 while(jobs.full())
2039 cond.wait(lock);
2040 bool was_idle = is_idle(lock);
2041 jobs.push_back(std::move(job));
2042 if(was_idle)
2043 cond.notify_all();
2044 }
2045 void queue_fence_signal(Vulkan_fence &fence)
2046 {
2047 struct Signal_fence_job final : public Job
2048 {
2049 Vulkan_fence &fence;
2050 explicit Signal_fence_job(Vulkan_fence &fence) noexcept : fence(fence)
2051 {
2052 }
2053 virtual void run() noexcept override
2054 {
2055 fence.signal();
2056 }
2057 };
2058 queue_job(std::make_unique<Signal_fence_job>(fence));
2059 }
2060 };
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),
2073 queues{},
2074 extensions(extensions)
2075 {
2076 for(auto &queue : queues)
2077 queue = std::make_unique<Queue>();
2078 }
2079 void wait_idle()
2080 {
2081 for(auto &queue : queues)
2082 queue->wait_idle();
2083 }
2084 static util::variant<std::unique_ptr<Vulkan_device>, VkResult> create(
2085 Vulkan_physical_device &physical_device, const VkDeviceCreateInfo &create_info);
2086 };
2087
2088 struct Vulkan_image_descriptor
2089 {
2090 static constexpr VkImageCreateFlags supported_flags =
2091 VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT | VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT;
2092 VkImageCreateFlags flags;
2093 VkImageType type;
2094 VkFormat format;
2095 VkExtent3D extent;
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(),
2102 type(),
2103 format(),
2104 extent(),
2105 mip_levels(),
2106 array_layers(),
2107 samples(),
2108 tiling()
2109 {
2110 }
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)
2120 {
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);
2127
2128 #warning finish implementing Image
2129 assert(type == VK_IMAGE_TYPE_2D && "unimplemented image type");
2130 assert(extent.depth == 1);
2131
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");
2138 }
2139 constexpr Vulkan_image_descriptor(VkImageCreateFlags flags,
2140 VkImageType type,
2141 VkFormat format,
2142 VkExtent3D extent,
2143 std::uint32_t mip_levels,
2144 std::uint32_t array_layers,
2145 VkSampleCountFlagBits samples,
2146 VkImageTiling tiling) noexcept : flags(flags),
2147 type(type),
2148 format(format),
2149 extent(extent),
2150 mip_levels(mip_levels),
2151 array_layers(array_layers),
2152 samples(samples),
2153 tiling(tiling)
2154 {
2155 }
2156 constexpr std::size_t get_memory_size() const noexcept
2157 {
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);
2163
2164 assert(type == VK_IMAGE_TYPE_2D && "unimplemented image type");
2165 assert(extent.depth == 1);
2166
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;
2174 return retval;
2175 }
2176 constexpr std::size_t get_memory_stride() const noexcept
2177 {
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);
2183
2184 assert(type == VK_IMAGE_TYPE_2D && "unimplemented image type");
2185 assert(extent.depth == 1);
2186
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;
2193 return retval;
2194 }
2195 constexpr std::size_t get_memory_pixel_size() const noexcept
2196 {
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);
2202
2203 assert(type == VK_IMAGE_TYPE_2D && "unimplemented image type");
2204 assert(extent.depth == 1);
2205
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);
2211 return retval;
2212 }
2213 };
2214
2215 struct Vulkan_image : public Vulkan_nondispatchable_object<Vulkan_image, VkImage>
2216 {
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))
2222 {
2223 }
2224 static std::unique_ptr<Vulkan_image> create_with_memory(
2225 const Vulkan_image_descriptor &descriptor)
2226 {
2227 std::shared_ptr<unsigned char> memory(new unsigned char[descriptor.get_memory_size()],
2228 [](unsigned char *p) noexcept
2229 {
2230 delete[] p;
2231 });
2232 return std::make_unique<Vulkan_image>(descriptor, std::move(memory));
2233 }
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);
2239 };
2240
2241 struct Vulkan_command_pool;
2242
2243 struct Vulkan_command_buffer
2244 : public Vulkan_dispatchable_object<Vulkan_command_buffer, VkCommandBuffer>
2245 {
2246 struct Running_state
2247 {
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)
2253 {
2254 }
2255 #warning finish implementing Vulkan_command_buffer
2256 };
2257 class Command
2258 {
2259 public:
2260 virtual ~Command() = default;
2261 virtual void run(Running_state &state) noexcept = 0;
2262 virtual void on_record_end(Vulkan_command_buffer &command_buffer);
2263 };
2264 enum class Command_buffer_state
2265 {
2266 Initial,
2267 Recording,
2268 Executable,
2269 Out_of_memory,
2270 };
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
2283 {
2284 if(state == Command_buffer_state::Out_of_memory)
2285 return;
2286 assert(state == Command_buffer_state::Recording);
2287 try
2288 {
2289 fn();
2290 }
2291 catch(std::bad_alloc &)
2292 {
2293 state = Command_buffer_state::Out_of_memory;
2294 }
2295 }
2296 VkResult end() noexcept;
2297 void run() const noexcept;
2298 };
2299
2300 struct Vulkan_command_pool
2301 : public Vulkan_nondispatchable_object<Vulkan_command_pool, VkCommandPool>
2302 {
2303 std::list<std::unique_ptr<Vulkan_command_buffer>> command_buffers;
2304 void reset(VkCommandPoolResetFlags flags)
2305 {
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);
2312 }
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
2317 {
2318 if(!command_buffer_handle)
2319 return;
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);
2323 }
2324 void free_multiple(const VkCommandBuffer *allocated_command_buffers,
2325 std::uint32_t command_buffer_count) noexcept
2326 {
2327 for(std::uint32_t i = 0; i < command_buffer_count; i++)
2328 free_command_buffer(allocated_command_buffers[i]);
2329 }
2330 static std::unique_ptr<Vulkan_command_pool> create(Vulkan_device &device,
2331 const VkCommandPoolCreateInfo &create_info);
2332 };
2333 }
2334 }
2335
2336 #endif // VULKAN_API_OBJECTS_H_