#pragma once #include #include #include "GLFW/glfw3.h" namespace VkObjects { class Device; class PhysicalDevice; class Surface; class Swapchain final { struct SwapchainSupportDetails { std::vector formats; std::vector present_modes; VkSurfaceCapabilitiesKHR capabilities; }; const Device& device_; VkSwapchainKHR swapchain_ = nullptr; std::vector swapchain_images_; std::vector swapchain_image_views_; VkFormat swapchain_image_format_; VkExtent2D swapchain_extent_; static SwapchainSupportDetails query_swapchain_details(const Surface& surface, const PhysicalDevice& physical_device); static VkSurfaceFormatKHR choose_surface_format(const std::vector& surface_formats); static VkPresentModeKHR choose_present_mode(const std::vector& present_modes, VkPresentModeKHR desired_present_mode); void create_swapchain(const Surface& surface, const PhysicalDevice& physical_device, GLFWwindow* window); void create_image_views(); public: Swapchain(const Surface& surface, const PhysicalDevice& physical_device, const Device& device, GLFWwindow* window); ~Swapchain(); inline VkSwapchainKHR get_native() const { return swapchain_; } inline const std::vector& get_images() const { return swapchain_images_; } inline const std::vector& get_image_views() const { return swapchain_image_views_; } inline VkExtent2D get_extent() const { return swapchain_extent_; } inline VkFormat get_image_format() const { return swapchain_image_format_; } }; }