VulkanRenderer: Handle window resize

This commit is contained in:
Jérôme Leclercq
2020-08-27 16:16:33 +02:00
parent 982d28cace
commit cbdac32f5f
22 changed files with 420 additions and 137 deletions

View File

@@ -20,15 +20,17 @@
namespace Nz
{
class RenderWindow;
class NAZARA_OPENGLRENDERER_API OpenGLRenderWindow : public RenderWindowImpl
{
public:
OpenGLRenderWindow();
OpenGLRenderWindow(RenderWindow& owner);
~OpenGLRenderWindow() = default;
OpenGLRenderImage& Acquire() override;
RenderFrame Acquire() override;
bool Create(RendererImpl* renderer, RenderSurface* surface, const Vector2ui& size, const RenderWindowParameters& parameters) override;
bool Create(RendererImpl* renderer, RenderSurface* surface, const RenderWindowParameters& parameters) override;
std::unique_ptr<CommandPool> CreateCommandPool(QueueType queueType) override;
inline GL::Context& GetContext();
@@ -46,6 +48,7 @@ namespace Nz
std::unique_ptr<GL::Context> m_context;
OpenGLRenderPass m_renderPass;
OpenGLWindowFramebuffer m_framebuffer;
RenderWindow& m_owner;
};
}

View File

@@ -24,7 +24,7 @@ namespace Nz
~OpenGLRenderer();
std::unique_ptr<RenderSurface> CreateRenderSurfaceImpl() override;
std::unique_ptr<RenderWindowImpl> CreateRenderWindowImpl() override;
std::unique_ptr<RenderWindowImpl> CreateRenderWindowImpl(RenderWindow& owner) override;
std::shared_ptr<RenderDevice> InstanciateRenderDevice(std::size_t deviceIndex) override;

View File

@@ -0,0 +1,54 @@
// Copyright (C) 2020 Jérôme Leclercq
// This file is part of the "Nazara Engine - Renderer module"
// For conditions of distribution and use, see copyright notice in Config.hpp
#pragma once
#ifndef NAZARA_RENDERFRAME_HPP
#define NAZARA_RENDERFRAME_HPP
#include <Nazara/Prerequisites.hpp>
#include <Nazara/Renderer/Config.hpp>
#include <Nazara/Renderer/Enums.hpp>
#include <functional>
namespace Nz
{
class CommandBuffer;
class CommandBufferBuilder;
class RenderImage;
class UploadPool;
class NAZARA_RENDERER_API RenderFrame
{
public:
inline explicit RenderFrame();
inline explicit RenderFrame(RenderImage* renderImage, bool framebufferInvalidation);
RenderFrame(const RenderFrame&) = delete;
RenderFrame(RenderFrame&&) = delete;
~RenderFrame() = default;
void Execute(const std::function<void(CommandBufferBuilder& builder)>& callback, QueueTypeFlags queueTypeFlags);
UploadPool& GetUploadPool();
inline bool IsFramebufferInvalidated() const;
void SubmitCommandBuffer(CommandBuffer* commandBuffer, QueueTypeFlags queueTypeFlags) ;
void Present();
inline explicit operator bool();
RenderFrame& operator=(const RenderFrame&) = delete;
RenderFrame& operator=(RenderFrame&&) = delete;
private:
RenderImage* m_image;
bool m_framebufferInvalidation;
};
}
#include <Nazara/Renderer/RenderFrame.inl>
#endif

View File

@@ -0,0 +1,32 @@
// Copyright (C) 2020 Jérôme Leclercq
// This file is part of the "Nazara Engine - Renderer module"
// For conditions of distribution and use, see copyright notice in Config.hpp
#include <Nazara/Renderer/RenderFrame.hpp>
#include <Nazara/Renderer/Debug.hpp>
namespace Nz
{
inline RenderFrame::RenderFrame() :
RenderFrame(nullptr, false)
{
}
inline RenderFrame::RenderFrame(RenderImage* renderImage, bool framebufferInvalidation) :
m_image(renderImage),
m_framebufferInvalidation(framebufferInvalidation)
{
}
inline bool RenderFrame::IsFramebufferInvalidated() const
{
return m_framebufferInvalidation;
}
inline RenderFrame::operator bool()
{
return m_image != nullptr;
}
}
#include <Nazara/Renderer/DebugOff.hpp>

