From 85985c4408906b18eb451ca94edabaa0c3607817 Mon Sep 17 00:00:00 2001 From: Steven Le Rouzic Date: Mon, 22 Apr 2024 00:17:53 +0200 Subject: Add Vulkan loader --- deimos/vulkan/BUILD | 15 ++++++++ deimos/vulkan/vulkan.h | 33 +++++++++++++++++ deimos/vulkan/vulkan_entry_functions.inc | 2 ++ deimos/vulkan/vulkan_loader.cpp | 61 ++++++++++++++++++++++++++++++++ 4 files changed, 111 insertions(+) create mode 100644 deimos/vulkan/BUILD create mode 100644 deimos/vulkan/vulkan.h create mode 100644 deimos/vulkan/vulkan_entry_functions.inc create mode 100644 deimos/vulkan/vulkan_loader.cpp (limited to 'deimos/vulkan') diff --git a/deimos/vulkan/BUILD b/deimos/vulkan/BUILD new file mode 100644 index 0000000..a773fa1 --- /dev/null +++ b/deimos/vulkan/BUILD @@ -0,0 +1,15 @@ +cc_library( + name = "vulkan", + hdrs = [ + "vulkan.h", + ], + srcs = [ + "vulkan_loader.cpp", + "vulkan_entry_functions.inc", + ], + deps = [ + "//deimos/core", + "//3rd_party/vulkan", + ], + visibility = ["//:__subpackages__"], +) diff --git a/deimos/vulkan/vulkan.h b/deimos/vulkan/vulkan.h new file mode 100644 index 0000000..549deac --- /dev/null +++ b/deimos/vulkan/vulkan.h @@ -0,0 +1,33 @@ +#pragma once + +#include +#include + +namespace deimos +{ + +class ApiRegistry; + +struct VulkanApi +{ +#define FN(NAME) PFN_vk##NAME NAME{}; +#include "deimos/vulkan/vulkan_entry_functions.inc" +#undef FN +}; + +class VulkanLoaderApi +{ +public: + VulkanLoaderApi() = default; + deimos_NO_COPY_MOVE(VulkanLoaderApi); + virtual ~VulkanLoaderApi() = default; + + static constexpr IdName kApiName{"deimos::VulkanLoaderApi"}; + + virtual VulkanApi* LoadEntry() = 0; +}; + +void RegisterVulkanLoaderApi(ApiRegistry*); + +} // namespace deimos + diff --git a/deimos/vulkan/vulkan_entry_functions.inc b/deimos/vulkan/vulkan_entry_functions.inc new file mode 100644 index 0000000..97584c4 --- /dev/null +++ b/deimos/vulkan/vulkan_entry_functions.inc @@ -0,0 +1,2 @@ +FN(GetInstanceProcAddr) +FN(CreateInstance) diff --git a/deimos/vulkan/vulkan_loader.cpp b/deimos/vulkan/vulkan_loader.cpp new file mode 100644 index 0000000..ddd5cf0 --- /dev/null +++ b/deimos/vulkan/vulkan_loader.cpp @@ -0,0 +1,61 @@ +#include "deimos/vulkan/vulkan.h" + +#include +#include +#include +#include + +static deimos::OsApi* os_api; +static deimos::LogApi* log_api; + +namespace deimos +{ + +class VulkanLoaderImpl : public VulkanLoaderApi +{ + Allocator* m_allocator; + gsl::owner m_vulkan_dll{}; + +public: + explicit VulkanLoaderImpl(Allocator* allocator) : m_allocator{allocator} {} + + VulkanApi* LoadEntry() override + { + if (m_vulkan_dll == nullptr) + { + m_vulkan_dll = os_api->dll->Open("vulkan-1.dll"); + if (m_vulkan_dll != nullptr) + { + log_api->LogInfo("Vulkan DLL loaded"); + } + 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_entry_functions.inc" +#undef FN + return api; + } +}; + +void RegisterVulkanLoaderApi(ApiRegistry* registry) +{ + os_api = registry->Get(); + log_api = registry->Get(); + + auto* allocator_api = registry->Get(); + auto* allocator = allocator_api->CreateChild(allocator_api->system, "Vulkan"); + + auto* impl = allocator->New(allocator); + registry->Set(impl); + + log_api->LogInfo("Vulkan loader API registered"); +} + +} // namespace deimos + -- cgit