From edb38589b1fe8b806d28264393ee172d03b6c75c Mon Sep 17 00:00:00 2001 From: Steven Le Rouzic Date: Tue, 21 Jan 2025 21:49:20 +0100 Subject: Add vulkan_loader --- game/BUILD.bazel | 2 +- game/main.cpp | 19 +++++++++++++++---- hk21/vulkan_loader/BUILD.bazel | 15 +++++++++++++++ hk21/vulkan_loader/api.hpp | 23 +++++++++++++++++++++++ hk21/vulkan_loader/fns.hpp | 3 +++ hk21/vulkan_loader/loader.cpp | 25 +++++++++++++++++++++++++ 6 files changed, 82 insertions(+), 5 deletions(-) create mode 100644 hk21/vulkan_loader/BUILD.bazel create mode 100644 hk21/vulkan_loader/api.hpp create mode 100644 hk21/vulkan_loader/fns.hpp create mode 100644 hk21/vulkan_loader/loader.cpp 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 #include -#define VK_NO_STDDEF_H -#define VK_NO_STDINT_H -#define VK_NO_PROTOTYPES -#include +#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(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 +#include + +#define VK_NO_STDDEF_H +#define VK_NO_STDINT_H +#define VK_NO_PROTOTYPES +#include + +#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(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(); +} + -- cgit