#pragma once #include #include #include #include #include "copium/buffer/CommandBuffer.h" #include "copium/sampler/DepthAttachment.h" #include "copium/util/Common.h" namespace Copium { struct SwapChainSupportDetails { VkSurfaceCapabilitiesKHR capabilities; std::vector formats; std::vector presentModes; SwapChainSupportDetails(VkSurfaceKHR surface, VkPhysicalDevice physicalDevice); bool Valid(); }; class SwapChain final { CP_DELETE_COPY_AND_MOVE_CTOR(SwapChain); public: static const int MAX_FRAMES_IN_FLIGHT; private: VkSwapchainKHR handle; VkRenderPass renderPass; VkFormat imageFormat; VkExtent2D extent; std::unique_ptr depthAttachment; std::vector imageViews; std::vector images; std::vector framebuffers; uint32_t imageIndex; bool resizeFramebuffer; int flightIndex; std::vector imageAvailableSemaphores; std::vector renderFinishedSemaphores; std::vector inFlightFences; public: SwapChain(); ~SwapChain(); void BeginFrameBuffer(const CommandBuffer& commandBuffer) const; void EndFrameBuffer(const CommandBuffer& commandBuffer) const; VkSwapchainKHR GetHandle() const; VkRenderPass GetRenderPass() const; VkExtent2D GetExtent() const; VkFramebuffer GetFramebuffer() const; bool BeginPresent(); void SubmitToGraphicsQueue(const CommandBuffer& commandBuffer); void EndPresent(); void ResizeFramebuffer(); void Recreate(); int GetFlightIndex() const; int GetImageCount() const; private: void Initialize(); void InitializeImageViews(); void InitializeDepthAttachment(); void InitializeRenderPass(); void InitializeFramebuffers(); void InitializeSyncObjects(); void Destroy(); VkSurfaceFormatKHR SelectSwapSurfaceFormat(const std::vector& availableFormats); VkPresentModeKHR SelectSwapPresentMode(const std::vector& availablePresentModes); VkExtent2D SelectSwapExtent(GLFWwindow* window, const VkSurfaceCapabilitiesKHR& capabilities); }; }