light/modules/renderer/private/vk/context/instance.hpp

63 lines
1.3 KiB
C++

#pragma once
#include <renderer/vk/vulkan.hpp>
namespace lt::renderer::vk {
/**
* Responsible for dynamically loading Vulkan library/functions.
*
* @note: The delayed vkInstance destruction is due to a work-around for libx11:
* @ref:
* https://github.com/KhronosGroup/Vulkan-LoaderAndValidationLayers/commit/0017308648b6bf8eef10ef0ffb9470576c0c2e9e
* https://www.xfree86.org/4.7.0/DRI11.html
* https://github.com/KhronosGroup/Vulkan-LoaderAndValidationLayers/issues/1894
*/
class Instance
{
public:
static auto get() -> VkInstance
{
return Instance::instance().m_instance;
}
static auto load_device_functions(VkDevice device)
{
instance().load_device_functions_impl(device);
}
Instance(Instance &&) = delete;
Instance(const Instance &) = delete;
auto operator=(const Instance &) -> Instance & = delete;
auto operator=(Instance &&) -> Instance & = delete;
private:
static auto instance() -> Instance &
{
static auto instance = Instance {};
return instance;
}
Instance();
~Instance();
void initialize_instance();
void load_library();
void unload_library();
void load_global_functions();
void load_instance_functions();
void load_device_functions_impl(VkDevice device);
VkInstance m_instance = VK_NULL_HANDLE;
};
} // namespace lt::renderer::vk