Graphics/ForwardFramePipeline: Fix scissor update

This commit is contained in:
Jérôme Leclercq 2022-02-22 13:31:22 +01:00
parent 7ece44b4f4
commit 0dd8c21543
6 changed files with 42 additions and 16 deletions

View File

@ -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<FramePipelinePass::VisibleRenderable>& visibleRenderables, std::size_t visibilityHash);

View File

@ -7,7 +7,12 @@
namespace Nz
{
inline void DepthPipelinePass::ForceInvalidation()
inline void DepthPipelinePass::InvalidateCommandBuffers()
{
m_rebuildCommandBuffer = true;
}
inline void DepthPipelinePass::InvalidateElements()
{
m_rebuildElements = true;
}

View File

@ -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;

View File

@ -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<FramePipelinePass::VisibleRenderable>& visibleRenderables, const std::vector<const Light*>& visibleLights, std::size_t visibilityHash);

View File

@ -7,7 +7,12 @@
namespace Nz
{
inline void ForwardPipelinePass::ForceInvalidation()
inline void ForwardPipelinePass::InvalidateCommandBuffers()
{
m_rebuildCommandBuffer = true;
}
inline void ForwardPipelinePass::InvalidateElements()
{
m_rebuildElements = true;
}

View File

@ -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);