blob: 50e6d28415515ef2a54f32ee3b898fb4f0dd9165 [file] [log] [blame]
/*
* Copyright 2025 Rive
*/
#ifdef _WIN32 // !!! in the VulkanInstance cpp
#include <Windows.h>
#endif
#include <assert.h>
#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(name, obj) \
m_##name = LOAD_INSTANCE_FUNC(name, obj)
// Same as LOAD_MEMBER_INSTANCE_FUNC but asserts non-null
#define LOAD_REQUIRED_MEMBER_INSTANCE_FUNC(name, obj) \
LOAD_MEMBER_INSTANCE_FUNC(name, obj); \
assert(m_##name != nullptr && "Could not load " #name)
namespace rive_vkb
{
class VulkanLibrary
{
public:
VulkanLibrary();
~VulkanLibrary();
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:
#ifdef _WIN32
HMODULE m_library;
#else
void* m_library;
#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