#pragma once #include "vulkan/basalt_device.h" namespace basalt { class Swapchain { public: Swapchain(const Swapchain& src) = delete; Swapchain& operator =(const Swapchain& src) = delete; Swapchain(Swapchain&& src) = delete; Swapchain& operator =(Swapchain&& src) = delete; Swapchain(basalt::Device& device, basalt::Window& window, const std::initializer_list& allowed_formats, const std::initializer_list allowed_present_modes); ~Swapchain(); void recreate(VkRenderPass new_renderpass=VK_NULL_HANDLE); void create_framebuffers(VkRenderPass render_pass); u32 wait_acquire_reset(bool wait_all=VK_TRUE, u64 timeout=UINT64_MAX, VkFence fence=VK_NULL_HANDLE); basalt::SwapchainSupportDetails details; basalt::darray semaphores_image_available; basalt::darray semaphores_render_finished; basalt::darray fences_in_flight; basalt::darray allowed_formats; basalt::darray allowed_present_modes; basalt::darray swapchain_images; basalt::darray swapchain_image_views; basalt::darray framebuffers; basalt::Device* device = nullptr; basalt::Window* window = nullptr; VkSwapchainKHR swapchain = VK_NULL_HANDLE; VkExtent2D swapchain_extent; VkExtent2D prev_extent; u32 image_count = -1; u32 max_frames_in_flight = 2; u32 current_frame = 0; bool framebuffers_created = false; private: void create (const basalt::darray& allowed_formats, const basalt::darray& allowed_present_modes, VkSwapchainKHR prev_swapchain=VK_NULL_HANDLE); }; }