#pragma once #include "xe_device.hpp" #include #include #include #include #include namespace xe { class XeSwapChain { public: static constexpr int MAX_FRAMES_IN_FLIGHT = 3; XeSwapChain(XeDevice &deviceRef, VkExtent2D windowExtent); XeSwapChain(XeDevice &deviceRef, VkExtent2D windowExtent, std::shared_ptr previous); ~XeSwapChain(); XeSwapChain(const XeSwapChain &) = delete; XeSwapChain operator=(const XeSwapChain &) = delete; VkFramebuffer getFrameBuffer(int index) { return swapChainFramebuffers[index]; } VkRenderPass getRenderPass() { return renderPass; } VkImageView getImageView(int index) { return swapChainImageViews[index]; } size_t imageCount() { return swapChainImages.size(); } VkFormat getSwapChainImageFormat() { return swapChainImageFormat; } VkExtent2D getSwapChainExtent() { return swapChainExtent; } uint32_t width() { return swapChainExtent.width; } uint32_t height() { return swapChainExtent.height; } float extentAspectRatio() { return static_cast(swapChainExtent.width) / static_cast(swapChainExtent.height); } VkFormat findDepthFormat(); VkResult acquireNextImage(uint32_t *imageIndex); VkResult submitCommandBuffers(const VkCommandBuffer *buffers, uint32_t *imageIndex); bool compareSwapFormats(const XeSwapChain& swapChain) const { return swapChain.swapChainDepthFormat == swapChainDepthFormat && swapChain.swapChainImageFormat == swapChainImageFormat; } private: void init(); void createSwapChain(); void createImageViews(); void createDepthResources(); void createRenderPass(); void createFramebuffers(); void createSyncObjects(); VkSurfaceFormatKHR chooseSwapSurfaceFormat( const std::vector &availableFormats); VkPresentModeKHR chooseSwapPresentMode( const std::vector &availablePresentModes); VkExtent2D chooseSwapExtent(const VkSurfaceCapabilitiesKHR &capabilities); VkFormat swapChainImageFormat; VkFormat swapChainDepthFormat; VkExtent2D swapChainExtent; std::vector swapChainFramebuffers; VkRenderPass renderPass; std::vector depthImages; std::vector depthImageMemorys; std::vector depthImageViews; std::vector swapChainImages; std::vector swapChainImageViews; XeDevice &device; VkExtent2D windowExtent; VkSwapchainKHR swapChain; std::shared_ptr oldSwapChain; std::vector imageAvailableSemaphores; std::vector renderFinishedSemaphores; std::vector inFlightFences; std::vector imagesInFlight; size_t currentFrame = 0; }; }