diff options
author | Steven Le Rouzic <steven.lerouzic@gmail.com> | 2025-01-21 21:49:20 +0100 |
---|---|---|
committer | Steven Le Rouzic <steven.lerouzic@gmail.com> | 2025-01-21 21:49:20 +0100 |
commit | edb38589b1fe8b806d28264393ee172d03b6c75c (patch) | |
tree | 3053201fb65d968c11d95643cfe0dcde53c74540 | |
parent | a106e1cf85cbc934dc7628cd3328a8195404ce8b (diff) |
Add vulkan_loader
-rw-r--r-- | game/BUILD.bazel | 2 | ||||
-rw-r--r-- | game/main.cpp | 19 | ||||
-rw-r--r-- | hk21/vulkan_loader/BUILD.bazel | 15 | ||||
-rw-r--r-- | hk21/vulkan_loader/api.hpp | 23 | ||||
-rw-r--r-- | hk21/vulkan_loader/fns.hpp | 3 | ||||
-rw-r--r-- | hk21/vulkan_loader/loader.cpp | 25 |
6 files changed, 82 insertions, 5 deletions
diff --git a/game/BUILD.bazel b/game/BUILD.bazel index 1f59b90..6a5cdfd 100644 --- a/game/BUILD.bazel +++ b/game/BUILD.bazel @@ -6,6 +6,6 @@ cc_binary( deps = [
"@asl//asl",
"@sdl3_windows//:sdl3",
- "//vendor/vulkan",
+ "//hk21/vulkan_loader",
],
)
diff --git a/game/main.cpp b/game/main.cpp index c78c41e..7bbbd71 100644 --- a/game/main.cpp +++ b/game/main.cpp @@ -5,10 +5,7 @@ #include <SDL3/SDL_main.h>
#include <SDL3/SDL_vulkan.h>
-#define VK_NO_STDDEF_H
-#define VK_NO_STDINT_H
-#define VK_NO_PROTOTYPES
-#include <vulkan.h>
+#include "hk21/vulkan_loader/api.hpp"
int SDL_main(int /* argc */, char* /* argv */[])
{
@@ -36,6 +33,20 @@ int SDL_main(int /* argc */, char* /* argv */[]) instance_extensions.push(VK_EXT_DEBUG_UTILS_EXTENSION_NAME);
device_extensions.push(VK_KHR_SWAPCHAIN_EXTENSION_NAME);
+
+ auto vkGetInstanceProcAddr = asl::bit_cast<PFN_vkGetInstanceProcAddr>(SDL_Vulkan_GetVkGetInstanceProcAddr());
+ auto status = vulkan_loader::load_global(vkGetInstanceProcAddr);
+ if (!status.ok())
+ {
+ asl::eprint("Couldn't load global Vulkan functions: {}\n", status);
+ }
+
+ uint32_t version{};
+ vkEnumerateInstanceVersion(&version);
+
+ asl::print("Vulkan version: {}.{}\n",
+ VK_API_VERSION_MAJOR(version), // NOLINT
+ VK_API_VERSION_MINOR(version)); // NOLINT
bool running = true;
while (running)
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();
+}
+
|