summaryrefslogtreecommitdiff
path: root/hk21/vulkan
diff options
context:
space:
mode:
Diffstat (limited to 'hk21/vulkan')
-rw-r--r--hk21/vulkan/BUILD.bazel16
-rw-r--r--hk21/vulkan/loader/BUILD.bazel21
-rw-r--r--hk21/vulkan/loader/fns.hpp47
-rw-r--r--hk21/vulkan/loader/loader.cpp67
-rw-r--r--hk21/vulkan/loader/loader.hpp27
-rw-r--r--hk21/vulkan/vulkan.hpp12
6 files changed, 190 insertions, 0 deletions
diff --git a/hk21/vulkan/BUILD.bazel b/hk21/vulkan/BUILD.bazel
new file mode 100644
index 0000000..25cc0d6
--- /dev/null
+++ b/hk21/vulkan/BUILD.bazel
@@ -0,0 +1,16 @@
+# Copyright 2025 Steven Le Rouzic
+#
+# SPDX-License-Identifier: BSD-3-Clause
+
+cc_library(
+ name = "vulkan",
+ hdrs = [
+ "vulkan.hpp",
+ ],
+ deps = [
+ "//vendor/vulkan",
+ "@asl//asl/base",
+ ],
+ visibility = ["//:__subpackages__"],
+ applicable_licenses = ["//:license"],
+)
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<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();
+}
+
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 <asl/base/integers.hpp>
+#include <asl/types/status.hpp>
+
+#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
+
diff --git a/hk21/vulkan/vulkan.hpp b/hk21/vulkan/vulkan.hpp
new file mode 100644
index 0000000..0e3242b
--- /dev/null
+++ b/hk21/vulkan/vulkan.hpp
@@ -0,0 +1,12 @@
+// Copyright 2025 Steven Le Rouzic
+//
+// SPDX-License-Identifier: BSD-3-Clause
+
+#pragma once
+
+#include <asl/base/integers.hpp>
+
+#define VK_NO_STDDEF_H
+#define VK_NO_STDINT_H
+#define VK_NO_PROTOTYPES
+#include <vulkan.h>