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 namespace Nz
{ {
class RenderFrame; class RenderResources;
class NAZARA_GRAPHICS_API BakedFrameGraph class NAZARA_GRAPHICS_API BakedFrameGraph
{ {
@ -34,12 +34,12 @@ namespace Nz
BakedFrameGraph(BakedFrameGraph&&) noexcept = default; BakedFrameGraph(BakedFrameGraph&&) noexcept = default;
~BakedFrameGraph() = 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<Texture>& GetAttachmentTexture(std::size_t attachmentIndex) const;
const std::shared_ptr<RenderPass>& GetRenderPass(std::size_t passIndex) 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=(const BakedFrameGraph&) = delete;
BakedFrameGraph& operator=(BakedFrameGraph&&) noexcept = default; BakedFrameGraph& operator=(BakedFrameGraph&&) noexcept = default;

View File

@ -37,7 +37,7 @@ namespace Nz
inline bool IsShadowStabilization() const; 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 RegisterMaterialInstance(const MaterialInstance& matInstance) override;
void RegisterPassInputs(FramePass& pass, const AbstractViewer* viewer) override; void RegisterPassInputs(FramePass& pass, const AbstractViewer* viewer) override;

View File

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

View File

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

View File

@ -55,12 +55,12 @@ namespace Nz
ForwardPipelinePass& operator=(ForwardPipelinePass&&) = delete; ForwardPipelinePass& operator=(ForwardPipelinePass&&) = delete;
private: private:
void OnTransfer(RenderFrame& renderFrame, CommandBufferBuilder& builder) override; void OnTransfer(RenderResources& renderResources, CommandBufferBuilder& builder) override;
void PrepareDirectionalLights(void* lightMemory); void PrepareDirectionalLights(void* lightMemory);
void PreparePointLights(void* lightMemory); void PreparePointLights(void* lightMemory);
void PrepareSpotLights(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 struct MaterialPassEntry
{ {

View File

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

View File

@ -25,7 +25,7 @@ namespace Nz
class LightShadowData; class LightShadowData;
class MaterialInstance; class MaterialInstance;
class PipelineViewer; class PipelineViewer;
class RenderFrame; class RenderResources;
class NAZARA_GRAPHICS_API FramePipeline class NAZARA_GRAPHICS_API FramePipeline
{ {
@ -54,7 +54,7 @@ namespace Nz
virtual const LightShadowData* RetrieveLightShadowData(std::size_t lightIndex) const = 0; virtual const LightShadowData* RetrieveLightShadowData(std::size_t lightIndex) const = 0;
virtual const Texture* RetrieveLightShadowmap(std::size_t lightIndex, const AbstractViewer* viewer) 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 UnregisterLight(std::size_t lightIndex) = 0;
virtual void UnregisterRenderable(std::size_t renderableIndex) = 0; virtual void UnregisterRenderable(std::size_t renderableIndex) = 0;
@ -71,7 +71,7 @@ namespace Nz
FramePipeline& operator=(const FramePipeline&) = delete; FramePipeline& operator=(const FramePipeline&) = delete;
FramePipeline& operator=(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(); static constexpr std::size_t NoSkeletonInstance = std::numeric_limits<std::size_t>::max();

View File

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

View File

@ -17,7 +17,7 @@ namespace Nz
class FrameGraph; class FrameGraph;
class FramePass; class FramePass;
class MaterialInstance; class MaterialInstance;
class RenderFrame; class RenderResources;
class Texture; class Texture;
class NAZARA_GRAPHICS_API LightShadowData class NAZARA_GRAPHICS_API LightShadowData
@ -30,7 +30,7 @@ namespace Nz
inline bool IsPerViewer() const; 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 RegisterMaterialInstance(const MaterialInstance& matInstance) = 0;
virtual void RegisterPassInputs(FramePass& pass, const AbstractViewer* viewer) = 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; bool HasPass(std::string_view passName) const;
inline bool HasPass(std::size_t passIndex) 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);
inline void SetTextureProperty(std::string_view propertyName, std::shared_ptr<Texture> texture, const TextureSamplerInfo& samplerInfo); 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(PointLightShadowData&&) = delete;
~PointLightShadowData() = default; ~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 RegisterMaterialInstance(const MaterialInstance& matInstance) override;
void RegisterPassInputs(FramePass& pass, const AbstractViewer* viewer) override; void RegisterPassInputs(FramePass& pass, const AbstractViewer* viewer) override;

View File

@ -18,9 +18,9 @@ namespace Nz
class CommandBufferBuilder; class CommandBufferBuilder;
class Framebuffer; class Framebuffer;
class FrameGraph; class FrameGraph;
class RenderFrame;
class RenderPass; class RenderPass;
class Texture; class Texture;
class RenderResources;
class NAZARA_GRAPHICS_API RenderTarget class NAZARA_GRAPHICS_API RenderTarget
{ {
@ -29,7 +29,7 @@ namespace Nz
virtual ~RenderTarget(); virtual ~RenderTarget();
virtual void OnBuildGraph(FrameGraph& frameGraph, std::size_t attachmentIndex) const = 0; 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; virtual const Vector2ui& GetSize() const = 0;

View File

@ -25,7 +25,7 @@ namespace Nz
~RenderTexture() = default; ~RenderTexture() = default;
void OnBuildGraph(FrameGraph& graph, std::size_t attachmentIndex) const override; 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; const Vector2ui& GetSize() const override;

View File

@ -27,7 +27,7 @@ namespace Nz
~RenderTextureBlit() = default; ~RenderTextureBlit() = default;
void OnBuildGraph(FrameGraph& graph, std::size_t attachmentIndex) const override; 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; const Vector2ui& GetSize() const override;

View File

@ -26,7 +26,7 @@ namespace Nz
~RenderWindow() = default; ~RenderWindow() = default;
void OnBuildGraph(FrameGraph& graph, std::size_t attachmentIndex) const override; 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; 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<RenderBuffer>& GetSkeletalBuffer() const;
inline const std::shared_ptr<const Skeleton>& GetSkeleton() 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=(const SkeletonInstance&) = delete;
SkeletonInstance& operator=(SkeletonInstance&& skeletonInstance) noexcept; SkeletonInstance& operator=(SkeletonInstance&& skeletonInstance) noexcept;

View File

@ -28,7 +28,7 @@ namespace Nz
inline const ViewerInstance& GetViewerInstance() const; 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 RegisterMaterialInstance(const MaterialInstance& matInstance) override;
void RegisterPassInputs(FramePass& pass, const AbstractViewer* viewer) override; void RegisterPassInputs(FramePass& pass, const AbstractViewer* viewer) override;

View File

@ -59,10 +59,10 @@ namespace Nz
RenderElementPool<RenderSpriteChain>& GetPool() override; RenderElementPool<RenderSpriteChain>& GetPool() override;
std::unique_ptr<ElementRendererData> InstanciateData() 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& currentFrame, std::size_t elementCount, const Pointer<const RenderElement>* elements, SparsePtr<const RenderStates> renderStates) override;
void PrepareEnd(RenderFrame& currentFrame, ElementRendererData& rendererData) 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 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: private:
void Flush(); void Flush();

View File

@ -27,9 +27,9 @@ namespace Nz
RenderElementPool<RenderSubmesh>& GetPool() override; RenderElementPool<RenderSubmesh>& GetPool() override;
std::unique_ptr<ElementRendererData> InstanciateData() 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 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: private:
std::vector<ShaderBinding::Binding> m_bindingCache; std::vector<ShaderBinding::Binding> m_bindingCache;

View File

@ -14,7 +14,7 @@
namespace Nz namespace Nz
{ {
class CommandBufferBuilder; class CommandBufferBuilder;
class RenderFrame; class RenderResources;
class NAZARA_GRAPHICS_API TransferInterface class NAZARA_GRAPHICS_API TransferInterface
{ {
@ -24,7 +24,7 @@ namespace Nz
TransferInterface(TransferInterface&&) = default; TransferInterface(TransferInterface&&) = default;
virtual ~TransferInterface(); 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=(const TransferInterface&) = default;
TransferInterface& operator=(TransferInterface&&) = default; TransferInterface& operator=(TransferInterface&&) = default;

View File

@ -42,7 +42,7 @@ namespace Nz
inline std::shared_ptr<RenderBuffer>& GetViewerBuffer(); inline std::shared_ptr<RenderBuffer>& GetViewerBuffer();
inline const std::shared_ptr<RenderBuffer>& GetViewerBuffer() const; 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 UpdateEyePosition(const Vector3f& eyePosition);
inline void UpdateNearFarPlanes(float nearPlane, float farPlane); inline void UpdateNearFarPlanes(float nearPlane, float farPlane);

View File

@ -36,7 +36,7 @@ namespace Nz
inline const Matrix4f& GetInvWorldMatrix() const; inline const Matrix4f& GetInvWorldMatrix() const;
inline const Matrix4f& GetWorldMatrix() 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);
inline void UpdateWorldMatrix(const Matrix4f& worldMatrix, const Matrix4f& invWorldMatrix); inline void UpdateWorldMatrix(const Matrix4f& worldMatrix, const Matrix4f& invWorldMatrix);

View File

@ -24,15 +24,19 @@ namespace Nz
void Execute(const FunctionRef<void(CommandBufferBuilder& builder)>& callback, QueueTypeFlags queueTypeFlags) override; void Execute(const FunctionRef<void(CommandBufferBuilder& builder)>& callback, QueueTypeFlags queueTypeFlags) override;
UInt32 GetImageIndex() const override;
OpenGLUploadPool& GetUploadPool() override; OpenGLUploadPool& GetUploadPool() override;
void Present() override; void Present() override;
inline void Reset(UInt32 imageIndex);
void SubmitCommandBuffer(CommandBuffer* commandBuffer, QueueTypeFlags queueTypeFlags) override; void SubmitCommandBuffer(CommandBuffer* commandBuffer, QueueTypeFlags queueTypeFlags) override;
private: private:
OpenGLSwapchain& m_owner; OpenGLSwapchain& m_owner;
OpenGLUploadPool m_uploadPool; OpenGLUploadPool m_uploadPool;
UInt32 m_imageIndex;
}; };
} }

View File

@ -6,6 +6,10 @@
namespace Nz namespace Nz
{ {
inline void OpenGLRenderImage::Reset(UInt32 imageIndex)
{
m_imageIndex = imageIndex;
}
} }
#include <Nazara/OpenGLRenderer/DebugOff.hpp> #include <Nazara/OpenGLRenderer/DebugOff.hpp>

View File

@ -33,7 +33,7 @@ namespace Nz
inline GL::Context& GetContext(); inline GL::Context& GetContext();
inline OpenGLDevice& GetDevice(); inline OpenGLDevice& GetDevice();
const OpenGLFramebuffer& GetFramebuffer(std::size_t i) const override; const OpenGLFramebuffer& GetFramebuffer(std::size_t imageIndex) const override;
std::size_t GetFramebufferCount() const override; std::size_t GetFramebufferCount() const override;
PresentMode GetPresentMode() const override; PresentMode GetPresentMode() const override;
const OpenGLRenderPass& GetRenderPass() const override; const OpenGLRenderPass& GetRenderPass() const override;
@ -46,17 +46,17 @@ namespace Nz
void SetPresentMode(PresentMode presentMode) override; void SetPresentMode(PresentMode presentMode) override;
TransientResources& Transient() override; RenderResources& GetTransientResources() override;
private: private:
std::optional<OpenGLRenderPass> m_renderPass; std::optional<OpenGLRenderPass> m_renderPass;
std::size_t m_currentFrame;
std::shared_ptr<GL::Context> m_context; std::shared_ptr<GL::Context> m_context;
std::vector<std::unique_ptr<OpenGLRenderImage>> m_renderImage; std::vector<std::unique_ptr<OpenGLRenderImage>> m_renderImage;
OpenGLDevice& m_device; OpenGLDevice& m_device;
OpenGLWindowFramebuffer m_framebuffer; OpenGLWindowFramebuffer m_framebuffer;
PresentMode m_presentMode; PresentMode m_presentMode;
PresentModeFlags m_supportedPresentModes; PresentModeFlags m_supportedPresentModes;
UInt32 m_currentImageIndex;
Vector2ui m_size; Vector2ui m_size;
bool m_sizeInvalidated; bool m_sizeInvalidated;
}; };

View File

@ -50,6 +50,7 @@
#include <Nazara/Renderer/RenderPassCache.hpp> #include <Nazara/Renderer/RenderPassCache.hpp>
#include <Nazara/Renderer/RenderPipeline.hpp> #include <Nazara/Renderer/RenderPipeline.hpp>
#include <Nazara/Renderer/RenderPipelineLayout.hpp> #include <Nazara/Renderer/RenderPipelineLayout.hpp>
#include <Nazara/Renderer/RenderResources.hpp>
#include <Nazara/Renderer/RenderStates.hpp> #include <Nazara/Renderer/RenderStates.hpp>
#include <Nazara/Renderer/ShaderBinding.hpp> #include <Nazara/Renderer/ShaderBinding.hpp>
#include <Nazara/Renderer/ShaderModule.hpp> #include <Nazara/Renderer/ShaderModule.hpp>
@ -57,7 +58,6 @@
#include <Nazara/Renderer/SwapchainParameters.hpp> #include <Nazara/Renderer/SwapchainParameters.hpp>
#include <Nazara/Renderer/Texture.hpp> #include <Nazara/Renderer/Texture.hpp>
#include <Nazara/Renderer/TextureSampler.hpp> #include <Nazara/Renderer/TextureSampler.hpp>
#include <Nazara/Renderer/TransientResources.hpp>
#include <Nazara/Renderer/UploadPool.hpp> #include <Nazara/Renderer/UploadPool.hpp>
#include <Nazara/Renderer/WindowSwapchain.hpp> #include <Nazara/Renderer/WindowSwapchain.hpp>

View File

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

View File

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

View File

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

View File

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

View File

@ -4,8 +4,8 @@
#pragma once #pragma once
#ifndef NAZARA_RENDERER_TRANSIENTRESOURCES_HPP #ifndef NAZARA_RENDERER_RENDERRESOURCES_HPP
#define NAZARA_RENDERER_TRANSIENTRESOURCES_HPP #define NAZARA_RENDERER_RENDERRESOURCES_HPP
#include <NazaraUtils/Prerequisites.hpp> #include <NazaraUtils/Prerequisites.hpp>
#include <Nazara/Renderer/Config.hpp> #include <Nazara/Renderer/Config.hpp>
@ -22,18 +22,19 @@ namespace Nz
class RenderDevice; class RenderDevice;
class UploadPool; class UploadPool;
class NAZARA_RENDERER_API TransientResources class NAZARA_RENDERER_API RenderResources
{ {
public: public:
class Releasable; class Releasable;
template<typename T> class ReleasableLambda; template<typename T> class ReleasableLambda;
virtual ~TransientResources(); virtual ~RenderResources();
virtual void Execute(const FunctionRef<void(CommandBufferBuilder& builder)>& callback, QueueTypeFlags queueTypeFlags) = 0; virtual void Execute(const FunctionRef<void(CommandBufferBuilder& builder)>& callback, QueueTypeFlags queueTypeFlags) = 0;
inline void FlushReleaseQueue(); inline void FlushReleaseQueue();
virtual UInt32 GetImageIndex() const = 0;
inline RenderDevice& GetRenderDevice(); inline RenderDevice& GetRenderDevice();
virtual UploadPool& GetUploadPool() = 0; virtual UploadPool& GetUploadPool() = 0;
@ -44,9 +45,9 @@ namespace Nz
virtual void SubmitCommandBuffer(CommandBuffer* commandBuffer, QueueTypeFlags queueTypeFlags) = 0; virtual void SubmitCommandBuffer(CommandBuffer* commandBuffer, QueueTypeFlags queueTypeFlags) = 0;
protected: protected:
inline TransientResources(RenderDevice& renderDvice); inline RenderResources(RenderDevice& renderDvice);
TransientResources(const TransientResources&) = delete; RenderResources(const RenderResources&) = delete;
TransientResources(TransientResources&&) = delete; RenderResources(RenderResources&&) = delete;
private: private:
static constexpr std::size_t BlockSize = 4 * 1024 * 1024; static constexpr std::size_t BlockSize = 4 * 1024 * 1024;
@ -58,7 +59,7 @@ namespace Nz
RenderDevice& m_renderDevice; RenderDevice& m_renderDevice;
}; };
class NAZARA_RENDERER_API TransientResources::Releasable class NAZARA_RENDERER_API RenderResources::Releasable
{ {
public: public:
virtual ~Releasable(); virtual ~Releasable();
@ -67,7 +68,7 @@ namespace Nz
}; };
template<typename T> template<typename T>
class TransientResources::ReleasableLambda : public Releasable class RenderResources::ReleasableLambda : public Releasable
{ {
public: public:
template<typename U> ReleasableLambda(U&& lambda); 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 namespace Nz
{ {
inline TransientResources::TransientResources(RenderDevice& renderDevice) : inline RenderResources::RenderResources(RenderDevice& renderDevice) :
m_renderDevice(renderDevice) m_renderDevice(renderDevice)
{ {
} }
inline void TransientResources::FlushReleaseQueue() inline void RenderResources::FlushReleaseQueue()
{ {
for (Releasable* releasable : m_releaseQueue) for (Releasable* releasable : m_releaseQueue)
{ {
@ -26,13 +26,13 @@ namespace Nz
memoryblock.clear(); memoryblock.clear();
} }
inline RenderDevice& TransientResources::GetRenderDevice() inline RenderDevice& RenderResources::GetRenderDevice()
{ {
return m_renderDevice; return m_renderDevice;
} }
template<typename T> template<typename T>
void TransientResources::PushForRelease(T&& value) void RenderResources::PushForRelease(T&& value)
{ {
static_assert(std::is_rvalue_reference_v<decltype(value)>); static_assert(std::is_rvalue_reference_v<decltype(value)>);
@ -40,7 +40,7 @@ namespace Nz
} }
template<typename F> 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>>>; using ReleaseFunctor = ReleasableLambda<std::remove_cv_t<std::remove_reference_t<F>>>;
@ -95,13 +95,13 @@ namespace Nz
template<typename T> template<typename T>
template<typename U> template<typename U>
TransientResources::ReleasableLambda<T>::ReleasableLambda(U&& lambda) : RenderResources::ReleasableLambda<T>::ReleasableLambda(U&& lambda) :
m_lambda(std::forward<U>(lambda)) m_lambda(std::forward<U>(lambda))
{ {
} }
template<typename T> template<typename T>
void TransientResources::ReleasableLambda<T>::Release() void RenderResources::ReleasableLambda<T>::Release()
{ {
m_lambda(); m_lambda();
} }

View File

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

View File

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

View File

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

View File

@ -31,7 +31,7 @@ namespace Nz
inline Vk::Fence& GetInFlightFence(); inline Vk::Fence& GetInFlightFence();
inline Vk::Semaphore& GetImageAvailableSemaphore(); inline Vk::Semaphore& GetImageAvailableSemaphore();
inline UInt32 GetImageIndex(); UInt32 GetImageIndex() const override;
inline Vk::Semaphore& GetRenderFinishedSemaphore(); inline Vk::Semaphore& GetRenderFinishedSemaphore();
VulkanUploadPool& GetUploadPool() override; VulkanUploadPool& GetUploadPool() override;

View File

@ -16,11 +16,6 @@ namespace Nz
return m_imageAvailableSemaphore; return m_imageAvailableSemaphore;
} }
inline UInt32 VulkanRenderImage::GetImageIndex()
{
return m_imageIndex;
}
inline Vk::Semaphore& VulkanRenderImage::GetRenderFinishedSemaphore() inline Vk::Semaphore& VulkanRenderImage::GetRenderFinishedSemaphore()
{ {
return m_renderFinishedSemaphore; return m_renderFinishedSemaphore;

View File

@ -57,6 +57,7 @@ namespace Nz
PresentMode GetPresentMode() const override; PresentMode GetPresentMode() const override;
PresentModeFlags GetSupportedPresentModes() const override; PresentModeFlags GetSupportedPresentModes() const override;
inline const Vk::Swapchain& GetSwapchain() const; inline const Vk::Swapchain& GetSwapchain() const;
RenderResources& GetTransientResources() override;
void NotifyResize(const Vector2ui& newSize) override; void NotifyResize(const Vector2ui& newSize) override;
@ -64,8 +65,6 @@ namespace Nz
void SetPresentMode(PresentMode presentMode) override; void SetPresentMode(PresentMode presentMode) override;
TransientResources& Transient() override;
VulkanSwapchain& operator=(const VulkanSwapchain&) = delete; VulkanSwapchain& operator=(const VulkanSwapchain&) = delete;
VulkanSwapchain& operator=(VulkanSwapchain&&) = delete; VulkanSwapchain& operator=(VulkanSwapchain&&) = delete;

View File

@ -20,7 +20,7 @@ namespace Nz
m_commandPool = renderDevice->InstantiateCommandPool(QueueType::Graphics); m_commandPool = renderDevice->InstantiateCommandPool(QueueType::Graphics);
} }
void BakedFrameGraph::Execute(RenderFrame& renderFrame) void BakedFrameGraph::Execute(RenderResources& renderResources)
{ {
for (auto& passData : m_passes) for (auto& passData : m_passes)
{ {
@ -35,7 +35,7 @@ namespace Nz
case FramePassExecution::Skip: case FramePassExecution::Skip:
if (passData.commandBuffer) if (passData.commandBuffer)
{ {
renderFrame.PushForRelease(std::move(passData.commandBuffer)); renderResources.PushForRelease(std::move(passData.commandBuffer));
passData.commandBuffer.reset(); passData.commandBuffer.reset();
} }
continue; //< Skip the pass continue; //< Skip the pass
@ -50,7 +50,7 @@ namespace Nz
continue; continue;
if (passData.commandBuffer) if (passData.commandBuffer)
renderFrame.PushForRelease(std::move(passData.commandBuffer)); renderResources.PushForRelease(std::move(passData.commandBuffer));
passData.commandBuffer = m_commandPool->BuildCommandBuffer([&](CommandBufferBuilder& builder) passData.commandBuffer = m_commandPool->BuildCommandBuffer([&](CommandBufferBuilder& builder)
{ {
@ -66,9 +66,9 @@ namespace Nz
builder.BeginDebugRegion(passData.name, Color::Green()); builder.BeginDebugRegion(passData.name, Color::Green());
FramePassEnvironment env{ FramePassEnvironment env{
*this, .frameGraph = *this,
passData.renderRect, .renderResources = renderResources,
renderFrame .renderRect = passData.renderRect
}; };
bool first = true; bool first = true;
@ -95,7 +95,7 @@ namespace Nz
for (auto& passData : m_passes) for (auto& passData : m_passes)
{ {
if (passData.commandBuffer) if (passData.commandBuffer)
renderFrame.SubmitCommandBuffer(passData.commandBuffer.get(), QueueType::Graphics); renderResources.SubmitCommandBuffer(passData.commandBuffer.get(), QueueType::Graphics);
} }
} }
@ -127,7 +127,7 @@ namespace Nz
return m_passes[physicalPassIndex].renderPass; return m_passes[physicalPassIndex].renderPass;
} }
bool BakedFrameGraph::Resize(RenderFrame& renderFrame, std::span<Vector2ui> viewerTargetSizes) bool BakedFrameGraph::Resize(RenderResources& renderResources, std::span<Vector2ui> viewerTargetSizes)
{ {
if (std::equal(m_viewerSizes.begin(), m_viewerSizes.end(), viewerTargetSizes.begin(), viewerTargetSizes.end())) if (std::equal(m_viewerSizes.begin(), m_viewerSizes.end(), viewerTargetSizes.begin(), viewerTargetSizes.end()))
return false; return false;
@ -159,10 +159,10 @@ namespace Nz
for (auto& passData : m_passes) for (auto& passData : m_passes)
{ {
if (passData.commandBuffer) if (passData.commandBuffer)
renderFrame.PushForRelease(std::move(passData.commandBuffer)); renderResources.PushForRelease(std::move(passData.commandBuffer));
if (passData.framebuffer) if (passData.framebuffer)
renderFrame.PushForRelease(std::move(passData.framebuffer)); renderResources.PushForRelease(std::move(passData.framebuffer));
} }
for (auto& textureData : m_textures) for (auto& textureData : m_textures)
@ -177,7 +177,7 @@ namespace Nz
continue; continue;
// Dimensions changed, recreated texture // Dimensions changed, recreated texture
renderFrame.PushForRelease(std::move(textureData.texture)); renderResources.PushForRelease(std::move(textureData.texture));
} }
for (auto& textureData : m_textures) for (auto& textureData : m_textures)

View File

@ -16,7 +16,7 @@ namespace Nz
{ {
DebugDrawer& debugDrawer = m_pipeline.GetDebugDrawer(); DebugDrawer& debugDrawer = m_pipeline.GetDebugDrawer();
debugDrawer.SetViewerData(m_viewer->GetViewerInstance().GetViewProjMatrix()); debugDrawer.SetViewerData(m_viewer->GetViewerInstance().GetViewProjMatrix());
debugDrawer.Prepare(frameData.renderFrame); debugDrawer.Prepare(frameData.renderResources);
} }
FramePass& DebugDrawPipelinePass::RegisterToFrameGraph(FrameGraph& frameGraph, const PassInputOuputs& inputOuputs) FramePass& DebugDrawPipelinePass::RegisterToFrameGraph(FrameGraph& frameGraph, const PassInputOuputs& inputOuputs)

View File

@ -20,7 +20,7 @@ namespace Nz
{ {
if (m_lastVisibilityHash != frameData.visibilityHash || m_rebuildElements) //< FIXME if (m_lastVisibilityHash != frameData.visibilityHash || m_rebuildElements) //< FIXME
{ {
frameData.renderFrame.PushForRelease(std::move(m_renderElements)); frameData.renderResources.PushForRelease(std::move(m_renderElements));
m_renderElements.clear(); m_renderElements.clear();
for (const auto& renderableData : frameData.visibleRenderables) for (const auto& renderableData : frameData.visibleRenderables)
@ -67,7 +67,7 @@ namespace Nz
m_elementRendererData[elementType] = elementRenderer.InstanciateData(); m_elementRendererData[elementType] = elementRenderer.InstanciateData();
} }
elementRenderer.Reset(*m_elementRendererData[elementType], frameData.renderFrame); elementRenderer.Reset(*m_elementRendererData[elementType], frameData.renderResources);
}); });
const auto& viewerInstance = m_viewer->GetViewerInstance(); const auto& viewerInstance = m_viewer->GetViewerInstance();
@ -78,12 +78,12 @@ namespace Nz
{ {
ElementRenderer& elementRenderer = m_elementRegistry.GetElementRenderer(elementType); ElementRenderer& elementRenderer = m_elementRegistry.GetElementRenderer(elementType);
elementRenderer.Prepare(viewerInstance, *m_elementRendererData[elementType], frameData.renderFrame, elementCount, elements, SparsePtr(&defaultRenderStates, 0)); elementRenderer.Prepare(viewerInstance, *m_elementRendererData[elementType], frameData.renderResources, elementCount, elements, SparsePtr(&defaultRenderStates, 0));
}); });
m_elementRegistry.ForEachElementRenderer([&](std::size_t elementType, ElementRenderer& elementRenderer) m_elementRegistry.ForEachElementRenderer([&](std::size_t elementType, ElementRenderer& elementRenderer)
{ {
elementRenderer.PrepareEnd(frameData.renderFrame, *m_elementRendererData[elementType]); elementRenderer.PrepareEnd(frameData.renderResources, *m_elementRendererData[elementType]);
}); });
m_rebuildCommandBuffer = true; m_rebuildCommandBuffer = true;

View File

@ -40,7 +40,7 @@ namespace Nz
UpdatePerViewerStatus(true); UpdatePerViewerStatus(true);
} }
void DirectionalLightShadowData::PrepareRendering(RenderFrame& renderFrame, const AbstractViewer* viewer) void DirectionalLightShadowData::PrepareRendering(RenderResources& renderResources, const AbstractViewer* viewer)
{ {
assert(viewer); assert(viewer);
PerViewerData& viewerData = *Retrieve(m_viewerData, viewer); PerViewerData& viewerData = *Retrieve(m_viewerData, viewer);
@ -121,7 +121,7 @@ namespace Nz
FramePipelinePass::FrameData passData = { FramePipelinePass::FrameData passData = {
nullptr, nullptr,
frustum, frustum,
renderFrame, renderResources,
visibleRenderables, visibleRenderables,
visibilityHash visibilityHash
}; };

View File

@ -9,15 +9,15 @@ namespace Nz
{ {
ElementRenderer::~ElementRenderer() = default; ElementRenderer::~ElementRenderer() = default;
void ElementRenderer::Prepare(const ViewerInstance& /*viewerInstance*/, ElementRendererData& /*rendererData*/, RenderFrame& /*currentFrame*/, std::size_t /*elementCount*/, const Pointer<const RenderElement>* /*elements*/, SparsePtr<const RenderStates> /*renderStates*/) void ElementRenderer::Prepare(const ViewerInstance& /*viewerInstance*/, ElementRendererData& /*rendererData*/, RenderResources& /*renderResources*/, std::size_t /*elementCount*/, const Pointer<const RenderElement>* /*elements*/, SparsePtr<const RenderStates> /*renderStates*/)
{ {
} }
void ElementRenderer::PrepareEnd(RenderFrame& /*currentFrame*/, ElementRendererData& /*rendererData*/) void ElementRenderer::PrepareEnd(RenderResources& /*renderResources*/, ElementRendererData& /*rendererData*/)
{ {
} }
void ElementRenderer::Reset(ElementRendererData& /*rendererData*/, RenderFrame& /*currentFrame*/) void ElementRenderer::Reset(ElementRendererData& /*rendererData*/, RenderResources& /*renderResources*/)
{ {
} }

View File

@ -341,30 +341,28 @@ namespace Nz
return lightShadowData->RetrieveLightShadowmap(m_bakedFrameGraph, viewer); return lightShadowData->RetrieveLightShadowmap(m_bakedFrameGraph, viewer);
} }
void ForwardFramePipeline::Render(RenderFrame& renderFrame) void ForwardFramePipeline::Render(RenderResources& renderResources)
{ {
m_currentRenderFrame = &renderFrame;
Graphics* graphics = Graphics::Instance(); Graphics* graphics = Graphics::Instance();
// Destroy instances at the end of the frame // Destroy instances at the end of the frame
for (std::size_t skeletonInstanceIndex : m_removedSkeletonInstances.IterBits()) for (std::size_t skeletonInstanceIndex : m_removedSkeletonInstances.IterBits())
{ {
renderFrame.PushForRelease(std::move(*m_skeletonInstances.RetrieveFromIndex(skeletonInstanceIndex))); renderResources.PushForRelease(std::move(*m_skeletonInstances.RetrieveFromIndex(skeletonInstanceIndex)));
m_skeletonInstances.Free(skeletonInstanceIndex); m_skeletonInstances.Free(skeletonInstanceIndex);
} }
m_removedSkeletonInstances.Clear(); m_removedSkeletonInstances.Clear();
for (std::size_t viewerIndex : m_removedViewerInstances.IterBits()) for (std::size_t viewerIndex : m_removedViewerInstances.IterBits())
{ {
renderFrame.PushForRelease(std::move(*m_viewerPool.RetrieveFromIndex(viewerIndex))); renderResources.PushForRelease(std::move(*m_viewerPool.RetrieveFromIndex(viewerIndex)));
m_viewerPool.Free(viewerIndex); m_viewerPool.Free(viewerIndex);
} }
m_removedViewerInstances.Clear(); m_removedViewerInstances.Clear();
for (std::size_t worldInstanceIndex : m_removedWorldInstances.IterBits()) for (std::size_t worldInstanceIndex : m_removedWorldInstances.IterBits())
{ {
renderFrame.PushForRelease(std::move(*m_worldInstances.RetrieveFromIndex(worldInstanceIndex))); renderResources.PushForRelease(std::move(*m_worldInstances.RetrieveFromIndex(worldInstanceIndex)));
m_worldInstances.Free(worldInstanceIndex); m_worldInstances.Free(worldInstanceIndex);
} }
m_removedWorldInstances.Clear(); m_removedWorldInstances.Clear();
@ -372,7 +370,7 @@ namespace Nz
bool frameGraphInvalidated = false; bool frameGraphInvalidated = false;
if (m_rebuildFrameGraph) if (m_rebuildFrameGraph)
{ {
renderFrame.PushForRelease(std::move(m_bakedFrameGraph)); renderResources.PushForRelease(std::move(m_bakedFrameGraph));
m_bakedFrameGraph = BuildFrameGraph(); m_bakedFrameGraph = BuildFrameGraph();
frameGraphInvalidated = true; frameGraphInvalidated = true;
} }
@ -384,7 +382,7 @@ namespace Nz
viewerSizes.emplace_back(Vector2i(viewport.width, viewport.height)); viewerSizes.emplace_back(Vector2i(viewport.width, viewport.height));
} }
frameGraphInvalidated |= m_bakedFrameGraph.Resize(renderFrame, viewerSizes); frameGraphInvalidated |= m_bakedFrameGraph.Resize(renderResources, viewerSizes);
// Find active lights (i.e. visible in any frustum) // Find active lights (i.e. visible in any frustum)
m_activeLights.Clear(); m_activeLights.Clear();
@ -420,7 +418,7 @@ namespace Nz
{ {
LightData* lightData = m_lightPool.RetrieveFromIndex(i); LightData* lightData = m_lightPool.RetrieveFromIndex(i);
if (!lightData->shadowData->IsPerViewer()) if (!lightData->shadowData->IsPerViewer())
lightData->shadowData->PrepareRendering(renderFrame, nullptr); lightData->shadowData->PrepareRendering(renderResources, nullptr);
} }
// Viewer handling (second pass) // Viewer handling (second pass)
@ -436,7 +434,7 @@ namespace Nz
{ {
LightData* lightData = m_lightPool.RetrieveFromIndex(lightIndex); LightData* lightData = m_lightPool.RetrieveFromIndex(lightIndex);
if (lightData->shadowData && lightData->shadowData->IsPerViewer() && (renderMask & lightData->renderMask) != 0) if (lightData->shadowData && lightData->shadowData->IsPerViewer() && (renderMask & lightData->renderMask) != 0)
lightData->shadowData->PrepareRendering(renderFrame, viewerData.viewer); lightData->shadowData->PrepareRendering(renderResources, viewerData.viewer);
} }
// Frustum culling // Frustum culling
@ -446,7 +444,7 @@ namespace Nz
FramePipelinePass::FrameData passData = { FramePipelinePass::FrameData passData = {
&viewerData.frame.visibleLights, &viewerData.frame.visibleLights,
viewerData.frame.frustum, viewerData.frame.frustum,
renderFrame, renderResources,
visibleRenderables, visibleRenderables,
visibilityHash visibilityHash
}; };
@ -464,7 +462,7 @@ namespace Nz
continue; continue;
if (viewerData.blitShaderBinding) if (viewerData.blitShaderBinding)
renderFrame.PushForRelease(std::move(viewerData.blitShaderBinding)); renderResources.PushForRelease(std::move(viewerData.blitShaderBinding));
viewerData.blitShaderBinding = graphics->GetBlitPipelineLayout()->AllocateShaderBinding(0); viewerData.blitShaderBinding = graphics->GetBlitPipelineLayout()->AllocateShaderBinding(0);
viewerData.blitShaderBinding->Update({ viewerData.blitShaderBinding->Update({
@ -480,33 +478,33 @@ namespace Nz
} }
// Update UBOs and materials // Update UBOs and materials
renderFrame.Execute([&](CommandBufferBuilder& builder) renderResources.Execute([&](CommandBufferBuilder& builder)
{ {
builder.BeginDebugRegion("CPU to GPU transfers", Color::Yellow()); builder.BeginDebugRegion("CPU to GPU transfers", Color::Yellow());
{ {
builder.PreTransferBarrier(); builder.PreTransferBarrier();
for (TransferInterface* transferInterface : m_transferSet) for (TransferInterface* transferInterface : m_transferSet)
transferInterface->OnTransfer(renderFrame, builder); transferInterface->OnTransfer(renderResources, builder);
m_transferSet.clear(); m_transferSet.clear();
OnTransfer(this, renderFrame, builder); OnTransfer(this, renderResources, builder);
builder.PostTransferBarrier(); builder.PostTransferBarrier();
} }
builder.EndDebugRegion(); builder.EndDebugRegion();
}, QueueType::Transfer); }, QueueType::Transfer);
m_bakedFrameGraph.Execute(renderFrame); m_bakedFrameGraph.Execute(renderResources);
m_rebuildFrameGraph = false; m_rebuildFrameGraph = false;
// Final blit (TODO: Make part of frame graph?) // Final blit (TODO: Make part of frame graph?)
for (auto&& [renderTargetPtr, renderTargetData] : m_renderTargets) for (auto&& [renderTargetPtr, renderTargetData] : m_renderTargets)
renderTargetPtr->OnRenderEnd(renderFrame, m_bakedFrameGraph, renderTargetData.finalAttachment); renderTargetPtr->OnRenderEnd(renderResources, m_bakedFrameGraph, renderTargetData.finalAttachment);
// reset at the end instead of the beginning so debug draw can be used before calling this method // reset at the end instead of the beginning so debug draw can be used before calling this method
DebugDrawer& debugDrawer = GetDebugDrawer(); DebugDrawer& debugDrawer = GetDebugDrawer();
debugDrawer.Reset(renderFrame); debugDrawer.Reset(renderResources);
} }
void ForwardFramePipeline::UnregisterLight(std::size_t lightIndex) void ForwardFramePipeline::UnregisterLight(std::size_t lightIndex)

View File

@ -50,7 +50,7 @@ namespace Nz
if (m_lastVisibilityHash != frameData.visibilityHash || m_rebuildElements) //< FIXME if (m_lastVisibilityHash != frameData.visibilityHash || m_rebuildElements) //< FIXME
{ {
frameData.renderFrame.PushForRelease(std::move(m_renderElements)); frameData.renderResources.PushForRelease(std::move(m_renderElements));
m_renderElements.clear(); m_renderElements.clear();
for (const auto& renderableData : frameData.visibleRenderables) for (const auto& renderableData : frameData.visibleRenderables)
@ -85,7 +85,7 @@ namespace Nz
return element->ComputeSortingScore(frameData.frustum, m_renderQueueRegistry); return element->ComputeSortingScore(frameData.frustum, m_renderQueueRegistry);
}); });
PrepareLights(frameData.renderFrame, frameData.frustum, *frameData.visibleLights); PrepareLights(frameData.renderResources, frameData.frustum, *frameData.visibleLights);
if (m_rebuildElements) if (m_rebuildElements)
{ {
@ -97,7 +97,7 @@ namespace Nz
if (!m_elementRendererData[elementType]) if (!m_elementRendererData[elementType])
m_elementRendererData[elementType] = elementRenderer.InstanciateData(); m_elementRendererData[elementType] = elementRenderer.InstanciateData();
elementRenderer.Reset(*m_elementRendererData[elementType], frameData.renderFrame); elementRenderer.Reset(*m_elementRendererData[elementType], frameData.renderResources);
}); });
const auto& viewerInstance = m_viewer->GetViewerInstance(); const auto& viewerInstance = m_viewer->GetViewerInstance();
@ -105,12 +105,12 @@ namespace Nz
m_elementRegistry.ProcessRenderQueue(m_renderQueue, [&](std::size_t elementType, const Pointer<const RenderElement>* elements, std::size_t elementCount) m_elementRegistry.ProcessRenderQueue(m_renderQueue, [&](std::size_t elementType, const Pointer<const RenderElement>* elements, std::size_t elementCount)
{ {
ElementRenderer& elementRenderer = m_elementRegistry.GetElementRenderer(elementType); ElementRenderer& elementRenderer = m_elementRegistry.GetElementRenderer(elementType);
elementRenderer.Prepare(viewerInstance, *m_elementRendererData[elementType], frameData.renderFrame, elementCount, elements, SparsePtr(&m_renderState, 0)); elementRenderer.Prepare(viewerInstance, *m_elementRendererData[elementType], frameData.renderResources, elementCount, elements, SparsePtr(&m_renderState, 0));
}); });
m_elementRegistry.ForEachElementRenderer([&](std::size_t elementType, ElementRenderer& elementRenderer) m_elementRegistry.ForEachElementRenderer([&](std::size_t elementType, ElementRenderer& elementRenderer)
{ {
elementRenderer.PrepareEnd(frameData.renderFrame, *m_elementRendererData[elementType]); elementRenderer.PrepareEnd(frameData.renderResources, *m_elementRendererData[elementType]);
}); });
m_rebuildCommandBuffer = true; m_rebuildCommandBuffer = true;
@ -202,7 +202,7 @@ namespace Nz
} }
} }
void ForwardPipelinePass::OnTransfer(RenderFrame& /*renderFrame*/, CommandBufferBuilder& builder) void ForwardPipelinePass::OnTransfer(RenderResources& /*renderFrame*/, CommandBufferBuilder& builder)
{ {
assert(m_pendingLightUploadAllocation); assert(m_pendingLightUploadAllocation);
builder.CopyBuffer(*m_pendingLightUploadAllocation, RenderBufferView(m_lightDataBuffer.get())); builder.CopyBuffer(*m_pendingLightUploadAllocation, RenderBufferView(m_lightDataBuffer.get()));
@ -315,7 +315,7 @@ namespace Nz
} }
} }
void ForwardPipelinePass::PrepareLights(RenderFrame& renderFrame, const Frustumf& frustum, const Bitset<UInt64>& visibleLights) void ForwardPipelinePass::PrepareLights(RenderResources& renderResources, const Frustumf& frustum, const Bitset<UInt64>& visibleLights)
{ {
// Select lights // Select lights
m_directionalLights.clear(); m_directionalLights.clear();
@ -352,7 +352,7 @@ namespace Nz
return lhs.contributionScore < rhs.contributionScore; return lhs.contributionScore < rhs.contributionScore;
}); });
UploadPool& uploadPool = renderFrame.GetUploadPool(); UploadPool& uploadPool = renderResources.GetUploadPool();
auto& lightAllocation = uploadPool.Allocate(m_lightDataBuffer->GetSize()); auto& lightAllocation = uploadPool.Allocate(m_lightDataBuffer->GetSize());
PrepareDirectionalLights(lightAllocation.mappedPtr); PrepareDirectionalLights(lightAllocation.mappedPtr);

