Renderer/Framebuffer: Add GetType (and rework backend internals)

This commit is contained in:
Jérôme Leclercq 2021-06-22 17:30:08 +02:00
parent c188d0616a
commit d88c4ecb5b
22 changed files with 129 additions and 149 deletions

View File

@ -16,13 +16,7 @@ namespace Nz
class NAZARA_OPENGLRENDERER_API OpenGLFramebuffer : public Framebuffer
{
public:
enum class Type
{
FBO,
Window
};
inline OpenGLFramebuffer(Type type);
using Framebuffer::Framebuffer;
OpenGLFramebuffer() = default;
OpenGLFramebuffer(const OpenGLFramebuffer&) = delete;
OpenGLFramebuffer(OpenGLFramebuffer&&) noexcept = default;
@ -32,13 +26,8 @@ namespace Nz
virtual std::size_t GetColorBufferCount() const = 0;
inline Type GetType() const;
OpenGLFramebuffer& operator=(const OpenGLFramebuffer&) = delete;
OpenGLFramebuffer& operator=(OpenGLFramebuffer&&) noexcept = default;
private:
Type m_type;
};
}

View File

@ -7,15 +7,6 @@
namespace Nz
{
inline OpenGLFramebuffer::OpenGLFramebuffer(Type type) :
m_type(type)
{
}
inline auto OpenGLFramebuffer::GetType() const -> Type
{
return m_type;
}
}
#include <Nazara/OpenGLRenderer/DebugOff.hpp>

View File

