diff --git a/include/Nazara/Graphics/DepthPipelinePass.hpp b/include/Nazara/Graphics/DepthPipelinePass.hpp index b37d48897..7e2fe5855 100644 --- a/include/Nazara/Graphics/DepthPipelinePass.hpp +++ b/include/Nazara/Graphics/DepthPipelinePass.hpp @@ -32,7 +32,8 @@ namespace Nz DepthPipelinePass(DepthPipelinePass&&) = delete; ~DepthPipelinePass(); - inline void ForceInvalidation(); + inline void InvalidateCommandBuffers(); + inline void InvalidateElements(); void Prepare(RenderFrame& renderFrame, const Frustumf& frustum, const std::vector& visibleRenderables, std::size_t visibilityHash); diff --git a/include/Nazara/Graphics/DepthPipelinePass.inl b/include/Nazara/Graphics/DepthPipelinePass.inl index d275e9d26..41b3b0545 100644 --- a/include/Nazara/Graphics/DepthPipelinePass.inl +++ b/include/Nazara/Graphics/DepthPipelinePass.inl @@ -7,7 +7,12 @@ namespace Nz { - inline void DepthPipelinePass::ForceInvalidation() + inline void DepthPipelinePass::InvalidateCommandBuffers() + { + m_rebuildCommandBuffer = true; + } + + inline void DepthPipelinePass::InvalidateElements() { m_rebuildElements = true; } diff --git a/include/Nazara/Graphics/ForwardFramePipeline.hpp b/include/Nazara/Graphics/ForwardFramePipeline.hpp index 3d7740b6a..20a8e1d0e 100644 --- a/include/Nazara/Graphics/ForwardFramePipeline.hpp +++ b/include/Nazara/Graphics/ForwardFramePipeline.hpp @@ -59,10 +59,10 @@ namespace Nz void UnregisterViewer(std::size_t viewerIndex) override; void UnregisterWorldInstance(std::size_t worldInstance) override; - void UpdateLightRenderMask(std::size_t lightIndex, UInt32 renderMask); - void UpdateRenderableRenderMask(std::size_t renderableIndex, UInt32 renderMask); - void UpdateRenderableScissorBox(std::size_t renderableIndex, const Recti& scissorBox); - void UpdateViewerRenderMask(std::size_t viewerIndex, Int32 renderOrder); + void UpdateLightRenderMask(std::size_t lightIndex, UInt32 renderMask) override; + void UpdateRenderableRenderMask(std::size_t renderableIndex, UInt32 renderMask) override; + void UpdateRenderableScissorBox(std::size_t renderableIndex, const Recti& scissorBox) override; + void UpdateViewerRenderMask(std::size_t viewerIndex, Int32 renderOrder) override; ForwardFramePipeline& operator=(const ForwardFramePipeline&) = delete; ForwardFramePipeline& operator=(ForwardFramePipeline&&) = delete; diff --git a/include/Nazara/Graphics/ForwardPipelinePass.hpp b/include/Nazara/Graphics/ForwardPipelinePass.hpp index 16a533c54..95278fa7d 100644 --- a/include/Nazara/Graphics/ForwardPipelinePass.hpp +++ b/include/Nazara/Graphics/ForwardPipelinePass.hpp @@ -35,7 +35,8 @@ namespace Nz ForwardPipelinePass(ForwardPipelinePass&&) = delete; ~ForwardPipelinePass(); - inline void ForceInvalidation(); + inline void InvalidateCommandBuffers(); + inline void InvalidateElements(); void Prepare(RenderFrame& renderFrame, const Frustumf& frustum, const std::vector& visibleRenderables, const std::vector& visibleLights, std::size_t visibilityHash); diff --git a/include/Nazara/Graphics/ForwardPipelinePass.inl b/include/Nazara/Graphics/ForwardPipelinePass.inl index fc00815b0..ab87504bb 100644 --- a/include/Nazara/Graphics/ForwardPipelinePass.inl +++ b/include/Nazara/Graphics/ForwardPipelinePass.inl @@ -7,7 +7,12 @@ namespace Nz { - inline void ForwardPipelinePass::ForceInvalidation() + inline void ForwardPipelinePass::InvalidateCommandBuffers() + { + m_rebuildCommandBuffer = true; + } + + inline void ForwardPipelinePass::InvalidateElements() { m_rebuildElements = true; } diff --git a/src/Nazara/Graphics/ForwardFramePipeline.cpp b/src/Nazara/Graphics/ForwardFramePipeline.cpp index e68d08422..73688d3a0 100644 --- a/src/Nazara/Graphics/ForwardFramePipeline.cpp +++ b/src/Nazara/Graphics/ForwardFramePipeline.cpp @@ -65,7 +65,7 @@ namespace Nz UInt32 viewerRenderMask = viewerData.viewer->GetRenderMask(); if (viewerRenderMask & renderMask) - viewerData.forwardPass->ForceInvalidation(); + viewerData.forwardPass->InvalidateElements(); } }); @@ -108,9 +108,9 @@ namespace Nz if (viewerRenderMask & renderMask) { if (viewerData.depthPrepass) - viewerData.depthPrepass->ForceInvalidation(); + viewerData.depthPrepass->InvalidateElements(); - viewerData.forwardPass->ForceInvalidation(); + viewerData.forwardPass->InvalidateElements(); } } }); @@ -444,6 +444,20 @@ namespace Nz { RenderableData* renderableData = m_renderablePool.RetrieveFromIndex(renderableIndex); renderableData->scissorBox = scissorBox; + + // TODO: Invalidate only relevant viewers and passes + for (auto& viewerData : m_viewerPool) + { + UInt32 viewerRenderMask = viewerData.viewer->GetRenderMask(); + + if (viewerRenderMask & renderableData->renderMask) + { + if (viewerData.depthPrepass) + viewerData.depthPrepass->InvalidateElements(); + + viewerData.forwardPass->InvalidateElements(); + } + } } void ForwardFramePipeline::UpdateViewerRenderMask(std::size_t viewerIndex, Int32 renderOrder) @@ -505,7 +519,7 @@ namespace Nz { const auto& targetViewers = renderTargetData.viewers; - FramePass& forwardPass = frameGraph.AddPass("Merge pass"); + FramePass& mergePass = frameGraph.AddPass("Merge pass"); renderTargetData.finalAttachment = frameGraph.AddAttachment({ "Viewer output", @@ -513,12 +527,12 @@ namespace Nz }); for (const ViewerData* viewerData : targetViewers) - forwardPass.AddInput(viewerData->colorAttachment); + mergePass.AddInput(viewerData->colorAttachment); - forwardPass.AddOutput(renderTargetData.finalAttachment); - forwardPass.SetClearColor(0, Color::Black); + mergePass.AddOutput(renderTargetData.finalAttachment); + mergePass.SetClearColor(0, Color::Black); - forwardPass.SetCommandCallback([&targetViewers](CommandBufferBuilder& builder, const Recti& renderRect) + mergePass.SetCommandCallback([&targetViewers](CommandBufferBuilder& builder, const Recti& renderRect) { builder.SetScissor(renderRect); builder.SetViewport(renderRect);