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/BUILD.bazel | 21 +++++++++++++ hk21/vulkan/loader/fns.hpp | 47 +++++++++++++++++++++++++++++ hk21/vulkan/loader/loader.cpp | 67 ++++++++++++++++++++++++++++++++++++++++++ hk21/vulkan/loader/loader.hpp | 27 +++++++++++++++++ 4 files changed, 162 insertions(+) create mode 100644 hk21/vulkan/loader/BUILD.bazel create mode 100644 hk21/vulkan/loader/fns.hpp create mode 100644 hk21/vulkan/loader/loader.cpp create mode 100644 hk21/vulkan/loader/loader.hpp (limited to 'hk21/vulkan/loader') diff --git a/hk21/vulkan/loader/BUILD.bazel b/hk21/vulkan/loader/BUILD.bazel new file mode 100644 index 0000000..32e8f03 --- /dev/null +++ b/hk21/vulkan/loader/BUILD.bazel @@ -0,0 +1,21 @@ +# Copyright 2025 Steven Le Rouzic +# +# SPDX-License-Identifier: BSD-3-Clause + +cc_library( + name = "loader", + hdrs = [ + "loader.hpp", + ], + srcs = [ + "loader.cpp", + "fns.hpp", + ], + deps = [ + "//hk21/vulkan", + "@asl//asl/base", + "@asl//asl/types:status", + ], + visibility = ["//:__subpackages__"], + applicable_licenses = ["//:license"], +) diff --git a/hk21/vulkan/loader/fns.hpp b/hk21/vulkan/loader/fns.hpp new file mode 100644 index 0000000..377b103 --- /dev/null +++ b/hk21/vulkan/loader/fns.hpp @@ -0,0 +1,47 @@ +// Copyright 2025 Steven Le Rouzic +// +// SPDX-License-Identifier: BSD-3-Clause + +#define VULKAN_GLOBAL_FNS \ + FN(vkEnumerateInstanceVersion) \ + FN(vkCreateInstance) + +#define VULKAN_INSTANCE_FNS \ + FN(vkDestroyInstance) \ + FN(vkDestroySurfaceKHR) \ + FN(vkEnumeratePhysicalDevices) \ + FN(vkGetPhysicalDeviceProperties) \ + FN(vkGetPhysicalDeviceQueueFamilyProperties) \ + FN(vkCreateDevice) \ + FN(vkGetDeviceProcAddr) \ + FN(vkGetPhysicalDeviceSurfaceCapabilitiesKHR) \ + FN(vkGetPhysicalDeviceSurfaceFormatsKHR) \ + FN(vkGetPhysicalDeviceSurfacePresentModesKHR) \ + FN(vkGetPhysicalDeviceFeatures2) + +#define VULKAN_DEVICE_FNS \ + FN(vkDestroyDevice) \ + FN(vkGetDeviceQueue) \ + FN(vkCreateSwapchainKHR) \ + FN(vkDestroySwapchainKHR) \ + FN(vkGetSwapchainImagesKHR) \ + FN(vkAcquireNextImageKHR) \ + FN(vkQueuePresentKHR) \ + FN(vkCreateCommandPool) \ + FN(vkDestroyCommandPool) \ + FN(vkResetCommandPool) \ + FN(vkDeviceWaitIdle) \ + FN(vkAllocateCommandBuffers) \ + FN(vkResetCommandBuffer) \ + FN(vkFreeCommandBuffers) \ + FN(vkBeginCommandBuffer) \ + FN(vkEndCommandBuffer) \ + FN(vkQueueSubmit2) \ + FN(vkCreateSemaphore) \ + FN(vkDestroySemaphore) \ + FN(vkCmdPipelineBarrier2) \ + FN(vkCmdClearColorImage) \ + FN(vkCreateFence) \ + FN(vkDestroyFence) \ + FN(vkGetFenceStatus) + 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(); +} + diff --git a/hk21/vulkan/loader/loader.hpp b/hk21/vulkan/loader/loader.hpp new file mode 100644 index 0000000..e1147f4 --- /dev/null +++ b/hk21/vulkan/loader/loader.hpp @@ -0,0 +1,27 @@ +// Copyright 2025 Steven Le Rouzic +// +// SPDX-License-Identifier: BSD-3-Clause + +#pragma once + +#include +#include + +#include "hk21/vulkan/vulkan.hpp" +#include "hk21/vulkan/loader/fns.hpp" + +#define FN(NAME) extern PFN_##NAME NAME; +VULKAN_GLOBAL_FNS +VULKAN_INSTANCE_FNS +VULKAN_DEVICE_FNS +#undef FN + +namespace vulkan_loader +{ + +asl::status load_global(PFN_vkGetInstanceProcAddr load_fn); +asl::status load_instance(PFN_vkGetInstanceProcAddr load_fn, VkInstance instance); +asl::status load_device(VkDevice device); + +} // namespace vulkan_loader + -- cgit