#pragma once #include #include #include #include #include #include struct SDL_Window; struct QueueFamilyIndices { std::optional graphicsFamily; std::optional presentFamily; bool isComplete() const { return graphicsFamily.has_value() && presentFamily.has_value(); } }; struct SwapchainSupportDetails { VkSurfaceCapabilitiesKHR capabilities; std::vector formats; std::vector presentModes; }; QueueFamilyIndices findQueueFamilies( VkPhysicalDevice device, VkSurfaceKHR surface); SwapchainSupportDetails querySwapchainSupport( VkPhysicalDevice device, VkSurfaceKHR surface); class VulkanContext { public: VulkanContext( SDL_Window* window, const char* appName, uint32_t versionMajor, uint32_t versionMinor, uint32_t versionPatch); ~VulkanContext(); VulkanContext(const VulkanContext&) = delete; VulkanContext& operator=(const VulkanContext&) = delete; VkDevice device() const { return m_device; } VkPhysicalDevice physicalDevice() const { return m_physicalDevice; } VkInstance instance() const { return m_instance; } VkSurfaceKHR surface() const { return m_surface; } VkQueue graphicsQueue() const { return m_graphicsQueue; } VkQueue presentQueue() const { return m_presentQueue; } VkCommandPool commandPool() const { return m_commandPool; } const QueueFamilyIndices& queueIndices() const { return m_queueIndices; } void release(); private: VkInstance m_instance = VK_NULL_HANDLE; VkSurfaceKHR m_surface = VK_NULL_HANDLE; VkPhysicalDevice m_physicalDevice = VK_NULL_HANDLE; VkDevice m_device = VK_NULL_HANDLE; VkQueue m_graphicsQueue = VK_NULL_HANDLE; VkQueue m_presentQueue = VK_NULL_HANDLE; VkCommandPool m_commandPool = VK_NULL_HANDLE; QueueFamilyIndices m_queueIndices; };