summaryrefslogtreecommitdiff
path: root/deimos/vulkan
diff options
context:
space:
mode:
authorSteven Le Rouzic <steven.lerouzic@gmail.com>2024-04-27 01:16:21 +0200
committerSteven Le Rouzic <steven.lerouzic@gmail.com>2024-04-27 01:16:21 +0200
commite02f9fd89b059919baf3a8d8bf8b783470976a27 (patch)
tree6bb16cce1231dba9b0eab5f43ceb7c5d86f8e7cb /deimos/vulkan
parent08eece258ceff7824250454906bff013a7303c28 (diff)
Some work on Vulkan initialization
Diffstat (limited to 'deimos/vulkan')
-rw-r--r--deimos/vulkan/BUILD2
-rw-r--r--deimos/vulkan/vulkan.h4
-rw-r--r--deimos/vulkan/vulkan_bootstrap_functions.inc3
-rw-r--r--deimos/vulkan/vulkan_entry_functions.inc1
-rw-r--r--deimos/vulkan/vulkan_instance_functions.inc6
-rw-r--r--deimos/vulkan/vulkan_loader.cpp18
6 files changed, 32 insertions, 2 deletions
diff --git a/deimos/vulkan/BUILD b/deimos/vulkan/BUILD
index a773fa1..8f0a79e 100644
--- a/deimos/vulkan/BUILD
+++ b/deimos/vulkan/BUILD
@@ -5,7 +5,9 @@ cc_library(
],
srcs = [
"vulkan_loader.cpp",
+ "vulkan_bootstrap_functions.inc",
"vulkan_entry_functions.inc",
+ "vulkan_instance_functions.inc",
],
deps = [
"//deimos/core",
diff --git a/deimos/vulkan/vulkan.h b/deimos/vulkan/vulkan.h
index 48d53b3..4315230 100644
--- a/deimos/vulkan/vulkan.h
+++ b/deimos/vulkan/vulkan.h
@@ -20,7 +20,9 @@ class ApiRegistry;
struct VulkanApi
{
#define FN(NAME) PFN_vk##NAME NAME{};
+#include "deimos/vulkan/vulkan_bootstrap_functions.inc"
#include "deimos/vulkan/vulkan_entry_functions.inc"
+#include "deimos/vulkan/vulkan_instance_functions.inc"
#undef FN
};
@@ -34,6 +36,8 @@ public:
static constexpr IdName kApiName{"deimos::VulkanLoaderApi"};
virtual VulkanApi* LoadEntry() = 0;
+
+ virtual void LoadInstance(VulkanApi*, VkInstance) = 0;
};
void RegisterVulkanLoaderApi(ApiRegistry*);
diff --git a/deimos/vulkan/vulkan_bootstrap_functions.inc b/deimos/vulkan/vulkan_bootstrap_functions.inc
new file mode 100644
index 0000000..a69c5a6
--- /dev/null
+++ b/deimos/vulkan/vulkan_bootstrap_functions.inc
@@ -0,0 +1,3 @@
+// NOLINTBEGIN
+FN(GetInstanceProcAddr)
+// NOLINTEND
diff --git a/deimos/vulkan/vulkan_entry_functions.inc b/deimos/vulkan/vulkan_entry_functions.inc
index fe5f9ea..761cb0f 100644
--- a/deimos/vulkan/vulkan_entry_functions.inc
+++ b/deimos/vulkan/vulkan_entry_functions.inc
@@ -1,4 +1,3 @@
// NOLINTBEGIN
-FN(GetInstanceProcAddr)
FN(CreateInstance)
// NOLINTEND
diff --git a/deimos/vulkan/vulkan_instance_functions.inc b/deimos/vulkan/vulkan_instance_functions.inc
new file mode 100644
index 0000000..34535ad
--- /dev/null
+++ b/deimos/vulkan/vulkan_instance_functions.inc
@@ -0,0 +1,6 @@
+// NOLINTBEGIN
+FN(EnumeratePhysicalDevices)
+FN(GetPhysicalDeviceProperties2)
+FN(GetPhysicalDeviceQueueFamilyProperties)
+FN(DestroyInstance)
+// NOLINTEND
diff --git a/deimos/vulkan/vulkan_loader.cpp b/deimos/vulkan/vulkan_loader.cpp
index ddd5cf0..0760c67 100644
--- a/deimos/vulkan/vulkan_loader.cpp
+++ b/deimos/vulkan/vulkan_loader.cpp
@@ -31,16 +31,32 @@ public:
else
{
deimos_Panic("Couldn't load Vulkan DLL");
- return nullptr;
}
}
VulkanApi* api = m_allocator->New<VulkanApi>();
+
#define FN(NAME) api->NAME = (PFN_vk##NAME)os_api->dll->GetSymbol(m_vulkan_dll, "vk" #NAME);
+#include "deimos/vulkan/vulkan_bootstrap_functions.inc"
+#undef FN
+
+#define FN(NAME) api->NAME = (PFN_vk##NAME)api->GetInstanceProcAddr(VK_NULL_HANDLE, "vk" #NAME);
#include "deimos/vulkan/vulkan_entry_functions.inc"
#undef FN
+
return api;
}
+
+ void LoadInstance(VulkanApi* api, VkInstance instance) override
+ {
+ Expects(api != nullptr);
+ Expects(instance != VK_NULL_HANDLE);
+ Expects(api->GetInstanceProcAddr != nullptr);
+
+#define FN(NAME) api->NAME = (PFN_vk##NAME)api->GetInstanceProcAddr(instance, "vk" #NAME);
+#include "deimos/vulkan/vulkan_instance_functions.inc"
+#undef FN
+ }
};
void RegisterVulkanLoaderApi(ApiRegistry* registry)