Graphics: Replace RenderFrame by RenderResources

This changes makes the whole rendering independent from the RenderFrame acquired from the Swapchain.
This may allow to do offscreen rendering (= without swapchain), or multi-window rendering in the future
This commit is contained in:
Lynix
2023-11-21 23:33:18 +01:00
parent d7d5c09428
commit 1e81b38c0f
66 changed files with 213 additions and 196 deletions

View File

@@ -23,10 +23,10 @@ namespace Nz
{
class CommandBufferBuilder;
class RenderBuffer;
class RenderFrame;
class RenderDevice;
class RenderPipeline;
class RenderPipelineLayout;
class RenderResources;
class ShaderBinding;
class Skeleton;
@@ -48,9 +48,9 @@ namespace Nz
inline void DrawPoint(const Vector3f& point, const Color& color, float boxSize = 0.01f);
void DrawSkeleton(const Skeleton& skeleton, const Color& color);
void Prepare(RenderFrame& renderFrame);
void Prepare(RenderResources& renderFrame);
void Reset(RenderFrame& renderFrame);
void Reset(RenderResources& renderFrame);
void SetViewerData(const Matrix4f& viewProjMatrix);

View File

@@ -26,16 +26,17 @@ namespace Nz
{
public:
inline explicit RenderFrame();
inline explicit RenderFrame(RenderImage* renderImage, bool framebufferInvalidation, const Vector2ui& size, std::size_t framebufferIndex);
inline explicit RenderFrame(RenderImage* renderImage, bool framebufferInvalidation, const Vector2ui& size);
RenderFrame(const RenderFrame&) = delete;
RenderFrame(RenderFrame&&) = delete;
~RenderFrame() = default;
inline void Execute(const FunctionRef<void(CommandBufferBuilder& builder)>& callback, QueueTypeFlags queueTypeFlags);
inline std::size_t GetFramebufferIndex() const;
inline std::size_t GetImageIndex() const;
const Vector2ui& GetSize() const;
inline RenderDevice& GetRenderDevice();
inline RenderResources& GetTransientResources();
inline UploadPool& GetUploadPool();
inline bool IsFramebufferInvalidated() const;
@@ -48,12 +49,12 @@ namespace Nz
void SubmitCommandBuffer(CommandBuffer* commandBuffer, QueueTypeFlags queueTypeFlags) ;
inline explicit operator bool();
inline operator RenderResources&();
RenderFrame& operator=(const RenderFrame&) = delete;
RenderFrame& operator=(RenderFrame&&) = delete;
private:
std::size_t m_framebufferIndex;
RenderImage* m_image;
Vector2ui m_size;
bool m_framebufferInvalidation;

View File

@@ -7,12 +7,11 @@
namespace Nz
{
inline RenderFrame::RenderFrame() :
RenderFrame(nullptr, false, Vector2ui::Zero(), 0)
RenderFrame(nullptr, false, Vector2ui::Zero())
{
}
inline RenderFrame::RenderFrame(RenderImage* renderImage, bool framebufferInvalidation, const Vector2ui& size, std::size_t framebufferIndex) :
m_framebufferIndex(framebufferIndex),
inline RenderFrame::RenderFrame(RenderImage* renderImage, bool framebufferInvalidation, const Vector2ui& size) :
m_image(renderImage),
m_size(size),
m_framebufferInvalidation(framebufferInvalidation)
@@ -27,9 +26,9 @@ namespace Nz
return m_image->Execute(callback, queueTypeFlags);
}
inline std::size_t RenderFrame::GetFramebufferIndex() const
inline std::size_t RenderFrame::GetImageIndex() const
{
return m_framebufferIndex;
return m_image->GetImageIndex();
}
inline const Vector2ui& RenderFrame::GetSize() const
@@ -42,6 +41,11 @@ namespace Nz
return m_image->GetRenderDevice();
}
inline RenderResources& RenderFrame::GetTransientResources()
{
return *m_image;
}
inline UploadPool& RenderFrame::GetUploadPool()
{
if NAZARA_UNLIKELY(!m_image)
@@ -90,11 +94,15 @@ namespace Nz
m_image->SubmitCommandBuffer(commandBuffer, queueTypeFlags);
}
inline RenderFrame::operator bool()
{
return m_image != nullptr;
}
inline RenderFrame::operator RenderResources&()
{
return GetTransientResources();
}
}
#include <Nazara/Renderer/DebugOff.hpp>

View File

