From e02f9fd89b059919baf3a8d8bf8b783470976a27 Mon Sep 17 00:00:00 2001 From: Steven Le Rouzic Date: Sat, 27 Apr 2024 01:16:21 +0200 Subject: Some work on Vulkan initialization --- deimos/vulkan/BUILD | 2 ++ deimos/vulkan/vulkan.h | 4 ++++ deimos/vulkan/vulkan_bootstrap_functions.inc | 3 +++ deimos/vulkan/vulkan_entry_functions.inc | 1 - deimos/vulkan/vulkan_instance_functions.inc | 6 ++++++ deimos/vulkan/vulkan_loader.cpp | 18 +++++++++++++++++- 6 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 deimos/vulkan/vulkan_bootstrap_functions.inc create mode 100644 deimos/vulkan/vulkan_instance_functions.inc (limited to 'deimos/vulkan') 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(); + #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) -- cgit