From 921d1811ece439086aa238a6356a54d00f179e27 Mon Sep 17 00:00:00 2001 From: Steven Le Rouzic Date: Tue, 8 Apr 2025 23:18:47 +0200 Subject: Move the Vulkan loader --- hk21/vulkan/loader/loader.cpp | 67 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 hk21/vulkan/loader/loader.cpp (limited to 'hk21/vulkan/loader/loader.cpp') 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(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(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(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(); +} + -- cgit