63 lines
1.3 KiB
C++
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
|