Add vulkan_loader

This commit is contained in:
2025-01-21 21:49:20 +01:00
parent a106e1cf85
commit edb38589b1
6 changed files with 82 additions and 5 deletions

View File

@ -6,6 +6,6 @@ cc_binary(
deps = [ deps = [
"@asl//asl", "@asl//asl",
"@sdl3_windows//:sdl3", "@sdl3_windows//:sdl3",
"//vendor/vulkan", "//hk21/vulkan_loader",
], ],
) )

View File

@ -5,10 +5,7 @@
#include <SDL3/SDL_main.h> #include <SDL3/SDL_main.h>
#include <SDL3/SDL_vulkan.h> #include <SDL3/SDL_vulkan.h>
#define VK_NO_STDDEF_H #include "hk21/vulkan_loader/api.hpp"
#define VK_NO_STDINT_H
#define VK_NO_PROTOTYPES
#include <vulkan.h>
int SDL_main(int /* argc */, char* /* argv */[]) 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); instance_extensions.push(VK_EXT_DEBUG_UTILS_EXTENSION_NAME);
device_extensions.push(VK_KHR_SWAPCHAIN_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; bool running = true;
while (running) while (running)

View File

@ -0,0 +1,15 @@
cc_library(
name = "vulkan_loader",
hdrs = [
"api.hpp",
],
srcs = [
"loader.cpp",
"fns.hpp",
],
deps = [
"//vendor/vulkan",
"@asl//asl",
],
visibility = ["//:__subpackages__"],
)

View File

@ -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

View File

@ -0,0 +1,3 @@
#define VULKAN_GLOBAL_FNS \
FN(vkEnumerateInstanceVersion) \
FN(vkCreateInstance)

View File

@ -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();
}