summaryrefslogtreecommitdiff
path: root/hk21
diff options
context:
space:
mode:
Diffstat (limited to 'hk21')
-rw-r--r--hk21/vulkan_loader/BUILD.bazel15
-rw-r--r--hk21/vulkan_loader/api.hpp23
-rw-r--r--hk21/vulkan_loader/fns.hpp3
-rw-r--r--hk21/vulkan_loader/loader.cpp25
4 files changed, 66 insertions, 0 deletions
diff --git a/hk21/vulkan_loader/BUILD.bazel b/hk21/vulkan_loader/BUILD.bazel
new file mode 100644
index 0000000..8aa55a1
--- /dev/null
+++ b/hk21/vulkan_loader/BUILD.bazel
@@ -0,0 +1,15 @@
+cc_library(
+ name = "vulkan_loader",
+ hdrs = [
+ "api.hpp",
+ ],
+ srcs = [
+ "loader.cpp",
+ "fns.hpp",
+ ],
+ deps = [
+ "//vendor/vulkan",
+ "@asl//asl",
+ ],
+ visibility = ["//:__subpackages__"],
+)
diff --git a/hk21/vulkan_loader/api.hpp b/hk21/vulkan_loader/api.hpp
new file mode 100644
index 0000000..08003e5
--- /dev/null
+++ b/hk21/vulkan_loader/api.hpp
@@ -0,0 +1,23 @@
+#pragma once
+
+#include <asl/integers.hpp>
+#include <asl/status.hpp>
+
+#define VK_NO_STDDEF_H
+#define VK_NO_STDINT_H
+#define VK_NO_PROTOTYPES
+#include <vulkan.h>
+
+#include "hk21/vulkan_loader/fns.hpp"
+
+#define FN(NAME) extern PFN_##NAME NAME;
+VULKAN_GLOBAL_FNS
+#undef FN
+
+namespace vulkan_loader
+{
+
+asl::status load_global(PFN_vkGetInstanceProcAddr load_fn);
+
+} // namespace vulkan_loader
+
diff --git a/hk21/vulkan_loader/fns.hpp b/hk21/vulkan_loader/fns.hpp
new file mode 100644
index 0000000..5e35b39
--- /dev/null
+++ b/hk21/vulkan_loader/fns.hpp
@@ -0,0 +1,3 @@
+#define VULKAN_GLOBAL_FNS \
+ FN(vkEnumerateInstanceVersion) \
+ FN(vkCreateInstance)
diff --git a/hk21/vulkan_loader/loader.cpp b/hk21/vulkan_loader/loader.cpp
new file mode 100644
index 0000000..4437282
--- /dev/null
+++ b/hk21/vulkan_loader/loader.cpp
@@ -0,0 +1,25 @@
+#include "hk21/vulkan_loader/api.hpp"
+
+#define FN(NAME) PFN_##NAME NAME;
+VULKAN_GLOBAL_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() : asl::ok();
+}
+