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

@@ -22,7 +22,7 @@
namespace Nz
{
class RenderFrame;
class RenderResources;
class NAZARA_GRAPHICS_API BakedFrameGraph
{
@@ -34,12 +34,12 @@ namespace Nz
BakedFrameGraph(BakedFrameGraph&&) noexcept = default;
~BakedFrameGraph() = default;
void Execute(RenderFrame& renderFrame);
void Execute(RenderResources& renderResources);
const std::shared_ptr<Texture>& GetAttachmentTexture(std::size_t attachmentIndex) const;
const std::shared_ptr<RenderPass>& GetRenderPass(std::size_t passIndex) const;
bool Resize(RenderFrame& renderFrame, std::span<Vector2ui> viewerTargetSizes);
bool Resize(RenderResources& renderResources, std::span<Vector2ui> viewerTargetSizes);
BakedFrameGraph& operator=(const BakedFrameGraph&) = delete;
BakedFrameGraph& operator=(BakedFrameGraph&&) noexcept = default;

View File

@@ -37,7 +37,7 @@ namespace Nz
inline bool IsShadowStabilization() const;
void PrepareRendering(RenderFrame& renderFrame, const AbstractViewer* viewer) override;
void PrepareRendering(RenderResources& renderResources, const AbstractViewer* viewer) override;
void RegisterMaterialInstance(const MaterialInstance& matInstance) override;
void RegisterPassInputs(FramePass& pass, const AbstractViewer* viewer) override;

View File

@@ -24,7 +24,7 @@ namespace Nz
{
class CommandBufferBuilder;
class RenderElement;
class RenderFrame;
class RenderResources;
class Texture;
class ViewerInstance;
struct ElementRendererData;
@@ -40,10 +40,10 @@ namespace Nz
virtual RenderElementPoolBase& GetPool() = 0;
virtual std::unique_ptr<ElementRendererData> InstanciateData() = 0;
virtual void Prepare(const ViewerInstance& viewerInstance, ElementRendererData& rendererData, RenderFrame& currentFrame, std::size_t elementCount, const Pointer<const RenderElement>* elements, SparsePtr<const RenderStates> renderStates);
virtual void PrepareEnd(RenderFrame& currentFrame, ElementRendererData& rendererData);
virtual void Prepare(const ViewerInstance& viewerInstance, ElementRendererData& rendererData, RenderResources& currentFrame, std::size_t elementCount, const Pointer<const RenderElement>* elements, SparsePtr<const RenderStates> renderStates);
virtual void PrepareEnd(RenderResources& currentFrame, ElementRendererData& rendererData);
virtual void Render(const ViewerInstance& viewerInstance, ElementRendererData& rendererData, CommandBufferBuilder& commandBuffer, std::size_t elementCount, const Pointer<const RenderElement>* elements) = 0;
virtual void Reset(ElementRendererData& rendererData, RenderFrame& currentFrame);
virtual void Reset(ElementRendererData& rendererData, RenderResources& renderResources);
struct RenderStates
{

View File

@@ -62,7 +62,7 @@ namespace Nz
const LightShadowData* RetrieveLightShadowData(std::size_t lightIndex) const override;
const Texture* RetrieveLightShadowmap(std::size_t lightIndex, const AbstractViewer* viewer) const override;
void Render(RenderFrame& renderFrame) override;
void Render(RenderResources& renderResources) override;
void UnregisterLight(std::size_t lightIndex) override;
void UnregisterRenderable(std::size_t renderableIndex) override;
@@ -176,7 +176,6 @@ namespace Nz
MemoryPool<SkeletonInstanceData> m_skeletonInstances;
MemoryPool<ViewerData> m_viewerPool;
MemoryPool<WorldInstanceData> m_worldInstances;
RenderFrame* m_currentRenderFrame;
UInt8 m_generationCounter;
bool m_rebuildFrameGraph;
};

View File

@@ -55,12 +55,12 @@ namespace Nz
ForwardPipelinePass& operator=(ForwardPipelinePass&&) = delete;
private:
void OnTransfer(RenderFrame& renderFrame, CommandBufferBuilder& builder) override;
void OnTransfer(RenderResources& renderResources, CommandBufferBuilder& builder) override;
void PrepareDirectionalLights(void* lightMemory);
void PreparePointLights(void* lightMemory);
void PrepareSpotLights(void* lightMemory);
void PrepareLights(RenderFrame& renderFrame, const Frustumf& frustum, const Bitset<UInt64>& visibleLights);
void PrepareLights(RenderResources& renderResources, const Frustumf& frustum, const Bitset<UInt64>& visibleLights);
struct MaterialPassEntry
{

View File

@@ -10,7 +10,6 @@
#include <NazaraUtils/Prerequisites.hpp>
#include <Nazara/Core/Color.hpp>
#include <Nazara/Graphics/Config.hpp>
#include <Nazara/Graphics/FramePassAttachment.hpp>
#include <Nazara/Math/Rect.hpp>
#include <Nazara/Renderer/Enums.hpp>
#include <functional>
@@ -23,7 +22,7 @@ namespace Nz
class BakedFrameGraph;
class CommandBufferBuilder;
class FrameGraph;
class RenderFrame;
class RenderResources;
enum class FramePassExecution
{
@@ -35,8 +34,8 @@ namespace Nz
struct FramePassEnvironment
{
BakedFrameGraph& frameGraph;
RenderResources& renderResources;
Recti renderRect;
RenderFrame& renderFrame;
};
class NAZARA_GRAPHICS_API FramePass

View File

@@ -25,7 +25,7 @@ namespace Nz
class LightShadowData;
class MaterialInstance;
class PipelineViewer;
class RenderFrame;
class RenderResources;
class NAZARA_GRAPHICS_API FramePipeline
{
@@ -54,7 +54,7 @@ namespace Nz
virtual const LightShadowData* RetrieveLightShadowData(std::size_t lightIndex) const = 0;
virtual const Texture* RetrieveLightShadowmap(std::size_t lightIndex, const AbstractViewer* viewer) const = 0;
virtual void Render(RenderFrame& renderFrame) = 0;
virtual void Render(RenderResources& renderResources) = 0;
virtual void UnregisterLight(std::size_t lightIndex) = 0;
virtual void UnregisterRenderable(std::size_t renderableIndex) = 0;
@@ -71,7 +71,7 @@ namespace Nz
FramePipeline& operator=(const FramePipeline&) = delete;
FramePipeline& operator=(FramePipeline&&) = delete;
NazaraSignal(OnTransfer, FramePipeline* /*pipeline*/, RenderFrame& /*renderFrame*/, CommandBufferBuilder& /*builder*/);
NazaraSignal(OnTransfer, FramePipeline* /*pipeline*/, RenderResources& /*renderResources*/, CommandBufferBuilder& /*builder*/);
static constexpr std::size_t NoSkeletonInstance = std::numeric_limits<std::size_t>::max();

View File

@@ -24,7 +24,7 @@ namespace Nz
class FramePipeline;
class InstancedRenderable;
class MaterialInstance;
class RenderFrame;
class RenderResources;
class SkeletonInstance;
class WorldInstance;
@@ -60,7 +60,7 @@ namespace Nz
{
const Bitset<UInt64>* visibleLights;
const Frustumf& frustum;
RenderFrame& renderFrame;
RenderResources& renderResources;
const std::vector<VisibleRenderable>& visibleRenderables;
std::size_t visibilityHash;
};

View File

@@ -17,7 +17,7 @@ namespace Nz
class FrameGraph;
class FramePass;
class MaterialInstance;
class RenderFrame;
class RenderResources;
class Texture;
class NAZARA_GRAPHICS_API LightShadowData
@@ -30,7 +30,7 @@ namespace Nz
inline bool IsPerViewer() const;
virtual void PrepareRendering(RenderFrame& renderFrame, [[maybe_unused]] const AbstractViewer* viewer) = 0;
virtual void PrepareRendering(RenderResources& renderResources, [[maybe_unused]] const AbstractViewer* viewer) = 0;
virtual void RegisterMaterialInstance(const MaterialInstance& matInstance) = 0;
virtual void RegisterPassInputs(FramePass& pass, const AbstractViewer* viewer) = 0;

View File

@@ -82,7 +82,7 @@ namespace Nz
bool HasPass(std::string_view passName) const;
inline bool HasPass(std::size_t passIndex) const;
void OnTransfer(RenderFrame& renderFrame, CommandBufferBuilder& builder) override;
void OnTransfer(RenderResources& renderResources, CommandBufferBuilder& builder) override;
inline void SetTextureProperty(std::string_view propertyName, std::shared_ptr<Texture> texture);
inline void SetTextureProperty(std::string_view propertyName, std::shared_ptr<Texture> texture, const TextureSamplerInfo& samplerInfo);

View File

@@ -28,7 +28,7 @@ namespace Nz
PointLightShadowData(PointLightShadowData&&) = delete;
~PointLightShadowData() = default;
void PrepareRendering(RenderFrame& renderFrame, const AbstractViewer* viewer) override;
void PrepareRendering(RenderResources& renderResources, const AbstractViewer* viewer) override;
void RegisterMaterialInstance(const MaterialInstance& matInstance) override;
void RegisterPassInputs(FramePass& pass, const AbstractViewer* viewer) override;

View File

@@ -18,9 +18,9 @@ namespace Nz
class CommandBufferBuilder;
class Framebuffer;
class FrameGraph;
class RenderFrame;
class RenderPass;
class Texture;
class RenderResources;
class NAZARA_GRAPHICS_API RenderTarget
{
@@ -29,7 +29,7 @@ namespace Nz
virtual ~RenderTarget();
virtual void OnBuildGraph(FrameGraph& frameGraph, std::size_t attachmentIndex) const = 0;
virtual void OnRenderEnd(RenderFrame& renderFrame, const BakedFrameGraph& frameGraph, std::size_t finalAttachment) const = 0;
virtual void OnRenderEnd(RenderResources& resources, const BakedFrameGraph& frameGraph, std::size_t finalAttachment) const = 0;
virtual const Vector2ui& GetSize() const = 0;

View File

@@ -25,7 +25,7 @@ namespace Nz
~RenderTexture() = default;
void OnBuildGraph(FrameGraph& graph, std::size_t attachmentIndex) const override;
void OnRenderEnd(RenderFrame& renderFrame, const BakedFrameGraph& frameGraph, std::size_t finalAttachment) const override;
void OnRenderEnd(RenderResources& resources, const BakedFrameGraph& frameGraph, std::size_t finalAttachment) const override;
const Vector2ui& GetSize() const override;

View File

@@ -27,7 +27,7 @@ namespace Nz
~RenderTextureBlit() = default;
void OnBuildGraph(FrameGraph& graph, std::size_t attachmentIndex) const override;
void OnRenderEnd(RenderFrame& renderFrame, const BakedFrameGraph& frameGraph, std::size_t finalAttachment) const override;
void OnRenderEnd(RenderResources& resources, const BakedFrameGraph& frameGraph, std::size_t finalAttachment) const override;
const Vector2ui& GetSize() const override;

View File

@@ -26,7 +26,7 @@ namespace Nz
~RenderWindow() = default;
void OnBuildGraph(FrameGraph& graph, std::size_t attachmentIndex) const override;
void OnRenderEnd(RenderFrame& renderFrame, const BakedFrameGraph& frameGraph, std::size_t attachmentId) const override;
void OnRenderEnd(RenderResources& renderResources, const BakedFrameGraph& frameGraph, std::size_t attachmentId) const override;
const Vector2ui& GetSize() const override;

View File

@@ -36,7 +36,7 @@ namespace Nz
inline const std::shared_ptr<RenderBuffer>& GetSkeletalBuffer() const;
inline const std::shared_ptr<const Skeleton>& GetSkeleton() const;
void OnTransfer(RenderFrame& renderFrame, CommandBufferBuilder& builder) override;
void OnTransfer(RenderResources& renderResources, CommandBufferBuilder& builder) override;
SkeletonInstance& operator=(const SkeletonInstance&) = delete;
SkeletonInstance& operator=(SkeletonInstance&& skeletonInstance) noexcept;

View File

@@ -28,7 +28,7 @@ namespace Nz
inline const ViewerInstance& GetViewerInstance() const;
void PrepareRendering(RenderFrame& renderFrame, [[maybe_unused]] const AbstractViewer* viewer) override;
void PrepareRendering(RenderResources& renderResources, [[maybe_unused]] const AbstractViewer* viewer) override;
void RegisterMaterialInstance(const MaterialInstance& matInstance) override;
void RegisterPassInputs(FramePass& pass, const AbstractViewer* viewer) override;

View File

@@ -59,10 +59,10 @@ namespace Nz
RenderElementPool<RenderSpriteChain>& GetPool() override;
std::unique_ptr<ElementRendererData> InstanciateData() override;
void Prepare(const ViewerInstance& viewerInstance, ElementRendererData& rendererData, RenderFrame& currentFrame, std::size_t elementCount, const Pointer<const RenderElement>* elements, SparsePtr<const RenderStates> renderStates) override;
void PrepareEnd(RenderFrame& currentFrame, ElementRendererData& rendererData) override;
void Prepare(const ViewerInstance& viewerInstance, ElementRendererData& rendererData, RenderResources& currentFrame, std::size_t elementCount, const Pointer<const RenderElement>* elements, SparsePtr<const RenderStates> renderStates) override;
void PrepareEnd(RenderResources& renderResources, ElementRendererData& rendererData) override;
void Render(const ViewerInstance& viewerInstance, ElementRendererData& rendererData, CommandBufferBuilder& commandBuffer, std::size_t elementCount, const Pointer<const RenderElement>* elements) override;
void Reset(ElementRendererData& rendererData, RenderFrame& currentFrame) override;
void Reset(ElementRendererData& rendererData, RenderResources& currentFrame) override;
private:
void Flush();

View File

@@ -27,9 +27,9 @@ namespace Nz
RenderElementPool<RenderSubmesh>& GetPool() override;
std::unique_ptr<ElementRendererData> InstanciateData() override;
void Prepare(const ViewerInstance& viewerInstance, ElementRendererData& rendererData, RenderFrame& currentFrame, std::size_t elementCount, const Pointer<const RenderElement>* elements, SparsePtr<const RenderStates> renderStates) override;
void Prepare(const ViewerInstance& viewerInstance, ElementRendererData& rendererData, RenderResources& renderResources, std::size_t elementCount, const Pointer<const RenderElement>* elements, SparsePtr<const RenderStates> renderStates) override;
void Render(const ViewerInstance& viewerInstance, ElementRendererData& rendererData, CommandBufferBuilder& commandBuffer, std::size_t elementCount, const Pointer<const RenderElement>* elements) override;
void Reset(ElementRendererData& rendererData, RenderFrame& currentFrame) override;
void Reset(ElementRendererData& rendererData, RenderResources& renderResources) override;
private:
std::vector<ShaderBinding::Binding> m_bindingCache;

View File

@@ -14,7 +14,7 @@
namespace Nz
{
class CommandBufferBuilder;
class RenderFrame;
class RenderResources;
class NAZARA_GRAPHICS_API TransferInterface
{
@@ -24,7 +24,7 @@ namespace Nz
TransferInterface(TransferInterface&&) = default;
virtual ~TransferInterface();
virtual void OnTransfer(RenderFrame& renderFrame, CommandBufferBuilder& builder) = 0;
virtual void OnTransfer(RenderResources& renderResources, CommandBufferBuilder& builder) = 0;
TransferInterface& operator=(const TransferInterface&) = default;
TransferInterface& operator=(TransferInterface&&) = default;

View File

@@ -42,7 +42,7 @@ namespace Nz
inline std::shared_ptr<RenderBuffer>& GetViewerBuffer();
inline const std::shared_ptr<RenderBuffer>& GetViewerBuffer() const;
void OnTransfer(RenderFrame& renderFrame, CommandBufferBuilder& builder) override;
void OnTransfer(RenderResources& renderResources, CommandBufferBuilder& builder) override;
inline void UpdateEyePosition(const Vector3f& eyePosition);
inline void UpdateNearFarPlanes(float nearPlane, float farPlane);

View File

@@ -36,7 +36,7 @@ namespace Nz
inline const Matrix4f& GetInvWorldMatrix() const;
inline const Matrix4f& GetWorldMatrix() const;
void OnTransfer(RenderFrame& renderFrame, CommandBufferBuilder& builder) override;
void OnTransfer(RenderResources& renderFrame, CommandBufferBuilder& builder) override;
inline void UpdateWorldMatrix(const Matrix4f& worldMatrix);
inline void UpdateWorldMatrix(const Matrix4f& worldMatrix, const Matrix4f& invWorldMatrix);