Add vulkan_loader
This commit is contained in:
@ -6,6 +6,6 @@ cc_binary(
|
||||
deps = [
|
||||
"@asl//asl",
|
||||
"@sdl3_windows//:sdl3",
|
||||
"//vendor/vulkan",
|
||||
"//hk21/vulkan_loader",
|
||||
],
|
||||
)
|
||||
|
@ -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 */[])
|
||||
{
|
||||
@ -37,6 +34,20 @@ int SDL_main(int /* argc */, char* /* argv */[])
|
||||
|
||||
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)
|
||||
{
|
||||
|
15
hk21/vulkan_loader/BUILD.bazel
Normal file
15
hk21/vulkan_loader/BUILD.bazel
Normal 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__"],
|
||||
)
|
23
hk21/vulkan_loader/api.hpp
Normal file
23
hk21/vulkan_loader/api.hpp
Normal 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
|
||||
|
3
hk21/vulkan_loader/fns.hpp
Normal file
3
hk21/vulkan_loader/fns.hpp
Normal file
@ -0,0 +1,3 @@
|
||||
#define VULKAN_GLOBAL_FNS \
|
||||
FN(vkEnumerateInstanceVersion) \
|
||||
FN(vkCreateInstance)
|
25
hk21/vulkan_loader/loader.cpp
Normal file
25
hk21/vulkan_loader/loader.cpp
Normal 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();
|
||||
}
|
||||
|
Reference in New Issue
Block a user