// Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com) // This file is part of the "Nazara Engine - Vulkan renderer" // For conditions of distribution and use, see copyright notice in Config.hpp #pragma once #ifndef NAZARA_VULKANRENDERER_VULKANSWAPCHAIN_HPP #define NAZARA_VULKANRENDERER_VULKANSWAPCHAIN_HPP #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace Nz { class NAZARA_VULKANRENDERER_API VulkanSwapchain : public Swapchain { public: VulkanSwapchain(VulkanDevice& device, WindowHandle windowHandle, const Vector2ui& windowSize, const SwapchainParameters& parameters); VulkanSwapchain(const VulkanSwapchain&) = delete; VulkanSwapchain(VulkanSwapchain&&) = delete; ~VulkanSwapchain(); RenderFrame AcquireFrame() override; std::shared_ptr CreateCommandPool(QueueType queueType) override; const VulkanWindowFramebuffer& GetFramebuffer(std::size_t i) const override; std::size_t GetFramebufferCount() const override; inline VulkanDevice& GetDevice(); inline const VulkanDevice& GetDevice() const; inline Vk::QueueHandle& GetGraphicsQueue(); const VulkanRenderPass& GetRenderPass() const override; const Vector2ui& GetSize() const override; inline const Vk::Swapchain& GetSwapchain() const; void NotifyResize(const Vector2ui& newSize) override; void Present(UInt32 imageIndex, VkSemaphore waitSemaphore = VK_NULL_HANDLE); VulkanSwapchain& operator=(const VulkanSwapchain&) = delete; VulkanSwapchain& operator=(VulkanSwapchain&&) = delete; private: bool CreateSwapchain(); bool SetupDepthBuffer(); bool SetupFrameBuffers(); bool SetupRenderPass(); bool SetupSurface(WindowHandle windowHandle); bool SetupSwapchain(const Vk::PhysicalDevice& deviceInfo); std::optional m_renderPass; std::size_t m_currentFrame; std::vector m_framebuffers; std::vector m_inflightFences; std::vector> m_concurrentImageData; Vk::DeviceMemory m_depthBufferMemory; Vk::Image m_depthBuffer; Vk::ImageView m_depthBufferView; Vk::QueueHandle m_graphicsQueue; Vk::QueueHandle m_presentQueue; Vk::QueueHandle m_transferQueue; Vk::Surface m_surface; Vk::Swapchain m_swapchain; Vector2ui m_swapchainSize; VkFormat m_depthStencilFormat; VkSurfaceFormatKHR m_surfaceFormat; VulkanDevice& m_device; bool m_shouldRecreateSwapchain; }; } #include #endif // NAZARA_VULKANRENDERER_VULKANSWAPCHAIN_HPP