diff options
author | Steven Le Rouzic <steven.lerouzic@gmail.com> | 2025-01-22 23:43:09 +0100 |
---|---|---|
committer | Steven Le Rouzic <steven.lerouzic@gmail.com> | 2025-01-22 23:43:09 +0100 |
commit | 639de20a5b78c8c70f3d7dcc02e62b13f6e749f0 (patch) | |
tree | 42cce01cc415c29624855fd38ef6a5d978c7f7dc | |
parent | df1b3ccfba1d88d382dab2e83cc950f3dc55995d (diff) |
Create Vulkan instance
-rw-r--r-- | game/main.cpp | 51 | ||||
-rw-r--r-- | hk21/vulkan_loader/api.hpp | 2 | ||||
-rw-r--r-- | hk21/vulkan_loader/fns.hpp | 3 | ||||
-rw-r--r-- | hk21/vulkan_loader/loader.cpp | 20 |
4 files changed, 73 insertions, 3 deletions
diff --git a/game/main.cpp b/game/main.cpp index 7bbbd71..13eacac 100644 --- a/game/main.cpp +++ b/game/main.cpp @@ -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();
diff --git a/hk21/vulkan_loader/api.hpp b/hk21/vulkan_loader/api.hpp index 08003e5..c248737 100644 --- a/hk21/vulkan_loader/api.hpp +++ b/hk21/vulkan_loader/api.hpp @@ -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
diff --git a/hk21/vulkan_loader/fns.hpp b/hk21/vulkan_loader/fns.hpp index 5e35b39..c0e8f85 100644 --- a/hk21/vulkan_loader/fns.hpp +++ b/hk21/vulkan_loader/fns.hpp @@ -1,3 +1,6 @@ #define VULKAN_GLOBAL_FNS \
FN(vkEnumerateInstanceVersion) \
FN(vkCreateInstance)
+
+#define VULKAN_INSTANCE_FNS \
+ FN(vkDestroyInstance)
diff --git a/hk21/vulkan_loader/loader.cpp b/hk21/vulkan_loader/loader.cpp index 4437282..c805fb1 100644 --- a/hk21/vulkan_loader/loader.cpp +++ b/hk21/vulkan_loader/loader.cpp @@ -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();
+}
+
|