View File

@@ -21,7 +21,6 @@ namespace Nz
class NAZARA_RENDERER_API RenderImage
{
public:
RenderImage() = default;
virtual ~RenderImage();
virtual void Execute(const std::function<void(CommandBufferBuilder& builder)>& callback, QueueTypeFlags queueTypeFlags) = 0;
@@ -33,6 +32,7 @@ namespace Nz
virtual void Present() = 0;
protected:
RenderImage() = default;
RenderImage(const RenderImage&) = delete;
RenderImage(RenderImage&&) = default;
};

View File

@@ -36,8 +36,9 @@ namespace Nz
void EnableVerticalSync(bool enabled);
inline RenderWindowImpl *GetImpl();
inline RenderWindowImpl* GetImpl();
std::shared_ptr<RenderDevice> GetRenderDevice();
inline RenderSurface* GetSurface();
inline bool IsValid() const;

View File

@@ -46,11 +46,16 @@ namespace Nz
return Window::Create(handle);
}
inline RenderWindowImpl* Nz::RenderWindow::GetImpl()
inline RenderWindowImpl* RenderWindow::GetImpl()
{
return m_impl.get();
}
inline RenderSurface* RenderWindow::GetSurface()
{
return m_surface.get();
}
inline bool RenderWindow::IsValid() const
{
return m_impl != nullptr;

View File

@@ -12,6 +12,7 @@
#include <Nazara/Platform/WindowHandle.hpp>
#include <Nazara/Renderer/Config.hpp>
#include <Nazara/Renderer/RenderDevice.hpp>
#include <Nazara/Renderer/RenderFrame.hpp>
#include <Nazara/Renderer/RenderWindowParameters.hpp>
namespace Nz
@@ -19,7 +20,6 @@ namespace Nz
class CommandPool;
class Framebuffer;
class RendererImpl;
class RenderImage;
class RenderPass;
class RenderSurface;
@@ -29,9 +29,9 @@ namespace Nz
RenderWindowImpl() = default;
virtual ~RenderWindowImpl();
virtual RenderImage& Acquire() = 0;
virtual RenderFrame Acquire() = 0;
virtual bool Create(RendererImpl* renderer, RenderSurface* surface, const Vector2ui& size, const RenderWindowParameters& parameters) = 0;
virtual bool Create(RendererImpl* renderer, RenderSurface* surface, const RenderWindowParameters& parameters) = 0;
virtual std::unique_ptr<CommandPool> CreateCommandPool(QueueType queueType) = 0;
virtual const Framebuffer& GetFramebuffer() const = 0;

View File

@@ -23,6 +23,7 @@ namespace Nz
class RendererImpl;
class RenderDevice;
class RenderSurface;
class RenderWindow;
class RenderWindowImpl;
using CreateRendererImplFunc = RendererImpl*(*)();
@@ -34,7 +35,7 @@ namespace Nz
virtual ~RendererImpl();
virtual std::unique_ptr<RenderSurface> CreateRenderSurfaceImpl() = 0;
virtual std::unique_ptr<RenderWindowImpl> CreateRenderWindowImpl() = 0;
virtual std::unique_ptr<RenderWindowImpl> CreateRenderWindowImpl(RenderWindow& owner) = 0;
virtual std::shared_ptr<RenderDevice> InstanciateRenderDevice(std::size_t deviceIndex) = 0;

View File

@@ -37,24 +37,25 @@ namespace Nz
class NAZARA_VULKANRENDERER_API VkRenderWindow : public VkRenderTarget, public RenderWindowImpl
{
public:
VkRenderWindow();
VkRenderWindow(RenderWindow& owner);
VkRenderWindow(const VkRenderWindow&) = delete;
VkRenderWindow(VkRenderWindow&&) = delete; ///TODO
~VkRenderWindow();
VulkanRenderImage& Acquire() override;
RenderFrame Acquire() override;
bool Create(RendererImpl* renderer, RenderSurface* surface, const RenderWindowParameters& parameters) override;
bool Create(RendererImpl* renderer, RenderSurface* surface, const Vector2ui& size, const RenderWindowParameters& parameters) override;
std::unique_ptr<CommandPool> CreateCommandPool(QueueType queueType) override;
inline const VulkanMultipleFramebuffer& GetFramebuffer() const override;
inline VulkanDevice& GetDevice();
inline const VulkanDevice& GetDevice() const;
inline Vk::QueueHandle& GetGraphicsQueue();
const VulkanRenderPass& GetRenderPass() const override;
inline const VulkanRenderPass& GetRenderPass() const override;
inline const Vk::Swapchain& GetSwapchain() const;
std::shared_ptr<RenderDevice> GetRenderDevice() override;
inline std::shared_ptr<RenderDevice> GetRenderDevice() override;
void Present(UInt32 imageIndex, VkSemaphore waitSemaphore = VK_NULL_HANDLE);
@@ -62,17 +63,16 @@ namespace Nz
VkRenderWindow& operator=(VkRenderWindow&&) = delete; ///TODO
private:
bool CreateSwapchain(Vk::Surface& surface, const Vector2ui& size);
bool SetupDepthBuffer(const Vector2ui& size);
bool SetupFrameBuffers(const Vector2ui& size);
bool SetupRenderPass();
bool SetupSwapchain(const Vk::PhysicalDevice& deviceInfo, Vk::Surface& surface, const Vector2ui& size);
std::size_t m_currentFrame;
Clock m_clock;
VkFormat m_depthStencilFormat;
VkSurfaceFormatKHR m_surfaceFormat;
std::optional<VulkanMultipleFramebuffer> m_framebuffer;
std::optional<VulkanRenderPass> m_renderPass;
std::shared_ptr<VulkanDevice> m_device;
std::size_t m_currentFrame;
std::vector<Vk::Fence*> m_inflightFences;
std::vector<VulkanRenderImage> m_concurrentImageData;
Vk::DeviceMemory m_depthBufferMemory;
@@ -82,6 +82,12 @@ namespace Nz
Vk::QueueHandle m_presentQueue;
Vk::QueueHandle m_transferQueue;
Vk::Swapchain m_swapchain;
Clock m_clock;
RenderWindow& m_owner;
Vector2ui m_swapchainSize;
VkFormat m_depthStencilFormat;
VkSurfaceFormatKHR m_surfaceFormat;
bool m_shouldRecreateSwapchain;
};
}