@ -8,7 +8,7 @@
namespace Nz
{
inline OpenGLWindowFramebuffer::OpenGLWindowFramebuffer(OpenGLRenderWindow& renderWindow) :
OpenGLFramebuffer(OpenGLFramebuffer::Type::Window),
OpenGLFramebuffer(FramebufferType::Window),
m_renderWindow(renderWindow)
{
}

View File

@ -24,6 +24,12 @@ namespace Nz
Store
};
enum class FramebufferType
{
Texture,
Window
};
enum class MemoryAccess
{
ColorRead,

View File

@ -9,19 +9,25 @@
#include <Nazara/Prerequisites.hpp>
#include <Nazara/Renderer/Config.hpp>
#include <Nazara/Renderer/Enums.hpp>
namespace Nz
{
class NAZARA_RENDERER_API Framebuffer
{
public:
Framebuffer() = default;
inline Framebuffer(FramebufferType type);
Framebuffer(const Framebuffer&) = delete;
Framebuffer(Framebuffer&&) noexcept = default;
virtual ~Framebuffer();
inline FramebufferType GetType() const;
Framebuffer& operator=(const Framebuffer&) = delete;
Framebuffer& operator=(Framebuffer&&) noexcept = default;
private:
FramebufferType m_type;
};
}

View File

@ -7,6 +7,15 @@
namespace Nz
{
inline Framebuffer::Framebuffer(FramebufferType type) :
m_type(type)
{
}
inline FramebufferType Framebuffer::GetType() const
{
return m_type;
}
}
#include <Nazara/Renderer/DebugOff.hpp>

View File

@ -16,7 +16,7 @@
#include <Nazara/Renderer/RenderWindowImpl.hpp>
#include <Nazara/VulkanRenderer/Config.hpp>
#include <Nazara/VulkanRenderer/VulkanDevice.hpp>
#include <Nazara/VulkanRenderer/VulkanMultipleFramebuffer.hpp>
#include <Nazara/VulkanRenderer/VulkanWindowFramebuffer.hpp>
#include <Nazara/VulkanRenderer/VulkanRenderImage.hpp>
#include <Nazara/VulkanRenderer/VulkanRenderPass.hpp>
#include <Nazara/VulkanRenderer/VkRenderTarget.hpp>
@ -48,7 +48,7 @@ namespace Nz
std::shared_ptr<CommandPool> CreateCommandPool(QueueType queueType) override;
inline const VulkanMultipleFramebuffer& GetFramebuffer() const override;
inline const VulkanWindowFramebuffer& GetFramebuffer() const override;
inline VulkanDevice& GetDevice();
inline const VulkanDevice& GetDevice() const;
inline Vk::QueueHandle& GetGraphicsQueue();
@ -67,7 +67,7 @@ namespace Nz
bool SetupRenderPass();
bool SetupSwapchain(const Vk::PhysicalDevice& deviceInfo, Vk::Surface& surface, const Vector2ui& size);
std::optional<VulkanMultipleFramebuffer> m_framebuffer;
std::optional<VulkanWindowFramebuffer> m_framebuffer;
std::optional<VulkanRenderPass> m_renderPass;
std::shared_ptr<VulkanDevice> m_device;
std::size_t m_currentFrame;

View File

@ -7,7 +7,7 @@
namespace Nz
{
inline const VulkanMultipleFramebuffer& VkRenderWindow::GetFramebuffer() const
inline const VulkanWindowFramebuffer& VkRenderWindow::GetFramebuffer() const
{
return *m_framebuffer;
}

View File

@ -17,24 +17,13 @@ namespace Nz
class NAZARA_VULKANRENDERER_API VulkanFramebuffer : public Framebuffer
{
public:
enum class Type
{
Multiple,
Single
};
inline VulkanFramebuffer(Type type);
using Framebuffer::Framebuffer;
VulkanFramebuffer(const VulkanFramebuffer&) = delete;
VulkanFramebuffer(VulkanFramebuffer&&) noexcept = default;
~VulkanFramebuffer() = default;
inline Type GetType() const;
VulkanFramebuffer& operator=(const VulkanFramebuffer&) = delete;
VulkanFramebuffer& operator=(VulkanFramebuffer&&) noexcept = default;
private:
Type m_type;
};
}

View File

@ -7,15 +7,6 @@
namespace Nz
{
inline VulkanFramebuffer::VulkanFramebuffer(Type type) :
m_type(type)
{
}
inline auto VulkanFramebuffer::GetType() const -> Type
{
return m_type;
}
}
#include <Nazara/VulkanRenderer/DebugOff.hpp>

View File

@ -1,36 +0,0 @@
// 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_VULKANRENDERER_VULKANMULTIPLEFRAMEBUFFER_HPP
#define NAZARA_VULKANRENDERER_VULKANMULTIPLEFRAMEBUFFER_HPP
#include <Nazara/VulkanRenderer/VulkanFramebuffer.hpp>
#include <vector>
namespace Nz
{
class NAZARA_VULKANRENDERER_API VulkanMultipleFramebuffer final : public VulkanFramebuffer
{
public:
inline VulkanMultipleFramebuffer(Vk::Framebuffer* framebuffers, std::size_t count);
VulkanMultipleFramebuffer(const VulkanMultipleFramebuffer&) = delete;
VulkanMultipleFramebuffer(VulkanMultipleFramebuffer&&) noexcept = default;
~VulkanMultipleFramebuffer() = default;
inline const Vk::Framebuffer& GetFramebuffer(std::size_t index) const;
inline std::size_t GetFramebufferCount() const;
VulkanMultipleFramebuffer& operator=(const VulkanMultipleFramebuffer&) = delete;
VulkanMultipleFramebuffer& operator=(VulkanMultipleFramebuffer&&) noexcept = default;
private:
std::vector<Vk::Framebuffer> m_framebuffers;
};
}
#include <Nazara/VulkanRenderer/VulkanMultipleFramebuffer.inl>
#endif // NAZARA_VULKANRENDERER_VULKANMULTIPLEFRAMEBUFFER_HPP

View File

@ -1,39 +0,0 @@
// 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_VULKANRENDERER_VULKANSINGLEFRAMEBUFFER_HPP
#define NAZARA_VULKANRENDERER_VULKANSINGLEFRAMEBUFFER_HPP
#include <Nazara/VulkanRenderer/VulkanFramebuffer.hpp>
#include <memory>
namespace Nz
{
class RenderPass;
class Texture;
class NAZARA_VULKANRENDERER_API VulkanSingleFramebuffer final : public VulkanFramebuffer
{
public:
VulkanSingleFramebuffer(Vk::Device& device, unsigned int width, unsigned int height, const std::shared_ptr<RenderPass>& renderPass, const std::vector<std::shared_ptr<Texture>>& attachments);
VulkanSingleFramebuffer(const VulkanSingleFramebuffer&) = delete;
VulkanSingleFramebuffer(VulkanSingleFramebuffer&&) = delete;
~VulkanSingleFramebuffer() = default;
inline Vk::Framebuffer& GetFramebuffer();
inline const Vk::Framebuffer& GetFramebuffer() const;
VulkanSingleFramebuffer& operator=(const VulkanSingleFramebuffer&) = delete;
VulkanSingleFramebuffer& operator=(VulkanSingleFramebuffer&&) = delete;
private:
Vk::Framebuffer m_framebuffer;
};
}
#include <Nazara/VulkanRenderer/VulkanSingleFramebuffer.inl>
#endif // NAZARA_VULKANRENDERER_VULKANSINGLEFRAMEBUFFER_HPP

View File

@ -0,0 +1,39 @@
// 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_VULKANRENDERER_VULKANTEXTUREFRAMEBUFFER_HPP
#define NAZARA_VULKANRENDERER_VULKANTEXTUREFRAMEBUFFER_HPP
#include <Nazara/VulkanRenderer/VulkanFramebuffer.hpp>
#include <memory>
namespace Nz
{
class RenderPass;
class Texture;
class NAZARA_VULKANRENDERER_API VulkanTextureFramebuffer final : public VulkanFramebuffer
{
public:
VulkanTextureFramebuffer(Vk::Device& device, unsigned int width, unsigned int height, const std::shared_ptr<RenderPass>& renderPass, const std::vector<std::shared_ptr<Texture>>& attachments);
VulkanTextureFramebuffer(const VulkanTextureFramebuffer&) = delete;
VulkanTextureFramebuffer(VulkanTextureFramebuffer&&) = delete;
~VulkanTextureFramebuffer() = default;
inline Vk::Framebuffer& GetFramebuffer();
inline const Vk::Framebuffer& GetFramebuffer() const;
VulkanTextureFramebuffer& operator=(const VulkanTextureFramebuffer&) = delete;
VulkanTextureFramebuffer& operator=(VulkanTextureFramebuffer&&) = delete;
private:
Vk::Framebuffer m_framebuffer;
};
}
#include <Nazara/VulkanRenderer/VulkanTextureFramebuffer.inl>
#endif // NAZARA_VULKANRENDERER_VULKANTEXTUREFRAMEBUFFER_HPP

View File

@ -2,17 +2,17 @@
// This file is part of the "Nazara Engine - Vulkan Renderer"
// For conditions of distribution and use, see copyright notice in Config.hpp
#include <Nazara/VulkanRenderer/VulkanSingleFramebuffer.hpp>
#include <Nazara/VulkanRenderer/VulkanTextureFramebuffer.hpp>
#include <Nazara/VulkanRenderer/Debug.hpp>
namespace Nz
{
inline Vk::Framebuffer& VulkanSingleFramebuffer::GetFramebuffer()
inline Vk::Framebuffer& VulkanTextureFramebuffer::GetFramebuffer()
{
return m_framebuffer;
}
inline const Vk::Framebuffer& VulkanSingleFramebuffer::GetFramebuffer() const
inline const Vk::Framebuffer& VulkanTextureFramebuffer::GetFramebuffer() const
{
return m_framebuffer;
}

View File

@ -0,0 +1,36 @@
// 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_VULKANRENDERER_VULKANWINDOWFRAMEBUFFER_HPP
#define NAZARA_VULKANRENDERER_VULKANWINDOWFRAMEBUFFER_HPP
#include <Nazara/VulkanRenderer/VulkanFramebuffer.hpp>
#include <vector>
namespace Nz
{
class NAZARA_VULKANRENDERER_API VulkanWindowFramebuffer final : public VulkanFramebuffer
{
public:
inline VulkanWindowFramebuffer(Vk::Framebuffer* framebuffers, std::size_t count);
VulkanWindowFramebuffer(const VulkanWindowFramebuffer&) = delete;
VulkanWindowFramebuffer(VulkanWindowFramebuffer&&) noexcept = default;
~VulkanWindowFramebuffer() = default;
inline const Vk::Framebuffer& GetFramebuffer(std::size_t index) const;
inline std::size_t GetFramebufferCount() const;
VulkanWindowFramebuffer& operator=(const VulkanWindowFramebuffer&) = delete;
VulkanWindowFramebuffer& operator=(VulkanWindowFramebuffer&&) noexcept = default;
private:
std::vector<Vk::Framebuffer> m_framebuffers;
};
}
#include <Nazara/VulkanRenderer/VulkanWindowFramebuffer.inl>
#endif // NAZARA_VULKANRENDERER_VULKANWINDOWFRAMEBUFFER_HPP

View File

@ -2,26 +2,26 @@
// This file is part of the "Nazara Engine - Vulkan Renderer"
// For conditions of distribution and use, see copyright notice in Config.hpp
#include <Nazara/VulkanRenderer/VulkanMultipleFramebuffer.hpp>
#include <Nazara/VulkanRenderer/VulkanWindowFramebuffer.hpp>
#include <Nazara/VulkanRenderer/Debug.hpp>
namespace Nz
{
inline VulkanMultipleFramebuffer::VulkanMultipleFramebuffer(Vk::Framebuffer* framebuffers, std::size_t count) :
VulkanFramebuffer(Type::Multiple)
inline VulkanWindowFramebuffer::VulkanWindowFramebuffer(Vk::Framebuffer* framebuffers, std::size_t count) :
VulkanFramebuffer(FramebufferType::Window)
{
m_framebuffers.reserve(count);
for (std::size_t i = 0; i < count; ++i)
m_framebuffers.push_back(std::move(framebuffers[i]));
}
inline const Vk::Framebuffer& Nz::VulkanMultipleFramebuffer::GetFramebuffer(std::size_t index) const
inline const Vk::Framebuffer& Nz::VulkanWindowFramebuffer::GetFramebuffer(std::size_t index) const
{
assert(index < m_framebuffers.size());
return m_framebuffers[index];
}
inline std::size_t VulkanMultipleFramebuffer::GetFramebufferCount() const
inline std::size_t VulkanWindowFramebuffer::GetFramebufferCount() const
{
return m_framebuffers.size();
}

View File

@ -144,7 +144,7 @@ namespace Nz
StackVector<GLenum> invalidateAttachments = NazaraStackVector(GLenum, colorBufferCount + 1);
if (command.framebuffer->GetType() == OpenGLFramebuffer::Type::FBO)
if (command.framebuffer->GetType() == FramebufferType::Texture)
{
context->glDrawBuffers(GLsizei(colorBufferCount), fboDrawBuffers.data());

View File

@ -11,7 +11,7 @@
namespace Nz
{
OpenGLFboFramebuffer::OpenGLFboFramebuffer(OpenGLDevice& device, const std::vector<std::shared_ptr<Texture>>& attachments) :
OpenGLFramebuffer(OpenGLFramebuffer::Type::FBO)
OpenGLFramebuffer(FramebufferType::Texture)
{
if (!m_framebuffer.Create(device))
throw std::runtime_error("failed to create framebuffer object");

View File

@ -5,11 +5,11 @@
#include <Nazara/VulkanRenderer/VulkanCommandBufferBuilder.hpp>
#include <Nazara/Core/StackArray.hpp>
#include <Nazara/VulkanRenderer/VulkanBuffer.hpp>
#include <Nazara/VulkanRenderer/VulkanMultipleFramebuffer.hpp>
#include <Nazara/VulkanRenderer/VulkanWindowFramebuffer.hpp>
#include <Nazara/VulkanRenderer/VulkanRenderPass.hpp>
#include <Nazara/VulkanRenderer/VulkanRenderPipeline.hpp>
#include <Nazara/VulkanRenderer/VulkanRenderPipelineLayout.hpp>
#include <Nazara/VulkanRenderer/VulkanSingleFramebuffer.hpp>
#include <Nazara/VulkanRenderer/VulkanTextureFramebuffer.hpp>
#include <Nazara/VulkanRenderer/VulkanShaderBinding.hpp>
#include <Nazara/VulkanRenderer/VulkanTexture.hpp>
#include <Nazara/VulkanRenderer/VulkanUploadPool.hpp>
@ -33,21 +33,20 @@ namespace Nz
const Vk::Framebuffer& vkFramebuffer = [&] () -> const Vk::Framebuffer&
{
const VulkanFramebuffer& vkFramebuffer = static_cast<const VulkanFramebuffer&>(framebuffer);
switch (vkFramebuffer.GetType())
switch (framebuffer.GetType())
{
case VulkanFramebuffer::Type::Multiple:
case FramebufferType::Texture:
return static_cast<const VulkanTextureFramebuffer&>(framebuffer).GetFramebuffer();
case FramebufferType::Window:
{
const VulkanMultipleFramebuffer& vkMultipleFramebuffer = static_cast<const VulkanMultipleFramebuffer&>(vkFramebuffer);
const VulkanWindowFramebuffer& vkMultipleFramebuffer = static_cast<const VulkanWindowFramebuffer&>(framebuffer);
m_framebufferCount = std::max(m_framebufferCount, vkMultipleFramebuffer.GetFramebufferCount());
return vkMultipleFramebuffer.GetFramebuffer(m_imageIndex);
}
case VulkanFramebuffer::Type::Single:
return static_cast<const VulkanSingleFramebuffer&>(vkFramebuffer).GetFramebuffer();
}
throw std::runtime_error("Unhandled framebuffer type " + std::to_string(UnderlyingCast(vkFramebuffer.GetType())));
throw std::runtime_error("Unhandled framebuffer type " + std::to_string(UnderlyingCast(framebuffer.GetType())));
}();
std::size_t attachmentCount = vkRenderPass.GetAttachmentCount();

View File

@ -8,8 +8,8 @@
#include <Nazara/VulkanRenderer/VulkanRenderPipeline.hpp>
#include <Nazara/VulkanRenderer/VulkanRenderPipelineLayout.hpp>
#include <Nazara/VulkanRenderer/VulkanShaderModule.hpp>
#include <Nazara/VulkanRenderer/VulkanSingleFramebuffer.hpp>
#include <Nazara/VulkanRenderer/VulkanTexture.hpp>
#include <Nazara/VulkanRenderer/VulkanTextureFramebuffer.hpp>
#include <Nazara/VulkanRenderer/VulkanTextureSampler.hpp>
#include <Nazara/VulkanRenderer/Debug.hpp>
@ -34,7 +34,7 @@ namespace Nz
std::shared_ptr<Framebuffer> VulkanDevice::InstantiateFramebuffer(unsigned int width, unsigned int height, const std::shared_ptr<RenderPass>& renderPass, const std::vector<std::shared_ptr<Texture>>& attachments)
{
return std::make_shared<VulkanSingleFramebuffer>(*this, width, height, renderPass, attachments);
return std::make_shared<VulkanTextureFramebuffer>(*this, width, height, renderPass, attachments);
}
std::shared_ptr<RenderPass> VulkanDevice::InstantiateRenderPass(std::vector<RenderPass::Attachment> attachments, std::vector<RenderPass::SubpassDescription> subpassDescriptions, std::vector<RenderPass::SubpassDependency> subpassDependencies)

View File

@ -2,7 +2,7 @@
// This file is part of the "Nazara Engine - Vulkan Renderer"
// For conditions of distribution and use, see copyright notice in Config.hpp
#include <Nazara/VulkanRenderer/VulkanSingleFramebuffer.hpp>
#include <Nazara/VulkanRenderer/VulkanTextureFramebuffer.hpp>
#include <Nazara/Core/StackArray.hpp>
#include <Nazara/VulkanRenderer/VulkanRenderPass.hpp>
#include <Nazara/VulkanRenderer/VulkanTexture.hpp>
@ -11,8 +11,8 @@
namespace Nz
{
VulkanSingleFramebuffer::VulkanSingleFramebuffer(Vk::Device& device, unsigned int width, unsigned int height, const std::shared_ptr<RenderPass>& renderPass, const std::vector<std::shared_ptr<Texture>>& attachments) :
VulkanFramebuffer(Type::Single)
VulkanTextureFramebuffer::VulkanTextureFramebuffer(Vk::Device& device, unsigned int width, unsigned int height, const std::shared_ptr<RenderPass>& renderPass, const std::vector<std::shared_ptr<Texture>>& attachments) :
VulkanFramebuffer(FramebufferType::Texture)
{
assert(renderPass);
const VulkanRenderPass& vkRenderPass = static_cast<const VulkanRenderPass&>(*renderPass);

View File

@ -2,7 +2,7 @@
// This file is part of the "Nazara Engine - Vulkan Renderer"
// For conditions of distribution and use, see copyright notice in Config.hpp
#include <Nazara/VulkanRenderer/VulkanMultipleFramebuffer.hpp>
#include <Nazara/VulkanRenderer/VulkanWindowFramebuffer.hpp>
#include <Nazara/VulkanRenderer/Debug.hpp>
namespace Nz