From c6611fcb9f6ad7ec2fa4a0d432d03724ae60d945 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Sat, 10 Jul 2021 11:49:35 +0200 Subject: [PATCH] Renderer/RenderTarget: Add size method and signal --- .../OpenGLRenderer/OpenGLRenderWindow.hpp | 1 + include/Nazara/Renderer/RenderTarget.hpp | 5 +++ .../Nazara/VulkanRenderer/VkRenderTarget.hpp | 40 ------------------ .../Nazara/VulkanRenderer/VkRenderTarget.inl | 12 ------ .../VulkanRenderer/VulkanRenderImage.hpp | 6 +-- ...enderWindow.hpp => VulkanRenderWindow.hpp} | 20 ++++----- ...enderWindow.inl => VulkanRenderWindow.inl} | 15 +++---- .../OpenGLRenderer/OpenGLRenderWindow.cpp | 7 ++++ src/Nazara/VulkanRenderer/VkRenderTarget.cpp | 14 ------- .../VulkanRenderer/VulkanRenderImage.cpp | 4 +- ...enderWindow.cpp => VulkanRenderWindow.cpp} | 42 ++++++++++++------- src/Nazara/VulkanRenderer/VulkanRenderer.cpp | 4 +- 12 files changed, 62 insertions(+), 108 deletions(-) delete mode 100644 include/Nazara/VulkanRenderer/VkRenderTarget.hpp delete mode 100644 include/Nazara/VulkanRenderer/VkRenderTarget.inl rename include/Nazara/VulkanRenderer/{VkRenderWindow.hpp => VulkanRenderWindow.hpp} (84%) rename include/Nazara/VulkanRenderer/{VkRenderWindow.inl => VulkanRenderWindow.inl} (51%) delete mode 100644 src/Nazara/VulkanRenderer/VkRenderTarget.cpp rename src/Nazara/VulkanRenderer/{VkRenderWindow.cpp => VulkanRenderWindow.cpp} (93%) diff --git a/include/Nazara/OpenGLRenderer/OpenGLRenderWindow.hpp b/include/Nazara/OpenGLRenderer/OpenGLRenderWindow.hpp index 1c227358c..40fea11d9 100644 --- a/include/Nazara/OpenGLRenderer/OpenGLRenderWindow.hpp +++ b/include/Nazara/OpenGLRenderer/OpenGLRenderWindow.hpp @@ -37,6 +37,7 @@ namespace Nz const OpenGLFramebuffer& GetFramebuffer(std::size_t i) const override; std::size_t GetFramebufferCount() const override; const OpenGLRenderPass& GetRenderPass() const override; + const Vector2ui& GetSize() const override; void Present(); diff --git a/include/Nazara/Renderer/RenderTarget.hpp b/include/Nazara/Renderer/RenderTarget.hpp index 84bc68612..e47167e19 100644 --- a/include/Nazara/Renderer/RenderTarget.hpp +++ b/include/Nazara/Renderer/RenderTarget.hpp @@ -8,6 +8,8 @@ #define NAZARA_RENDERTARGET_HPP #include +#include +#include #include namespace Nz @@ -24,6 +26,9 @@ namespace Nz virtual const Framebuffer& GetFramebuffer(std::size_t i) const = 0; virtual std::size_t GetFramebufferCount() const = 0; virtual const RenderPass& GetRenderPass() const = 0; + virtual const Vector2ui& GetSize() const = 0; + + NazaraSignal(OnRenderTargetSizeChange, const RenderTarget* /*renderTarget*/, const Vector2ui& /*newSize*/); }; } diff --git a/include/Nazara/VulkanRenderer/VkRenderTarget.hpp b/include/Nazara/VulkanRenderer/VkRenderTarget.hpp deleted file mode 100644 index 6f14c8232..000000000 --- a/include/Nazara/VulkanRenderer/VkRenderTarget.hpp +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright (C) 201 Jérôme Leclercq -// 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_RENDERTARGET_HPP -#define NAZARA_VULKANRENDERER_RENDERTARGET_HPP - -#include -#include -#include -#include -#include -#include -#include -#include - -namespace Nz -{ - class NAZARA_VULKANRENDERER_API VkRenderTarget - { - public: - VkRenderTarget() = default; - VkRenderTarget(const VkRenderTarget&) = delete; - VkRenderTarget(VkRenderTarget&&) = delete; ///TOOD? - virtual ~VkRenderTarget(); - - VkRenderTarget& operator=(const VkRenderTarget&) = delete; - VkRenderTarget& operator=(VkRenderTarget&&) = delete; ///TOOD? - - // Signals: - NazaraSignal(OnRenderTargetRelease, const VkRenderTarget* /*renderTarget*/); - NazaraSignal(OnRenderTargetSizeChange, const VkRenderTarget* /*renderTarget*/); - }; -} - -#include - -#endif // NAZARA_VULKANRENDERER_RENDERTARGET_HPP diff --git a/include/Nazara/VulkanRenderer/VkRenderTarget.inl b/include/Nazara/VulkanRenderer/VkRenderTarget.inl deleted file mode 100644 index 12b0b1efd..000000000 --- a/include/Nazara/VulkanRenderer/VkRenderTarget.inl +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (C) 2020 Jérôme Leclercq -// This file is part of the "Nazara Engine - Vulkan Renderer" -// For conditions of distribution and use, see copyright notice in Config.hpp - -#include -#include - -namespace Nz -{ -} - -#include diff --git a/include/Nazara/VulkanRenderer/VulkanRenderImage.hpp b/include/Nazara/VulkanRenderer/VulkanRenderImage.hpp index ecbd3c7c9..df12fe7e9 100644 --- a/include/Nazara/VulkanRenderer/VulkanRenderImage.hpp +++ b/include/Nazara/VulkanRenderer/VulkanRenderImage.hpp @@ -18,12 +18,12 @@ namespace Nz { - class VkRenderWindow; + class VulkanRenderWindow; class NAZARA_VULKANRENDERER_API VulkanRenderImage : public RenderImage { public: - VulkanRenderImage(VkRenderWindow& owner); + VulkanRenderImage(VulkanRenderWindow& owner); VulkanRenderImage(const VulkanRenderImage&) = delete; VulkanRenderImage(VulkanRenderImage&&) noexcept = default; ~VulkanRenderImage(); @@ -50,7 +50,7 @@ namespace Nz std::size_t m_currentCommandBuffer; std::vector m_inFlightCommandBuffers; std::vector m_graphicalCommandsBuffers; - VkRenderWindow& m_owner; + VulkanRenderWindow& m_owner; Vk::CommandPool m_commandPool; Vk::Fence m_inFlightFence; Vk::Semaphore m_imageAvailableSemaphore; diff --git a/include/Nazara/VulkanRenderer/VkRenderWindow.hpp b/include/Nazara/VulkanRenderer/VulkanRenderWindow.hpp similarity index 84% rename from include/Nazara/VulkanRenderer/VkRenderWindow.hpp rename to include/Nazara/VulkanRenderer/VulkanRenderWindow.hpp index afd042404..3b0e4860b 100644 --- a/include/Nazara/VulkanRenderer/VkRenderWindow.hpp +++ b/include/Nazara/VulkanRenderer/VulkanRenderWindow.hpp @@ -19,7 +19,6 @@ #include #include #include -#include #include #include #include @@ -34,13 +33,13 @@ namespace Nz { - class NAZARA_VULKANRENDERER_API VkRenderWindow : public VkRenderTarget, public RenderWindowImpl + class NAZARA_VULKANRENDERER_API VulkanRenderWindow : public RenderWindowImpl { public: - VkRenderWindow(RenderWindow& owner); - VkRenderWindow(const VkRenderWindow&) = delete; - VkRenderWindow(VkRenderWindow&&) = delete; ///TODO - ~VkRenderWindow(); + VulkanRenderWindow(RenderWindow& owner); + VulkanRenderWindow(const VulkanRenderWindow&) = delete; + VulkanRenderWindow(VulkanRenderWindow&&) = delete; ///TODO + ~VulkanRenderWindow(); RenderFrame Acquire() override; @@ -53,13 +52,14 @@ namespace Nz inline VulkanDevice& GetDevice(); inline const VulkanDevice& GetDevice() const; inline Vk::QueueHandle& GetGraphicsQueue(); - inline const VulkanRenderPass& GetRenderPass() const override; + const VulkanRenderPass& GetRenderPass() const override; + const Vector2ui& GetSize() const override; inline const Vk::Swapchain& GetSwapchain() const; void Present(UInt32 imageIndex, VkSemaphore waitSemaphore = VK_NULL_HANDLE); - VkRenderWindow& operator=(const VkRenderWindow&) = delete; - VkRenderWindow& operator=(VkRenderWindow&&) = delete; ///TODO + VulkanRenderWindow& operator=(const VulkanRenderWindow&) = delete; + VulkanRenderWindow& operator=(VulkanRenderWindow&&) = delete; ///TODO private: bool CreateSwapchain(Vk::Surface& surface, const Vector2ui& size); @@ -90,6 +90,6 @@ namespace Nz }; } -#include +#include #endif // NAZARA_VULKANRENDERER_RENDERWINDOW_HPP diff --git a/include/Nazara/VulkanRenderer/VkRenderWindow.inl b/include/Nazara/VulkanRenderer/VulkanRenderWindow.inl similarity index 51% rename from include/Nazara/VulkanRenderer/VkRenderWindow.inl rename to include/Nazara/VulkanRenderer/VulkanRenderWindow.inl index 90388c518..f0413250b 100644 --- a/include/Nazara/VulkanRenderer/VkRenderWindow.inl +++ b/include/Nazara/VulkanRenderer/VulkanRenderWindow.inl @@ -2,32 +2,27 @@ // This file is part of the "Nazara Engine - Vulkan Renderer" // For conditions of distribution and use, see copyright notice in Config.hpp -#include +#include #include namespace Nz { - inline VulkanDevice& VkRenderWindow::GetDevice() + inline VulkanDevice& VulkanRenderWindow::GetDevice() { return *m_device; } - inline const VulkanDevice& VkRenderWindow::GetDevice() const + inline const VulkanDevice& VulkanRenderWindow::GetDevice() const { return *m_device; } - inline Vk::QueueHandle& VkRenderWindow::GetGraphicsQueue() + inline Vk::QueueHandle& VulkanRenderWindow::GetGraphicsQueue() { return m_graphicsQueue; } - inline const VulkanRenderPass& VkRenderWindow::GetRenderPass() const - { - return *m_renderPass; - } - - inline const Vk::Swapchain& VkRenderWindow::GetSwapchain() const + inline const Vk::Swapchain& VulkanRenderWindow::GetSwapchain() const { return m_swapchain; } diff --git a/src/Nazara/OpenGLRenderer/OpenGLRenderWindow.cpp b/src/Nazara/OpenGLRenderer/OpenGLRenderWindow.cpp index eec44c6fd..e9af66a36 100644 --- a/src/Nazara/OpenGLRenderer/OpenGLRenderWindow.cpp +++ b/src/Nazara/OpenGLRenderer/OpenGLRenderWindow.cpp @@ -29,6 +29,8 @@ namespace Nz if (m_size != size) { invalidateFramebuffer = true; + + OnRenderTargetSizeChange(this, size); m_size = size; } @@ -115,6 +117,11 @@ namespace Nz return *m_renderPass; } + const Vector2ui& OpenGLRenderWindow::GetSize() const + { + return m_size; + } + void OpenGLRenderWindow::Present() { m_context->SwapBuffers(); diff --git a/src/Nazara/VulkanRenderer/VkRenderTarget.cpp b/src/Nazara/VulkanRenderer/VkRenderTarget.cpp deleted file mode 100644 index 5875d5e45..000000000 --- a/src/Nazara/VulkanRenderer/VkRenderTarget.cpp +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright (C) 2020 Jérôme Leclercq -// This file is part of the "Nazara Engine - Vulkan Renderer" -// For conditions of distribution and use, see copyright notice in Config.hpp - -#include -#include - -namespace Nz -{ - VkRenderTarget::~VkRenderTarget() - { - OnRenderTargetRelease(this); - } -} diff --git a/src/Nazara/VulkanRenderer/VulkanRenderImage.cpp b/src/Nazara/VulkanRenderer/VulkanRenderImage.cpp index f16a7ab8e..e270c323e 100644 --- a/src/Nazara/VulkanRenderer/VulkanRenderImage.cpp +++ b/src/Nazara/VulkanRenderer/VulkanRenderImage.cpp @@ -3,7 +3,7 @@ // For conditions of distribution and use, see copyright notice in Config.hpp #include -#include +#include #include #include #include @@ -11,7 +11,7 @@ namespace Nz { - VulkanRenderImage::VulkanRenderImage(VkRenderWindow& owner) : + VulkanRenderImage::VulkanRenderImage(VulkanRenderWindow& owner) : m_owner(owner), m_uploadPool(m_owner.GetDevice(), 2 * 1024 * 1024) { diff --git a/src/Nazara/VulkanRenderer/VkRenderWindow.cpp b/src/Nazara/VulkanRenderer/VulkanRenderWindow.cpp similarity index 93% rename from src/Nazara/VulkanRenderer/VkRenderWindow.cpp rename to src/Nazara/VulkanRenderer/VulkanRenderWindow.cpp index 6c3074a6c..89043e624 100644 --- a/src/Nazara/VulkanRenderer/VkRenderWindow.cpp +++ b/src/Nazara/VulkanRenderer/VulkanRenderWindow.cpp @@ -2,7 +2,7 @@ // This file is part of the "Nazara Engine - Renderer module" // For conditions of distribution and use, see copyright notice in Config.hpp -#include +#include #include #include #include @@ -19,14 +19,14 @@ namespace Nz { - VkRenderWindow::VkRenderWindow(RenderWindow& owner) : + VulkanRenderWindow::VulkanRenderWindow(RenderWindow& owner) : m_currentFrame(0), m_owner(owner), m_shouldRecreateSwapchain(false) { } - VkRenderWindow::~VkRenderWindow() + VulkanRenderWindow::~VulkanRenderWindow() { if (m_device) m_device->WaitForIdle(); @@ -37,7 +37,7 @@ namespace Nz m_swapchain.Destroy(); } - RenderFrame VkRenderWindow::Acquire() + RenderFrame VulkanRenderWindow::Acquire() { bool invalidateFramebuffer = false; @@ -50,6 +50,8 @@ namespace Nz { Vk::Surface& vulkanSurface = static_cast(m_owner.GetSurface())->GetSurface(); + OnRenderTargetSizeChange(this, size); + if (!CreateSwapchain(vulkanSurface, size)) throw std::runtime_error("failed to recreate swapchain"); @@ -103,7 +105,7 @@ namespace Nz return RenderFrame(¤tFrame, invalidateFramebuffer, size, imageIndex); } - bool VkRenderWindow::Create(RendererImpl* /*renderer*/, RenderSurface* surface, const RenderWindowParameters& parameters) + bool VulkanRenderWindow::Create(RendererImpl* /*renderer*/, RenderSurface* surface, const RenderWindowParameters& parameters) { std::shared_ptr device = std::static_pointer_cast(m_owner.GetRenderDevice()); @@ -280,7 +282,7 @@ namespace Nz return true; } - std::shared_ptr VkRenderWindow::CreateCommandPool(QueueType queueType) + std::shared_ptr VulkanRenderWindow::CreateCommandPool(QueueType queueType) { UInt32 queueFamilyIndex = [&] { switch (queueType) @@ -301,18 +303,28 @@ namespace Nz return std::make_shared(*m_device, queueFamilyIndex); } - const VulkanWindowFramebuffer& VkRenderWindow::GetFramebuffer(std::size_t i) const + const VulkanWindowFramebuffer& VulkanRenderWindow::GetFramebuffer(std::size_t i) const { assert(i < m_framebuffers.size()); return m_framebuffers[i]; } - std::size_t VkRenderWindow::GetFramebufferCount() const + std::size_t VulkanRenderWindow::GetFramebufferCount() const { - return std::size_t(); + return m_framebuffers.size(); } - void VkRenderWindow::Present(UInt32 imageIndex, VkSemaphore waitSemaphore) + const VulkanRenderPass& VulkanRenderWindow::GetRenderPass() const + { + return *m_renderPass; + } + + const Vector2ui& VulkanRenderWindow::GetSize() const + { + return m_swapchainSize; + } + + void VulkanRenderWindow::Present(UInt32 imageIndex, VkSemaphore waitSemaphore) { NazaraAssert(imageIndex < m_inflightFences.size(), "Invalid image index"); @@ -344,7 +356,7 @@ namespace Nz } } - bool VkRenderWindow::CreateSwapchain(Vk::Surface& surface, const Vector2ui& size) + bool VulkanRenderWindow::CreateSwapchain(Vk::Surface& surface, const Vector2ui& size) { assert(m_device); if (!SetupSwapchain(m_device->GetPhysicalDeviceInfo(), surface, size)) @@ -368,7 +380,7 @@ namespace Nz return true; } - bool VkRenderWindow::SetupDepthBuffer(const Vector2ui& size) + bool VulkanRenderWindow::SetupDepthBuffer(const Vector2ui& size) { VkImageCreateInfo imageCreateInfo = { VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType; @@ -446,7 +458,7 @@ namespace Nz return true; } - bool VkRenderWindow::SetupFrameBuffers(const Vector2ui& size) + bool VulkanRenderWindow::SetupFrameBuffers(const Vector2ui& size) { UInt32 imageCount = m_swapchain.GetImageCount(); @@ -482,7 +494,7 @@ namespace Nz return true; } - bool VkRenderWindow::SetupRenderPass() + bool VulkanRenderWindow::SetupRenderPass() { std::optional colorFormat = FromVulkan(m_surfaceFormat.format); if (!colorFormat) @@ -511,7 +523,7 @@ namespace Nz return true; } - bool VkRenderWindow::SetupSwapchain(const Vk::PhysicalDevice& deviceInfo, Vk::Surface& surface, const Vector2ui& size) + bool VulkanRenderWindow::SetupSwapchain(const Vk::PhysicalDevice& deviceInfo, Vk::Surface& surface, const Vector2ui& size) { VkSurfaceCapabilitiesKHR surfaceCapabilities; if (!surface.GetCapabilities(deviceInfo.physDevice, &surfaceCapabilities)) diff --git a/src/Nazara/VulkanRenderer/VulkanRenderer.cpp b/src/Nazara/VulkanRenderer/VulkanRenderer.cpp index ab3d420ad..ddcd927ca 100644 --- a/src/Nazara/VulkanRenderer/VulkanRenderer.cpp +++ b/src/Nazara/VulkanRenderer/VulkanRenderer.cpp @@ -7,7 +7,7 @@ #include #include #include -#include +#include #include #include #include @@ -27,7 +27,7 @@ namespace Nz std::unique_ptr VulkanRenderer::CreateRenderWindowImpl(RenderWindow& owner) { - return std::make_unique(owner); + return std::make_unique(owner); } std::shared_ptr VulkanRenderer::InstanciateRenderDevice(std::size_t deviceIndex, const RenderDeviceFeatures& enabledFeatures)