| /* | |
| * Copyright 2025 Rive | |
| */ | |
| #ifdef _WIN32 | |
| #include <Windows.h> | |
| #endif | |
| #include <assert.h> | |
| #include <memory> | |
| #include <vulkan/vulkan.h> | |
| // Helper macro to use a given object with a load_instance_func function to load | |
| // a vulkan function with the given name (to avoid redundancy and reduce the | |
| // chance of typos in the string) | |
| #define LOAD_INSTANCE_FUNC(name, obj) (obj).loadInstanceFunc<PFN_##name>(#name) | |
| // Helper macro to define and load a given instance func (eliminating the name | |
| // needing to be typed 3 times and reduce the chance of typos in the string) | |
| #define DEFINE_AND_LOAD_INSTANCE_FUNC(name, obj) \ | |
| auto name = LOAD_INSTANCE_FUNC(name, obj) | |
| // Helper macro to load a given instance func into an existing member | |
| // (eliminating the name needing to be typed 3 times and reduce the chance of | |
| // typos in the string) | |
| #define LOAD_MEMBER_INSTANCE_FUNC(pInstance, name, obj) \ | |
| pInstance->m_##name = LOAD_INSTANCE_FUNC(name, obj) | |
| namespace rive_vkb | |
| { | |
| class VulkanLibrary | |
| { | |
| public: | |
| ~VulkanLibrary(); | |
| // Create a VulkanLibrary object. Returns nullptr logs on failure. | |
| static std::unique_ptr<VulkanLibrary> Create(); | |
| PFN_vkVoidFunction getInstanceProcAddr(VkInstance instance, | |
| const char* name) const; | |
| // Load an instance func that doesn't require a specified instance | |
| template <typename T> T loadInstanceFunc(const char* name) const | |
| { | |
| return reinterpret_cast<T>(getInstanceProcAddr(VK_NULL_HANDLE, name)); | |
| } | |
| bool canEnumerateInstanceVersion() const; | |
| VkResult enumerateInstanceVersion(uint32_t* outVersion) const; | |
| VkResult createInstance(const VkInstanceCreateInfo* pCreateInfo, | |
| const VkAllocationCallbacks* pAllocator, | |
| VkInstance* pInstance) const; | |
| VkResult enumerateInstanceLayerProperties( | |
| uint32_t* pPropertyCount, | |
| VkLayerProperties* pProperties) const; | |
| VkResult enumerateInstanceExtensionProperties( | |
| const char* pLayerName, | |
| uint32_t* pPropertyCount, | |
| VkExtensionProperties* pProperties) const; | |
| PFN_vkGetInstanceProcAddr getVkGetInstanceProcAddrPtr() const | |
| { | |
| return m_vkGetInstanceProcAddr; | |
| } | |
| private: | |
| VulkanLibrary(bool* successOut); | |
| #ifdef _WIN32 | |
| HMODULE m_library = nullptr; | |
| #else | |
| void* m_library = nullptr; | |
| #endif | |
| PFN_vkGetInstanceProcAddr m_vkGetInstanceProcAddr = nullptr; | |
| PFN_vkEnumerateInstanceVersion m_vkEnumerateInstanceVersion = nullptr; | |
| PFN_vkCreateInstance m_vkCreateInstance = nullptr; | |
| PFN_vkEnumerateInstanceLayerProperties | |
| m_vkEnumerateInstanceLayerProperties = nullptr; | |
| PFN_vkEnumerateInstanceExtensionProperties | |
| m_vkEnumerateInstanceExtensionProperties = nullptr; | |
| }; | |
| } // namespace rive_vkb |