#pragma once #include #include #include #include #include #include struct SwapChainMeta { VkSurfaceCapabilitiesKHR capabilities; std::vector formats; std::vector modes; }; struct QueueFamilies { int graphics = -1; int presentation = -1; bool present() { return graphics >= 0 && presentation >= 0; } }; class VulkanDevice { public: VulkanDevice(); ~VulkanDevice(); /** Physical Devices **/ VkPhysicalDevice physical; SwapChainMeta swapChain; QueueFamilies queueData; std::vector deviceExtensions = { VK_KHR_SWAPCHAIN_EXTENSION_NAME }; void choosePhysicalDevice(VkInstance* vulkan, VkSurfaceKHR surface); bool isSuitable(VkPhysicalDevice device, VkSurfaceKHR surface); bool isSupported(VkPhysicalDevice device); SwapChainMeta checkSwapchain(VkPhysicalDevice device, VkSurfaceKHR surface); QueueFamilies checkQueues(VkPhysicalDevice device, VkSurfaceKHR surface); QueueFamilies getQueues() { return queueData; } /** Logical Devices **/ VkDevice logical; VkQueue graphicsQueue; VkQueue presentationQueue; void createLogicalDevice(VkSurfaceKHR surface, bool validationRequired, ValidationAndExtension* validators); void destroy(); };