47 lines
1.8 KiB
C++
47 lines
1.8 KiB
C++
#pragma once
|
|
|
|
#include <vector>
|
|
#include <vulkan/vulkan.h>
|
|
|
|
#include "GLFW/glfw3.h"
|
|
|
|
namespace VkObjects
|
|
{
|
|
class Device;
|
|
class PhysicalDevice;
|
|
class Surface;
|
|
|
|
class Swapchain final
|
|
{
|
|
struct SwapchainSupportDetails
|
|
{
|
|
std::vector<VkSurfaceFormatKHR> formats;
|
|
std::vector<VkPresentModeKHR> present_modes;
|
|
VkSurfaceCapabilitiesKHR capabilities;
|
|
};
|
|
|
|
const Device& device_;
|
|
VkSwapchainKHR swapchain_ = nullptr;
|
|
std::vector<VkImage> swapchain_images_;
|
|
std::vector<VkImageView> 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<VkSurfaceFormatKHR>& surface_formats);
|
|
static VkPresentModeKHR choose_present_mode(const std::vector<VkPresentModeKHR>& 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<VkImage>& get_images() const { return swapchain_images_; }
|
|
inline const std::vector<VkImageView>& 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_; }
|
|
};
|
|
}
|