View File

@ -224,9 +224,9 @@ namespace Nz
return HasPass(passIndex); return HasPass(passIndex);
} }
void MaterialInstance::OnTransfer(RenderFrame& renderFrame, CommandBufferBuilder& builder) void MaterialInstance::OnTransfer(RenderResources& renderResources, CommandBufferBuilder& builder)
{ {
UploadPool& uploadPool = renderFrame.GetUploadPool(); UploadPool& uploadPool = renderResources.GetUploadPool();
for (UniformBuffer& uniformBuffer : m_uniformBuffers) for (UniformBuffer& uniformBuffer : m_uniformBuffers)
{ {
if (!uniformBuffer.dataInvalidated) if (!uniformBuffer.dataInvalidated)

View File

@ -99,7 +99,7 @@ namespace Nz
}); });
} }
void PointLightShadowData::PrepareRendering(RenderFrame& renderFrame, [[maybe_unused]] const AbstractViewer* viewer) void PointLightShadowData::PrepareRendering(RenderResources& renderResources, [[maybe_unused]] const AbstractViewer* viewer)
{ {
assert(viewer == nullptr); assert(viewer == nullptr);
@ -115,7 +115,7 @@ namespace Nz
FramePipelinePass::FrameData passData = { FramePipelinePass::FrameData passData = {
nullptr, nullptr,
frustum, frustum,
renderFrame, renderResources,
visibleRenderables, visibleRenderables,
visibilityHash visibilityHash
}; };

View File

@ -43,7 +43,7 @@ namespace Nz
if (m_nextRenderPipeline) if (m_nextRenderPipeline)
{ {
if (m_renderPipeline) if (m_renderPipeline)
frameData.renderFrame.PushForRelease(std::move(m_renderPipeline)); frameData.renderResources.PushForRelease(std::move(m_renderPipeline));
m_renderPipeline = std::move(m_nextRenderPipeline); m_renderPipeline = std::move(m_nextRenderPipeline);
m_rebuildFramePass = true; m_rebuildFramePass = true;
@ -78,7 +78,7 @@ namespace Nz
postProcess.SetCommandCallback([this, inputColorBufferIndex](CommandBufferBuilder& builder, const FramePassEnvironment& env) postProcess.SetCommandCallback([this, inputColorBufferIndex](CommandBufferBuilder& builder, const FramePassEnvironment& env)
{ {
if (m_shaderBinding) if (m_shaderBinding)
env.renderFrame.PushForRelease(std::move(m_shaderBinding)); env.renderResources.PushForRelease(std::move(m_shaderBinding));
auto& samplerCache = Graphics::Instance()->GetSamplerCache(); auto& samplerCache = Graphics::Instance()->GetSamplerCache();

View File

@ -20,7 +20,7 @@ namespace Nz
graph.BindExternalTexture(attachmentIndex, m_targetTexture); graph.BindExternalTexture(attachmentIndex, m_targetTexture);
} }
void RenderTexture::OnRenderEnd(RenderFrame& /*renderFrame*/, const BakedFrameGraph& /*frameGraph*/, std::size_t /*finalAttachment*/) const void RenderTexture::OnRenderEnd(RenderResources& /*renderFrame*/, const BakedFrameGraph& /*frameGraph*/, std::size_t /*finalAttachment*/) const
{ {
} }

View File

@ -16,14 +16,14 @@ namespace Nz
graph.AddOutput(attachmentIndex); graph.AddOutput(attachmentIndex);
} }
void RenderTextureBlit::OnRenderEnd(RenderFrame& renderFrame, const BakedFrameGraph& frameGraph, std::size_t finalAttachment) const void RenderTextureBlit::OnRenderEnd(RenderResources& resources, const BakedFrameGraph& frameGraph, std::size_t finalAttachment) const
{ {
const std::shared_ptr<Texture>& sourceTexture = frameGraph.GetAttachmentTexture(finalAttachment); const std::shared_ptr<Texture>& sourceTexture = frameGraph.GetAttachmentTexture(finalAttachment);
Vector2ui sourceTextureSize = Vector2ui(sourceTexture->GetSize()); Vector2ui sourceTextureSize = Vector2ui(sourceTexture->GetSize());
Vector2ui targetTextureSize = Vector2ui(m_targetTexture->GetSize()); Vector2ui targetTextureSize = Vector2ui(m_targetTexture->GetSize());
renderFrame.Execute([&](CommandBufferBuilder& builder) resources.Execute([&](CommandBufferBuilder& builder)
{ {
builder.BeginDebugRegion("Blit to texture", Color::Blue()); builder.BeginDebugRegion("Blit to texture", Color::Blue());
{ {

View File

@ -36,19 +36,19 @@ namespace Nz
graph.AddOutput(attachmentIndex); graph.AddOutput(attachmentIndex);
} }
void RenderWindow::OnRenderEnd(RenderFrame& renderFrame, const BakedFrameGraph& frameGraph, std::size_t finalAttachment) const void RenderWindow::OnRenderEnd(RenderResources& renderResources, const BakedFrameGraph& frameGraph, std::size_t finalAttachment) const
{ {
const std::shared_ptr<Texture>& texture = frameGraph.GetAttachmentTexture(finalAttachment); const std::shared_ptr<Texture>& texture = frameGraph.GetAttachmentTexture(finalAttachment);
Vector2ui textureSize = Vector2ui(texture->GetSize()); Vector2ui textureSize = Vector2ui(texture->GetSize());
Boxui blitRegion(0, 0, 0, textureSize.x, textureSize.y, 1); Boxui blitRegion(0, 0, 0, textureSize.x, textureSize.y, 1);
renderFrame.Execute([&](CommandBufferBuilder& builder) renderResources.Execute([&](CommandBufferBuilder& builder)
{ {
builder.BeginDebugRegion("Blit to swapchain", Color::Blue()); builder.BeginDebugRegion("Blit to swapchain", Color::Blue());
{ {
builder.TextureBarrier(PipelineStage::ColorOutput, PipelineStage::Transfer, MemoryAccess::ColorWrite, MemoryAccess::TransferRead, TextureLayout::ColorOutput, TextureLayout::TransferSource, *texture); builder.TextureBarrier(PipelineStage::ColorOutput, PipelineStage::Transfer, MemoryAccess::ColorWrite, MemoryAccess::TransferRead, TextureLayout::ColorOutput, TextureLayout::TransferSource, *texture);
builder.BlitTextureToSwapchain(*texture, blitRegion, TextureLayout::TransferSource, *m_swapchain, renderFrame.GetFramebufferIndex()); builder.BlitTextureToSwapchain(*texture, blitRegion, TextureLayout::TransferSource, *m_swapchain, renderResources.GetImageIndex());
} }
builder.EndDebugRegion(); builder.EndDebugRegion();
}, QueueType::Graphics); }, QueueType::Graphics);

View File

@ -42,12 +42,12 @@ namespace Nz
}); });
} }
void SkeletonInstance::OnTransfer(RenderFrame& renderFrame, CommandBufferBuilder& builder) void SkeletonInstance::OnTransfer(RenderResources& renderResources, CommandBufferBuilder& builder)
{ {
if (!m_dataInvalided) if (!m_dataInvalided)
return; return;
auto& allocation = renderFrame.GetUploadPool().Allocate(m_skeletalDataBuffer->GetSize()); auto& allocation = renderResources.GetUploadPool().Allocate(m_skeletalDataBuffer->GetSize());
Matrix4f* matrices = AccessByOffset<Matrix4f*>(allocation.mappedPtr, PredefinedSkeletalOffsets.jointMatricesOffset); Matrix4f* matrices = AccessByOffset<Matrix4f*>(allocation.mappedPtr, PredefinedSkeletalOffsets.jointMatricesOffset);
for (std::size_t i = 0; i < m_skeleton->GetJointCount(); ++i) for (std::size_t i = 0; i < m_skeleton->GetJointCount(); ++i)

View File

@ -61,7 +61,7 @@ namespace Nz
}); });
} }
void SpotLightShadowData::PrepareRendering(RenderFrame& renderFrame, [[maybe_unused]] const AbstractViewer* viewer) void SpotLightShadowData::PrepareRendering(RenderResources& renderResources, [[maybe_unused]] const AbstractViewer* viewer)
{ {
assert(viewer == nullptr); assert(viewer == nullptr);
@ -75,7 +75,7 @@ namespace Nz
FramePipelinePass::FrameData passData = { FramePipelinePass::FrameData passData = {
nullptr, nullptr,
frustum, frustum,
renderFrame, renderResources,
visibleRenderables, visibleRenderables,
visibilityHash visibilityHash
}; };

View File

@ -56,7 +56,7 @@ namespace Nz
return std::make_unique<SpriteChainRendererData>(); return std::make_unique<SpriteChainRendererData>();
} }
void SpriteChainRenderer::Prepare(const ViewerInstance& viewerInstance, ElementRendererData& rendererData, RenderFrame& currentFrame, std::size_t elementCount, const Pointer<const RenderElement>* elements, SparsePtr<const RenderStates> renderStates) void SpriteChainRenderer::Prepare(const ViewerInstance& viewerInstance, ElementRendererData& rendererData, RenderResources& renderResources, std::size_t elementCount, const Pointer<const RenderElement>* elements, SparsePtr<const RenderStates> renderStates)
{ {
Graphics* graphics = Graphics::Instance(); Graphics* graphics = Graphics::Instance();
@ -132,7 +132,7 @@ namespace Nz
{ {
if (!m_pendingData.currentAllocation) if (!m_pendingData.currentAllocation)
{ {
m_pendingData.currentAllocation = &currentFrame.GetUploadPool().Allocate(m_maxVertexBufferSize); m_pendingData.currentAllocation = &renderResources.GetUploadPool().Allocate(m_maxVertexBufferSize);
m_pendingData.currentAllocationMemPtr = static_cast<UInt8*>(m_pendingData.currentAllocation->mappedPtr); m_pendingData.currentAllocationMemPtr = static_cast<UInt8*>(m_pendingData.currentAllocation->mappedPtr);
std::shared_ptr<RenderBuffer> vertexBuffer; std::shared_ptr<RenderBuffer> vertexBuffer;
@ -258,13 +258,13 @@ namespace Nz
data.drawCallPerElement[firstSpriteChain] = SpriteChainRendererData::DrawCallIndices{ oldDrawCallCount, drawCallCount }; data.drawCallPerElement[firstSpriteChain] = SpriteChainRendererData::DrawCallIndices{ oldDrawCallCount, drawCallCount };
} }
void SpriteChainRenderer::PrepareEnd(RenderFrame& currentFrame, ElementRendererData& /*rendererData*/) void SpriteChainRenderer::PrepareEnd(RenderResources& renderResources, ElementRendererData& /*rendererData*/)
{ {
Flush(); Flush();
if (!m_pendingCopies.empty()) if (!m_pendingCopies.empty())
{ {
currentFrame.Execute([&](CommandBufferBuilder& builder) renderResources.Execute([&](CommandBufferBuilder& builder)
{ {
for (auto& copy : m_pendingCopies) for (auto& copy : m_pendingCopies)
builder.CopyBuffer(*copy.allocation, copy.targetBuffer, copy.size); builder.CopyBuffer(*copy.allocation, copy.targetBuffer, copy.size);
@ -331,13 +331,13 @@ namespace Nz
} }
} }
void SpriteChainRenderer::Reset(ElementRendererData& rendererData, RenderFrame& currentFrame) void SpriteChainRenderer::Reset(ElementRendererData& rendererData, RenderResources& renderResources)
{ {
auto& data = static_cast<SpriteChainRendererData&>(rendererData); auto& data = static_cast<SpriteChainRendererData&>(rendererData);
for (auto& vertexBufferPtr : data.vertexBuffers) for (auto& vertexBufferPtr : data.vertexBuffers)
{ {
currentFrame.PushReleaseCallback([pool = m_vertexBufferPool, vertexBuffer = std::move(vertexBufferPtr)]() mutable renderResources.PushReleaseCallback([pool = m_vertexBufferPool, vertexBuffer = std::move(vertexBufferPtr)]() mutable
{ {
pool->vertexBuffers.push_back(std::move(vertexBuffer)); pool->vertexBuffers.push_back(std::move(vertexBuffer));
}); });
@ -345,7 +345,7 @@ namespace Nz
data.vertexBuffers.clear(); data.vertexBuffers.clear();
for (auto& shaderBinding : data.shaderBindings) for (auto& shaderBinding : data.shaderBindings)
currentFrame.PushForRelease(std::move(shaderBinding)); renderResources.PushForRelease(std::move(shaderBinding));
data.shaderBindings.clear(); data.shaderBindings.clear();
data.drawCalls.clear(); data.drawCalls.clear();

View File

@ -24,7 +24,7 @@ namespace Nz
return std::make_unique<SubmeshRendererData>(); return std::make_unique<SubmeshRendererData>();
} }
void SubmeshRenderer::Prepare(const ViewerInstance& viewerInstance, ElementRendererData& rendererData, RenderFrame& /*currentFrame*/, std::size_t elementCount, const Pointer<const RenderElement>* elements, SparsePtr<const RenderStates> renderStates) void SubmeshRenderer::Prepare(const ViewerInstance& viewerInstance, ElementRendererData& rendererData, RenderResources& /*renderResources*/, std::size_t elementCount, const Pointer<const RenderElement>* elements, SparsePtr<const RenderStates> renderStates)
{ {
Graphics* graphics = Graphics::Instance(); Graphics* graphics = Graphics::Instance();
@ -346,12 +346,12 @@ namespace Nz
} }
} }
void SubmeshRenderer::Reset(ElementRendererData& rendererData, RenderFrame& currentFrame) void SubmeshRenderer::Reset(ElementRendererData& rendererData, RenderResources& renderResources)
{ {
auto& data = static_cast<SubmeshRendererData&>(rendererData); auto& data = static_cast<SubmeshRendererData&>(rendererData);
for (auto& shaderBinding : data.shaderBindings) for (auto& shaderBinding : data.shaderBindings)
currentFrame.PushForRelease(std::move(shaderBinding)); renderResources.PushForRelease(std::move(shaderBinding));
data.shaderBindings.clear(); data.shaderBindings.clear();
data.drawCalls.clear(); data.drawCalls.clear();

View File

@ -31,14 +31,14 @@ namespace Nz
m_viewerDataBuffer->UpdateDebugName("Viewer data"); m_viewerDataBuffer->UpdateDebugName("Viewer data");
} }
void ViewerInstance::OnTransfer(RenderFrame& renderFrame, CommandBufferBuilder& builder) void ViewerInstance::OnTransfer(RenderResources& renderResources, CommandBufferBuilder& builder)
{ {
if (!m_dataInvalidated) if (!m_dataInvalidated)
return; return;
constexpr auto& viewerDataOffsets = PredefinedViewerOffsets; constexpr auto& viewerDataOffsets = PredefinedViewerOffsets;
auto& allocation = renderFrame.GetUploadPool().Allocate(viewerDataOffsets.totalSize); auto& allocation = renderResources.GetUploadPool().Allocate(viewerDataOffsets.totalSize);
AccessByOffset<Vector3f&>(allocation.mappedPtr, viewerDataOffsets.eyePositionOffset) = m_eyePosition; AccessByOffset<Vector3f&>(allocation.mappedPtr, viewerDataOffsets.eyePositionOffset) = m_eyePosition;
AccessByOffset<Vector2f&>(allocation.mappedPtr, viewerDataOffsets.invTargetSizeOffset) = 1.f / m_targetSize; AccessByOffset<Vector2f&>(allocation.mappedPtr, viewerDataOffsets.invTargetSizeOffset) = 1.f / m_targetSize;
AccessByOffset<Vector2f&>(allocation.mappedPtr, viewerDataOffsets.targetSizeOffset) = m_targetSize; AccessByOffset<Vector2f&>(allocation.mappedPtr, viewerDataOffsets.targetSizeOffset) = m_targetSize;

View File

@ -25,14 +25,14 @@ namespace Nz
m_instanceDataBuffer->UpdateDebugName("Instance data"); m_instanceDataBuffer->UpdateDebugName("Instance data");
} }
void WorldInstance::OnTransfer(RenderFrame& renderFrame, CommandBufferBuilder& builder) void WorldInstance::OnTransfer(RenderResources& renderResources, CommandBufferBuilder& builder)
{ {
if (!m_dataInvalided) if (!m_dataInvalided)
return; return;
constexpr auto& instanceUboOffsets = PredefinedInstanceOffsets; constexpr auto& instanceUboOffsets = PredefinedInstanceOffsets;
auto& allocation = renderFrame.GetUploadPool().Allocate(m_instanceDataBuffer->GetSize()); auto& allocation = renderResources.GetUploadPool().Allocate(m_instanceDataBuffer->GetSize());
AccessByOffset<Matrix4f&>(allocation.mappedPtr, instanceUboOffsets.worldMatrixOffset) = m_worldMatrix; AccessByOffset<Matrix4f&>(allocation.mappedPtr, instanceUboOffsets.worldMatrixOffset) = m_worldMatrix;
AccessByOffset<Matrix4f&>(allocation.mappedPtr, instanceUboOffsets.invWorldMatrixOffset) = m_invWorldMatrix; AccessByOffset<Matrix4f&>(allocation.mappedPtr, instanceUboOffsets.invWorldMatrixOffset) = m_invWorldMatrix;

View File

@ -27,6 +27,11 @@ namespace Nz
commandBuffer.Execute(); commandBuffer.Execute();
} }
UInt32 OpenGLRenderImage::GetImageIndex() const
{
return m_imageIndex;
}
OpenGLUploadPool& OpenGLRenderImage::GetUploadPool() OpenGLUploadPool& OpenGLRenderImage::GetUploadPool()
{ {
return m_uploadPool; return m_uploadPool;

View File

@ -11,9 +11,9 @@
namespace Nz namespace Nz
{ {
OpenGLSwapchain::OpenGLSwapchain(OpenGLDevice& device, WindowHandle windowHandle, const Vector2ui& windowSize, const SwapchainParameters& parameters) : OpenGLSwapchain::OpenGLSwapchain(OpenGLDevice& device, WindowHandle windowHandle, const Vector2ui& windowSize, const SwapchainParameters& parameters) :
m_currentFrame(0),
m_device(device), m_device(device),
m_framebuffer(*this), m_framebuffer(*this),
m_currentImageIndex(0),
m_size(windowSize), m_size(windowSize),
m_sizeInvalidated(false) m_sizeInvalidated(false)
{ {
@ -90,7 +90,10 @@ namespace Nz
bool sizeInvalidated = m_sizeInvalidated; bool sizeInvalidated = m_sizeInvalidated;
m_sizeInvalidated = false; m_sizeInvalidated = false;
return RenderFrame(m_renderImage[m_currentFrame].get(), sizeInvalidated, m_size, 0); OpenGLRenderImage& renderImage = *m_renderImage[m_currentImageIndex];
renderImage.Reset(m_currentImageIndex);
return RenderFrame(&renderImage, sizeInvalidated, m_size);
} }
std::shared_ptr<CommandPool> OpenGLSwapchain::CreateCommandPool(QueueType /*queueType*/) std::shared_ptr<CommandPool> OpenGLSwapchain::CreateCommandPool(QueueType /*queueType*/)
@ -98,10 +101,8 @@ namespace Nz
return std::make_shared<OpenGLCommandPool>(); return std::make_shared<OpenGLCommandPool>();
} }
const OpenGLFramebuffer& OpenGLSwapchain::GetFramebuffer(std::size_t i) const const OpenGLFramebuffer& OpenGLSwapchain::GetFramebuffer(std::size_t /*imageIndex*/) const
{ {
assert(i == 0);
NazaraUnused(i);
return m_framebuffer; return m_framebuffer;
} }
@ -141,7 +142,7 @@ namespace Nz
void OpenGLSwapchain::Present() void OpenGLSwapchain::Present()
{ {
m_context->SwapBuffers(); m_context->SwapBuffers();
m_currentFrame = (m_currentFrame + 1) % m_renderImage.size(); m_currentImageIndex = (m_currentImageIndex + 1) % m_renderImage.size();
} }
void OpenGLSwapchain::SetPresentMode(PresentMode presentMode) void OpenGLSwapchain::SetPresentMode(PresentMode presentMode)
@ -155,8 +156,8 @@ namespace Nz
} }
} }
TransientResources& OpenGLSwapchain::Transient() RenderResources& OpenGLSwapchain::GetTransientResources()
{ {
return *m_renderImage[m_currentFrame]; return *m_renderImage[m_currentImageIndex];
} }
} }

View File

@ -104,9 +104,9 @@ namespace Nz
} }
} }
void DebugDrawer::Prepare(RenderFrame& renderFrame) void DebugDrawer::Prepare(RenderResources& renderResources)
{ {
UploadPool& uploadPool = renderFrame.GetUploadPool(); UploadPool& uploadPool = renderResources.GetUploadPool();
if (!m_lineVertices.empty()) if (!m_lineVertices.empty())
{ {
@ -171,7 +171,7 @@ namespace Nz
if (m_viewerDataUpdated || !m_pendingUploads.empty()) if (m_viewerDataUpdated || !m_pendingUploads.empty())
{ {
renderFrame.Execute([&](CommandBufferBuilder& builder) renderResources.Execute([&](CommandBufferBuilder& builder)
{ {
builder.BeginDebugRegion("Debug drawer upload", Color::Yellow()); builder.BeginDebugRegion("Debug drawer upload", Color::Yellow());
{ {
@ -196,12 +196,12 @@ namespace Nz
m_viewerDataUpdated = false; m_viewerDataUpdated = false;
} }
void DebugDrawer::Reset(RenderFrame& renderFrame) void DebugDrawer::Reset(RenderResources& renderResources)
{ {
if (m_currentViewerData.binding) if (m_currentViewerData.binding)
{ {
// keep pipeline layout alive as needs to stay alive until all shader bindings have been freed // keep pipeline layout alive as needs to stay alive until all shader bindings have been freed
renderFrame.PushReleaseCallback([pool = m_dataPool, data = std::move(m_currentViewerData), pipelineLayout = m_renderPipelineLayout]() mutable renderResources.PushReleaseCallback([pool = m_dataPool, data = std::move(m_currentViewerData), pipelineLayout = m_renderPipelineLayout]() mutable
{ {
pool->viewerData.push_back(std::move(data)); pool->viewerData.push_back(std::move(data));
}); });
@ -210,7 +210,7 @@ namespace Nz
for (auto& drawCall : m_drawCalls) for (auto& drawCall : m_drawCalls)
{ {
renderFrame.PushReleaseCallback([pool = m_dataPool, buffer = std::move(drawCall.vertexBuffer)]() mutable renderResources.PushReleaseCallback([pool = m_dataPool, buffer = std::move(drawCall.vertexBuffer)]() mutable
{ {
pool->vertexBuffers.push_back(std::move(buffer)); pool->vertexBuffers.push_back(std::move(buffer));
}); });

View File

@ -2,15 +2,15 @@
// This file is part of the "Nazara Engine - Renderer module" // This file is part of the "Nazara Engine - Renderer module"
// For conditions of distribution and use, see copyright notice in Config.hpp // For conditions of distribution and use, see copyright notice in Config.hpp
#include <Nazara/Renderer/TransientResources.hpp> #include <Nazara/Renderer/RenderResources.hpp>
#include <Nazara/Renderer/Debug.hpp> #include <Nazara/Renderer/Debug.hpp>
namespace Nz namespace Nz
{ {
TransientResources::~TransientResources() RenderResources::~RenderResources()
{ {
FlushReleaseQueue(); FlushReleaseQueue();
} }
TransientResources::Releasable::~Releasable() = default; RenderResources::Releasable::~Releasable() = default;
} }

View File

@ -53,6 +53,11 @@ namespace Nz
SubmitCommandBuffer(commandBuffer, queueTypeFlags); SubmitCommandBuffer(commandBuffer, queueTypeFlags);
} }
UInt32 VulkanRenderImage::GetImageIndex() const
{
return m_imageIndex;
}
VulkanUploadPool& VulkanRenderImage::GetUploadPool() VulkanUploadPool& VulkanRenderImage::GetUploadPool()
{ {
return m_uploadPool; return m_uploadPool;

View File

@ -246,7 +246,7 @@ namespace Nz
currentFrame.Reset(imageIndex); currentFrame.Reset(imageIndex);
return RenderFrame(&currentFrame, invalidateFramebuffer, m_swapchainSize, imageIndex); return RenderFrame(&currentFrame, invalidateFramebuffer, m_swapchainSize);
} }
std::shared_ptr<CommandPool> VulkanSwapchain::CreateCommandPool(QueueType queueType) std::shared_ptr<CommandPool> VulkanSwapchain::CreateCommandPool(QueueType queueType)
@ -324,6 +324,11 @@ namespace Nz
return m_supportedPresentModes; return m_supportedPresentModes;
} }
RenderResources& VulkanSwapchain::GetTransientResources()
{
return *m_concurrentImageData[m_currentFrame];
}
void VulkanSwapchain::NotifyResize(const Vector2ui& newSize) void VulkanSwapchain::NotifyResize(const Vector2ui& newSize)
{ {
OnSwapchainResize(this, newSize); OnSwapchainResize(this, newSize);
@ -375,11 +380,6 @@ namespace Nz
} }
} }
TransientResources& VulkanSwapchain::Transient()
{
return *m_concurrentImageData[m_currentFrame];
}
bool VulkanSwapchain::SetupDepthBuffer() bool VulkanSwapchain::SetupDepthBuffer()
{ {
VkImageCreateInfo imageCreateInfo = { VkImageCreateInfo imageCreateInfo = {

View File

@ -352,7 +352,7 @@ int main()
clearValues[1].depth = 1.f; clearValues[1].depth = 1.f;
clearValues[1].stencil = 0; clearValues[1].stencil = 0;
builder.BeginRenderPass(windowSwapchain.GetFramebuffer(frame.GetFramebufferIndex()), windowSwapchain.GetRenderPass(), renderRect, { clearValues[0], clearValues[1] }); builder.BeginRenderPass(windowSwapchain.GetFramebuffer(frame.GetImageIndex()), windowSwapchain.GetRenderPass(), renderRect, { clearValues[0], clearValues[1] });
{ {
builder.SetScissor(Nz::Recti{ 0, 0, int(windowSize.x), int(windowSize.y) }); builder.SetScissor(Nz::Recti{ 0, 0, int(windowSize.x), int(windowSize.y) });
builder.SetViewport(Nz::Recti{ 0, 0, int(windowSize.x), int(windowSize.y) }); builder.SetViewport(Nz::Recti{ 0, 0, int(windowSize.x), int(windowSize.y) });
@ -665,7 +665,7 @@ std::shared_ptr<Nz::Texture> GenerateSpriteTexture(Nz::RenderDevice& device, std
} }
}); });
swapchain.Transient().Execute([&](Nz::CommandBufferBuilder& builder) swapchain.GetTransientResources().Execute([&](Nz::CommandBufferBuilder& builder)
{ {
builder.TextureBarrier(Nz::PipelineStage::BottomOfPipe, Nz::PipelineStage::ComputeShader, {}, Nz::MemoryAccess::ShaderWrite, Nz::TextureLayout::Undefined, Nz::TextureLayout::General, *targetTexture); builder.TextureBarrier(Nz::PipelineStage::BottomOfPipe, Nz::PipelineStage::ComputeShader, {}, Nz::MemoryAccess::ShaderWrite, Nz::TextureLayout::Undefined, Nz::TextureLayout::General, *targetTexture);

View File

@ -193,7 +193,7 @@ int main()
clearValues[1].depth = 1.f; clearValues[1].depth = 1.f;
clearValues[1].stencil = 0; clearValues[1].stencil = 0;
builder.BeginRenderPass(windowRT->GetFramebuffer(frame.GetFramebufferIndex()), windowRT->GetRenderPass(), renderRect, { clearValues[0], clearValues[1] }); builder.BeginRenderPass(windowRT->GetFramebuffer(frame.GetImageIndex()), windowRT->GetRenderPass(), renderRect, { clearValues[0], clearValues[1] });
{ {
builder.SetScissor(Nz::Recti{ 0, 0, int(windowSize.x), int(windowSize.y) }); builder.SetScissor(Nz::Recti{ 0, 0, int(windowSize.x), int(windowSize.y) });
builder.SetViewport(Nz::Recti{ 0, 0, int(windowSize.x), int(windowSize.y) }); builder.SetViewport(Nz::Recti{ 0, 0, int(windowSize.x), int(windowSize.y) });

View File

@ -368,7 +368,7 @@ int main()
builder.BeginDebugRegion("Main window rendering", Nz::Color::Green()); builder.BeginDebugRegion("Main window rendering", Nz::Color::Green());
{ {
builder.BeginRenderPass(windowRT->GetFramebuffer(frame.GetFramebufferIndex()), windowRT->GetRenderPass(), renderRect, { clearValues[0], clearValues[1] }); builder.BeginRenderPass(windowRT->GetFramebuffer(frame.GetImageIndex()), windowRT->GetRenderPass(), renderRect, { clearValues[0], clearValues[1] });
{ {
builder.BindIndexBuffer(*renderBufferIB, Nz::IndexType::U16); builder.BindIndexBuffer(*renderBufferIB, Nz::IndexType::U16);
builder.BindRenderPipeline(*pipeline); builder.BindRenderPipeline(*pipeline);