diff options
author | Steven Le Rouzic <steven.lerouzic@gmail.com> | 2025-04-08 23:18:47 +0200 |
---|---|---|
committer | Steven Le Rouzic <steven.lerouzic@gmail.com> | 2025-04-08 23:18:47 +0200 |
commit | 921d1811ece439086aa238a6356a54d00f179e27 (patch) | |
tree | 8c1a8c756176e54ea70bfce8b28344a6116bc78f /hk21/vulkan/loader/loader.cpp | |
parent | d10e76d5a1a6b2b425cc6c780d91f52695177a02 (diff) |
Move the Vulkan loader
Diffstat (limited to 'hk21/vulkan/loader/loader.cpp')
-rw-r--r-- | hk21/vulkan/loader/loader.cpp | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/hk21/vulkan/loader/loader.cpp b/hk21/vulkan/loader/loader.cpp new file mode 100644 index 0000000..e5e73d0 --- /dev/null +++ b/hk21/vulkan/loader/loader.cpp @@ -0,0 +1,67 @@ +// Copyright 2025 Steven Le Rouzic
+//
+// SPDX-License-Identifier: BSD-3-Clause
+
+#include "hk21/vulkan/loader/loader.hpp"
+
+#define FN(NAME) PFN_##NAME NAME;
+VULKAN_GLOBAL_FNS
+VULKAN_INSTANCE_FNS
+VULKAN_DEVICE_FNS
+#undef FN
+
+asl::status vulkan_loader::load_global(PFN_vkGetInstanceProcAddr load_fn)
+{
+ (void)load_fn;
+
+ bool has_errors = false;
+
+#define FN(NAME) \
+ NAME = asl::bit_cast<PFN_##NAME>(load_fn(VK_NULL_HANDLE, #NAME)); \
+ if (NAME == nullptr) \
+ { \
+ ASL_ASSERT(NAME != nullptr); \
+ has_errors = true; \
+ }
+VULKAN_GLOBAL_FNS
+#undef FN
+
+ return has_errors ? asl::runtime_error("Couldn't load Vulkan global functions") : asl::ok();
+}
+
+asl::status vulkan_loader::load_instance(PFN_vkGetInstanceProcAddr load_fn, VkInstance instance)
+{
+ (void)load_fn;
+
+ bool has_errors = false;
+
+#define FN(NAME) \
+ NAME = asl::bit_cast<PFN_##NAME>(load_fn(instance, #NAME)); \
+ if (NAME == nullptr) \
+ { \
+ ASL_ASSERT(NAME != nullptr); \
+ has_errors = true; \
+ }
+VULKAN_INSTANCE_FNS
+#undef FN
+
+ return has_errors ? asl::runtime_error("Couldn't load Vulkan instance functions") : asl::ok();
+}
+
+asl::status vulkan_loader::load_device(VkDevice device)
+{
+ bool has_errors = false;
+
+#define FN(NAME) \
+ NAME = asl::bit_cast<PFN_##NAME>(vkGetDeviceProcAddr(device, #NAME)); \
+ if (NAME == nullptr) \
+ { \
+ ASL_ASSERT(NAME != nullptr); \
+ has_errors = true; \
+ }
+VULKAN_DEVICE_FNS
+#undef FN
+
+ return has_errors ? asl::runtime_error("Couldn't load Vulkan device functions") : asl::ok();
+}
+
|