84 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			84 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #pragma once
 | |
| 
 | |
| #include <renderer/backend/vk/vulkan.hpp>
 | |
| #include <renderer/frontend/context/instance.hpp>
 | |
| 
 | |
| namespace lt::renderer::vk {
 | |
| 
 | |
| /**
 | |
|  * Responsible for dynamically loading Vulkan library/functions.
 | |
|  *
 | |
|  * @note: The delayed vkInstance destruction is due to a work-around for a libx11 quirk:
 | |
|  * @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 IInstance
 | |
| {
 | |
| public:
 | |
| 	static auto get() -> IInstance *
 | |
| 	{
 | |
| 		return &Instance::instance();
 | |
| 	}
 | |
| 
 | |
| 	static auto load_device_functions(VkDevice device)
 | |
| 	{
 | |
| 		static_cast<Instance &>(instance()).load_device_functions_impl(device);
 | |
| 	}
 | |
| 
 | |
| 	~Instance() override;
 | |
| 
 | |
| 	Instance(Instance &&) = delete;
 | |
| 
 | |
| 	Instance(const Instance &) = delete;
 | |
| 
 | |
| 	auto operator=(const Instance &) -> Instance & = delete;
 | |
| 
 | |
| 	auto operator=(Instance &&) -> Instance & = delete;
 | |
| 
 | |
| 	[[nodiscard]] auto vk() const -> VkInstance
 | |
| 	{
 | |
| 		return m_instance;
 | |
| 	}
 | |
| 
 | |
| 	/* create functions */
 | |
| 	[[nodiscard]] auto create_xlib_surface(VkXlibSurfaceCreateInfoKHR info) const -> VkSurfaceKHR;
 | |
| 
 | |
| 	[[nodiscard]] auto create_messenger(VkDebugUtilsMessengerCreateInfoEXT info) const
 | |
| 	    -> VkDebugUtilsMessengerEXT;
 | |
| 
 | |
| 	/* destroy functions */
 | |
| 	void destroy_surface(VkSurfaceKHR surface) const;
 | |
| 
 | |
| 	void destroy_messenger(VkDebugUtilsMessengerEXT messenger) const;
 | |
| 
 | |
| 	[[nodiscard]] auto enumerate_gpus() const -> std::vector<VkPhysicalDevice>;
 | |
| 
 | |
| private:
 | |
| 	static auto instance() -> IInstance &
 | |
| 	{
 | |
| 		static auto instance = Instance {};
 | |
| 		return 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;
 | |
| 
 | |
| 	VkAllocationCallbacks *m_allocator = nullptr;
 | |
| };
 | |
| 
 | |
| } // namespace lt::renderer::vk
 |