Graphics/ForwardFramePipeline: Fix scissor update
This commit is contained in:
parent
7ece44b4f4
commit
0dd8c21543
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -7,7 +7,12 @@
|
|||
|
||||
namespace Nz
|
||||
{
|
||||
inline void DepthPipelinePass::ForceInvalidation()
|
||||
inline void DepthPipelinePass::InvalidateCommandBuffers()
|
||||
{
|
||||
m_rebuildCommandBuffer = true;
|
||||
}
|
||||
|
||||
inline void DepthPipelinePass::InvalidateElements()
|
||||
{
|
||||
m_rebuildElements = true;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -7,7 +7,12 @@
|
|||
|
||||
namespace Nz
|
||||
{
|
||||
inline void ForwardPipelinePass::ForceInvalidation()
|
||||
inline void ForwardPipelinePass::InvalidateCommandBuffers()
|
||||
{
|
||||
m_rebuildCommandBuffer = true;
|
||||
}
|
||||
|
||||
inline void ForwardPipelinePass::InvalidateElements()
|
||||
{
|
||||
m_rebuildElements = true;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in New Issue