#pragma once #include "VulkanContext.hpp" #include #include #include class Swapchain { public: Swapchain( VkDevice device, VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, VkRenderPass renderPass, VkPresentModeKHR preferredPresentMode, uint32_t windowWidth, uint32_t windowHeight); ~Swapchain(); Swapchain(const Swapchain&) = delete; Swapchain& operator=(const Swapchain&) = delete; void recreate( VkRenderPass renderPass, uint32_t windowWidth, uint32_t windowHeight); VkSwapchainKHR handle() const { return m_swapchain; } VkExtent2D extent() const { return m_extent; } VkFormat imageFormat() const { return m_surfaceFormat.format; } uint32_t imageCount() const { return m_imageCount; } const std::vector& imageViews() const { return m_imageViews; } const std::vector& framebuffers() const { return m_framebuffers; } void release(); private: void createSwapchain( uint32_t windowWidth, uint32_t windowHeight); void createImageViews(); void createFramebuffers( VkRenderPass renderPass); void destroy(); VkDevice m_device; VkPhysicalDevice m_physicalDevice; VkSurfaceKHR m_surface; VkSwapchainKHR m_swapchain = VK_NULL_HANDLE; VkPresentModeKHR m_preferredPresentMode = VK_PRESENT_MODE_FIFO_KHR; VkExtent2D m_extent{}; VkSurfaceFormatKHR m_surfaceFormat{}; VkPresentModeKHR m_presentMode = VK_PRESENT_MODE_FIFO_KHR; uint32_t m_imageCount = 0; std::vector m_swapchainImages; std::vector m_imageViews; std::vector m_framebuffers; };