Create Vulkan instance

This commit is contained in:
2025-01-22 23:43:09 +01:00
parent df1b3ccfba
commit 639de20a5b
4 changed files with 73 additions and 3 deletions

View File

@ -7,6 +7,8 @@
#include "hk21/vulkan_loader/api.hpp"
#define VK_ALLOCATOR nullptr
int SDL_main(int /* argc */, char* /* argv */[])
{
SDL_Init(SDL_INIT_VIDEO);
@ -39,14 +41,56 @@ int SDL_main(int /* argc */, char* /* argv */[])
if (!status.ok())
{
asl::eprint("Couldn't load global Vulkan functions: {}\n", status);
return 1;
}
uint32_t version{};
vkEnumerateInstanceVersion(&version);
asl::print("Vulkan version: {}.{}\n",
VK_API_VERSION_MAJOR(version), // NOLINT
VK_API_VERSION_MINOR(version)); // NOLINT
uint32_t vk_major = VK_API_VERSION_MAJOR(version); // NOLINT
uint32_t vk_minor = VK_API_VERSION_MINOR(version); // NOLINT
if (vk_major != 1 || vk_minor < 3)
{
asl::eprint("Incompatible Vulkan version: {}.{}\n", vk_major, vk_minor);
return 1;
}
VkApplicationInfo app_info{
.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO,
.pNext = nullptr,
.pApplicationName = "HK-21",
.applicationVersion = 0,
.pEngineName = "Custom",
.engineVersion = 0,
.apiVersion = VK_MAKE_API_VERSION(0, 1, 3, 0), // NOLINT
};
VkInstanceCreateInfo instance_create_info{
.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,
.pNext = nullptr,
.flags = 0,
.pApplicationInfo = &app_info,
.enabledLayerCount = static_cast<uint32_t>(layers.size()),
.ppEnabledLayerNames = layers.data(),
.enabledExtensionCount = static_cast<uint32_t>(instance_extensions.size()),
.ppEnabledExtensionNames = instance_extensions.data(),
};
VkInstance instance{};
VkResult res = vkCreateInstance(&instance_create_info, VK_ALLOCATOR, &instance);
if (res != VK_SUCCESS)
{
asl::eprint("Couldn't create Vulkan instance: {}\n", res);
return 1;
}
status = vulkan_loader::load_instance(vkGetInstanceProcAddr, instance);
if (!status.ok())
{
asl::eprint("Couldn't load instance Vulkan functions: {}\n", status);
return 1;
}
bool running = true;
while (running)
@ -63,6 +107,7 @@ int SDL_main(int /* argc */, char* /* argv */[])
SDL_Delay(16);
}
vkDestroyInstance(instance, VK_ALLOCATOR);
SDL_DestroyWindow(window);
SDL_Quit();

View File

@ -12,12 +12,14 @@
#define FN(NAME) extern PFN_##NAME NAME;
VULKAN_GLOBAL_FNS
VULKAN_INSTANCE_FNS
#undef FN
namespace vulkan_loader
{
asl::status load_global(PFN_vkGetInstanceProcAddr load_fn);
asl::status load_instance(PFN_vkGetInstanceProcAddr load_fn, VkInstance instance);
} // namespace vulkan_loader

View File

@ -1,3 +1,6 @@
#define VULKAN_GLOBAL_FNS \
FN(vkEnumerateInstanceVersion) \
FN(vkCreateInstance)
#define VULKAN_INSTANCE_FNS \
FN(vkDestroyInstance)

View File

@ -2,6 +2,7 @@
#define FN(NAME) PFN_##NAME NAME;
VULKAN_GLOBAL_FNS
VULKAN_INSTANCE_FNS
#undef FN
asl::status vulkan_loader::load_global(PFN_vkGetInstanceProcAddr load_fn)
@ -23,3 +24,22 @@ VULKAN_GLOBAL_FNS
return has_errors ? asl::runtime_error() : asl::ok();
}
asl::status vulkan_loader::load_instance(PFN_vkGetInstanceProcAddr load_fn, VkInstance instance)
{
(void)load_fn;
bool has_errors = false;
#define FN(NAME) \
NAME = asl::bit_cast<PFN_##NAME>(load_fn(instance, #NAME)); \
if (NAME == nullptr) \
{ \
ASL_ASSERT(NAME != nullptr); \
has_errors = true; \
}
VULKAN_INSTANCE_FNS
#undef FN
return has_errors ? asl::runtime_error() : asl::ok();
}