View File

@@ -27,24 +27,20 @@ namespace Nz
return m_graphicsQueue;
}
inline const VulkanRenderPass& VkRenderWindow::GetRenderPass() const
{
return *m_renderPass;
}
inline const Vk::Swapchain& VkRenderWindow::GetSwapchain() const
{
return m_swapchain;
}
inline std::shared_ptr<RenderDevice> Nz::VkRenderWindow::GetRenderDevice()
inline std::shared_ptr<RenderDevice> VkRenderWindow::GetRenderDevice()
{
return m_device;
}
inline void VkRenderWindow::Present(UInt32 imageIndex, VkSemaphore waitSemaphore)
{
NazaraAssert(imageIndex < m_inflightFences.size(), "Invalid image index");
m_presentQueue.Present(m_swapchain, imageIndex, waitSemaphore);
m_currentFrame = (m_currentFrame + 1) % m_inflightFences.size();
}
}
#include <Nazara/VulkanRenderer/DebugOff.hpp>

View File

@@ -26,7 +26,7 @@ namespace Nz
~VulkanRenderer();
std::unique_ptr<RenderSurface> CreateRenderSurfaceImpl() override;
std::unique_ptr<RenderWindowImpl> CreateRenderWindowImpl() override;
std::unique_ptr<RenderWindowImpl> CreateRenderWindowImpl(RenderWindow& owner) override;
std::shared_ptr<RenderDevice> InstanciateRenderDevice(std::size_t deviceIndex) override;

View File

@@ -38,7 +38,7 @@ namespace Nz
inline bool IsSupported() const;
Swapchain& operator=(const Swapchain&) = delete;
Swapchain& operator=(Swapchain&&) = delete;
Swapchain& operator=(Swapchain&&) = default;
struct Buffer
{