@@ -8,14 +8,14 @@
#define NAZARA_RENDERER_RENDERIMAGE_HPP
#include <NazaraUtils/Prerequisites.hpp>
#include <Nazara/Renderer/TransientResources.hpp>
#include <Nazara/Renderer/RenderResources.hpp>
namespace Nz
{
class NAZARA_RENDERER_API RenderImage : public TransientResources
class NAZARA_RENDERER_API RenderImage : public RenderResources
{
public:
using TransientResources::TransientResources;
using RenderResources::RenderResources;
virtual void Present() = 0;
};

View File

@@ -4,8 +4,8 @@
#pragma once
#ifndef NAZARA_RENDERER_TRANSIENTRESOURCES_HPP
#define NAZARA_RENDERER_TRANSIENTRESOURCES_HPP
#ifndef NAZARA_RENDERER_RENDERRESOURCES_HPP
#define NAZARA_RENDERER_RENDERRESOURCES_HPP
#include <NazaraUtils/Prerequisites.hpp>
#include <Nazara/Renderer/Config.hpp>
@@ -22,18 +22,19 @@ namespace Nz
class RenderDevice;
class UploadPool;
class NAZARA_RENDERER_API TransientResources
class NAZARA_RENDERER_API RenderResources
{
public:
class Releasable;
template<typename T> class ReleasableLambda;
virtual ~TransientResources();
virtual ~RenderResources();
virtual void Execute(const FunctionRef<void(CommandBufferBuilder& builder)>& callback, QueueTypeFlags queueTypeFlags) = 0;
inline void FlushReleaseQueue();
virtual UInt32 GetImageIndex() const = 0;
inline RenderDevice& GetRenderDevice();
virtual UploadPool& GetUploadPool() = 0;
@@ -44,9 +45,9 @@ namespace Nz
virtual void SubmitCommandBuffer(CommandBuffer* commandBuffer, QueueTypeFlags queueTypeFlags) = 0;
protected:
inline TransientResources(RenderDevice& renderDvice);
TransientResources(const TransientResources&) = delete;
TransientResources(TransientResources&&) = delete;
inline RenderResources(RenderDevice& renderDvice);
RenderResources(const RenderResources&) = delete;
RenderResources(RenderResources&&) = delete;
private:
static constexpr std::size_t BlockSize = 4 * 1024 * 1024;
@@ -58,7 +59,7 @@ namespace Nz
RenderDevice& m_renderDevice;
};
class NAZARA_RENDERER_API TransientResources::Releasable
class NAZARA_RENDERER_API RenderResources::Releasable
{
public:
virtual ~Releasable();
@@ -67,7 +68,7 @@ namespace Nz
};
template<typename T>
class TransientResources::ReleasableLambda : public Releasable
class RenderResources::ReleasableLambda : public Releasable
{
public:
template<typename U> ReleasableLambda(U&& lambda);
@@ -85,6 +86,6 @@ namespace Nz
};
}
#include <Nazara/Renderer/TransientResources.inl>
#include <Nazara/Renderer/RenderResources.inl>
#endif // NAZARA_RENDERER_TRANSIENTRESOURCES_HPP
#endif // NAZARA_RENDERER_RENDERRESOURCES_HPP

View File

@@ -8,12 +8,12 @@
namespace Nz
{
inline TransientResources::TransientResources(RenderDevice& renderDevice) :
inline RenderResources::RenderResources(RenderDevice& renderDevice) :
m_renderDevice(renderDevice)
{
}
inline void TransientResources::FlushReleaseQueue()
inline void RenderResources::FlushReleaseQueue()
{
for (Releasable* releasable : m_releaseQueue)
{
@@ -26,13 +26,13 @@ namespace Nz
memoryblock.clear();
}
inline RenderDevice& TransientResources::GetRenderDevice()
inline RenderDevice& RenderResources::GetRenderDevice()
{
return m_renderDevice;
}
template<typename T>
void TransientResources::PushForRelease(T&& value)
void RenderResources::PushForRelease(T&& value)
{
static_assert(std::is_rvalue_reference_v<decltype(value)>);
@@ -40,7 +40,7 @@ namespace Nz
}
template<typename F>
void TransientResources::PushReleaseCallback(F&& callback)
void RenderResources::PushReleaseCallback(F&& callback)
{
using ReleaseFunctor = ReleasableLambda<std::remove_cv_t<std::remove_reference_t<F>>>;
@@ -95,13 +95,13 @@ namespace Nz
template<typename T>
template<typename U>
TransientResources::ReleasableLambda<T>::ReleasableLambda(U&& lambda) :
RenderResources::ReleasableLambda<T>::ReleasableLambda(U&& lambda) :
m_lambda(std::forward<U>(lambda))
{
}
template<typename T>
void TransientResources::ReleasableLambda<T>::Release()
void RenderResources::ReleasableLambda<T>::Release()
{
m_lambda();
}

View File

@@ -20,7 +20,7 @@ namespace Nz
class CommandPool;
class Framebuffer;
class RenderDevice;
class TransientResources;
class RenderResources;
class NAZARA_RENDERER_API Swapchain
{
@@ -38,13 +38,12 @@ namespace Nz
virtual const RenderPass& GetRenderPass() const = 0;
virtual const Vector2ui& GetSize() const = 0;
virtual PresentModeFlags GetSupportedPresentModes() const = 0;
virtual RenderResources& GetTransientResources() = 0;
virtual void NotifyResize(const Vector2ui& newSize) = 0;
virtual void SetPresentMode(PresentMode presentMode) = 0;
virtual TransientResources& Transient() = 0;
NazaraSignal(OnSwapchainResize, Swapchain* /*swapchain*/, const Vector2ui& /*newSize*/);
protected:

View File

@@ -39,8 +39,7 @@ namespace Nz
const Vector2ui& GetSize() const;
inline Swapchain* GetSwapchain();
inline const Swapchain* GetSwapchain() const;
inline TransientResources& Transient();
inline RenderResources& GetTransientResources();
WindowSwapchain& operator=(const WindowSwapchain&) = delete;
WindowSwapchain& operator=(WindowSwapchain&& windowSwapchain) = delete;

View File

@@ -53,9 +53,9 @@ namespace Nz
return m_swapchain.get();
}
inline TransientResources& WindowSwapchain::Transient()
inline RenderResources& WindowSwapchain::GetTransientResources()
{
return m_swapchain->Transient();
return m_swapchain->GetTransientResources();
}
void WindowSwapchain::DisconnectSignals()