blob: 8da343e8391322b432dcbe3d22d64b4844e1a759 [file] [log] [blame]
/*
* 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