UraniumCompute 0.1.0
A GPU accelerated parallel task scheduler
VulkanInclude.h
1#pragma once
2#include <UnCompute/Base/Logger.h>
3#include <array>
4#include <volk.h>
5
6namespace UN
7{
8 enum
9 {
10 VK_FLAGS_NONE = 0
11 };
12
13 constexpr auto RequiredInstanceExtensions = std::array{ VK_EXT_DEBUG_REPORT_EXTENSION_NAME,
14 VK_EXT_DEBUG_UTILS_EXTENSION_NAME,
15 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME };
16
17 constexpr auto DescriptorTypeMaxValue = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT + 1;
18
20 inline bool Succeeded(VkResult result)
21 {
22 return result == VK_SUCCESS;
23 }
24
26 inline bool Failed(VkResult result)
27 {
28 return result != VK_SUCCESS;
29 }
30
31 inline const char* VulkanResultToString(VkResult result)
32 {
33 switch (result)
34 {
35 // clang-format off
36 case VK_SUCCESS: return "VkResult::VK_SUCCESS";
37 case VK_NOT_READY: return "VkResult::VK_NOT_READY";
38 case VK_TIMEOUT: return "VkResult::VK_TIMEOUT";
39 case VK_EVENT_SET: return "VkResult::VK_EVENT_SET";
40 case VK_EVENT_RESET: return "VkResult::VK_EVENT_RESET";
41 case VK_INCOMPLETE: return "VkResult::VK_INCOMPLETE";
42 case VK_ERROR_OUT_OF_HOST_MEMORY: return "VkResult::VK_ERROR_OUT_OF_HOST_MEMORY";
43 case VK_ERROR_OUT_OF_DEVICE_MEMORY: return "VkResult::VK_ERROR_OUT_OF_DEVICE_MEMORY";
44 case VK_ERROR_INITIALIZATION_FAILED: return "VkResult::VK_ERROR_INITIALIZATION_FAILED";
45 case VK_ERROR_DEVICE_LOST: return "VkResult::VK_ERROR_DEVICE_LOST";
46 case VK_ERROR_MEMORY_MAP_FAILED: return "VkResult::VK_ERROR_MEMORY_MAP_FAILED";
47 case VK_ERROR_LAYER_NOT_PRESENT: return "VkResult::VK_ERROR_LAYER_NOT_PRESENT";
48 case VK_ERROR_EXTENSION_NOT_PRESENT: return "VkResult::VK_ERROR_EXTENSION_NOT_PRESENT";
49 case VK_ERROR_FEATURE_NOT_PRESENT: return "VkResult::VK_ERROR_FEATURE_NOT_PRESENT";
50 case VK_ERROR_INCOMPATIBLE_DRIVER: return "VkResult::VK_ERROR_INCOMPATIBLE_DRIVER";
51 case VK_ERROR_TOO_MANY_OBJECTS: return "VkResult::VK_ERROR_TOO_MANY_OBJECTS";
52 case VK_ERROR_FORMAT_NOT_SUPPORTED: return "VkResult::VK_ERROR_FORMAT_NOT_SUPPORTED";
53 case VK_ERROR_FRAGMENTED_POOL: return "VkResult::VK_ERROR_FRAGMENTED_POOL";
54 case VK_ERROR_UNKNOWN: return "VkResult::VK_ERROR_UNKNOWN";
55 case VK_ERROR_OUT_OF_POOL_MEMORY: return "VkResult::VK_ERROR_OUT_OF_POOL_MEMORY";
56 case VK_ERROR_INVALID_EXTERNAL_HANDLE: return "VkResult::VK_ERROR_INVALID_EXTERNAL_HANDLE";
57 case VK_ERROR_FRAGMENTATION: return "VkResult::VK_ERROR_FRAGMENTATION";
58 case VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS: return "VkResult::VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS";
59 case VK_ERROR_VALIDATION_FAILED_EXT: return "VkResult::VK_ERROR_VALIDATION_FAILED_EXT";
60 // clang-format on
61 default:
62 UN_Assert(false, "VkResult was unknown");
63 return "VkResult::<UNKNOWN>";
64 }
65 }
66
67 inline ResultCode VulkanConvert(VkResult result)
68 {
69 switch (result)
70 {
71 case VK_SUCCESS:
72 return ResultCode::Success;
73 case VK_TIMEOUT:
74 return ResultCode::Timeout;
75 case VK_ERROR_OUT_OF_HOST_MEMORY:
76 case VK_ERROR_OUT_OF_DEVICE_MEMORY:
77 case VK_ERROR_OUT_OF_POOL_MEMORY:
78 return ResultCode::OutOfMemory;
79 default:
80 return ResultCode::Fail;
81 }
82 }
83} // namespace UN
84
85template<>
86struct fmt::formatter<VkResult> : fmt::formatter<std::string_view>
87{
88 template<typename FormatContext>
89 auto format(const VkResult& result, FormatContext& ctx) const -> decltype(ctx.out())
90 {
91 return fmt::format_to(ctx.out(), "{}", UN::VulkanResultToString(result));
92 }
93};