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:
@@ -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);
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
@@ -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
|
||||
@@ -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();
|
||||
}
|
||||
@@ -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:
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user