// Copyright 2025 Steven Le Rouzic // // SPDX-License-Identifier: BSD-3-Clause #include "hk21/vulkan_loader/api.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(); }