Graphics/ForwardFramePipeline: Fix scissor update
This commit is contained in:
parent
7ece44b4f4
commit
0dd8c21543
|
|
@ -32,7 +32,8 @@ namespace Nz
|
||||||
DepthPipelinePass(DepthPipelinePass&&) = delete;
|
DepthPipelinePass(DepthPipelinePass&&) = delete;
|
||||||
~DepthPipelinePass();
|
~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);
|
void Prepare(RenderFrame& renderFrame, const Frustumf& frustum, const std::vector<FramePipelinePass::VisibleRenderable>& visibleRenderables, std::size_t visibilityHash);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,12 @@
|
||||||
|
|
||||||
namespace Nz
|
namespace Nz
|
||||||
{
|
{
|
||||||
inline void DepthPipelinePass::ForceInvalidation()
|
inline void DepthPipelinePass::InvalidateCommandBuffers()
|
||||||
|
{
|
||||||
|
m_rebuildCommandBuffer = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void DepthPipelinePass::InvalidateElements()
|
||||||
{
|
{
|
||||||
m_rebuildElements = true;
|
m_rebuildElements = true;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -59,10 +59,10 @@ namespace Nz
|
||||||
void UnregisterViewer(std::size_t viewerIndex) override;
|
void UnregisterViewer(std::size_t viewerIndex) override;
|
||||||
void UnregisterWorldInstance(std::size_t worldInstance) override;
|
void UnregisterWorldInstance(std::size_t worldInstance) override;
|
||||||
|
|
||||||
void UpdateLightRenderMask(std::size_t lightIndex, UInt32 renderMask);
|
void UpdateLightRenderMask(std::size_t lightIndex, UInt32 renderMask) override;
|
||||||
void UpdateRenderableRenderMask(std::size_t renderableIndex, UInt32 renderMask);
|
void UpdateRenderableRenderMask(std::size_t renderableIndex, UInt32 renderMask) override;
|
||||||
void UpdateRenderableScissorBox(std::size_t renderableIndex, const Recti& scissorBox);
|
void UpdateRenderableScissorBox(std::size_t renderableIndex, const Recti& scissorBox) override;
|
||||||
void UpdateViewerRenderMask(std::size_t viewerIndex, Int32 renderOrder);
|
void UpdateViewerRenderMask(std::size_t viewerIndex, Int32 renderOrder) override;
|
||||||
|
|
||||||
ForwardFramePipeline& operator=(const ForwardFramePipeline&) = delete;
|
ForwardFramePipeline& operator=(const ForwardFramePipeline&) = delete;
|
||||||
ForwardFramePipeline& operator=(ForwardFramePipeline&&) = delete;
|
ForwardFramePipeline& operator=(ForwardFramePipeline&&) = delete;
|
||||||
|
|
|
||||||
|
|
@ -35,7 +35,8 @@ namespace Nz
|
||||||
ForwardPipelinePass(ForwardPipelinePass&&) = delete;
|
ForwardPipelinePass(ForwardPipelinePass&&) = delete;
|
||||||
~ForwardPipelinePass();
|
~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);
|
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
|
namespace Nz
|
||||||
{
|
{
|
||||||
inline void ForwardPipelinePass::ForceInvalidation()
|
inline void ForwardPipelinePass::InvalidateCommandBuffers()
|
||||||
|
{
|
||||||
|
m_rebuildCommandBuffer = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void ForwardPipelinePass::InvalidateElements()
|
||||||
{
|
{
|
||||||
m_rebuildElements = true;
|
m_rebuildElements = true;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -65,7 +65,7 @@ namespace Nz
|
||||||
UInt32 viewerRenderMask = viewerData.viewer->GetRenderMask();
|
UInt32 viewerRenderMask = viewerData.viewer->GetRenderMask();
|
||||||
|
|
||||||
if (viewerRenderMask & renderMask)
|
if (viewerRenderMask & renderMask)
|
||||||
viewerData.forwardPass->ForceInvalidation();
|
viewerData.forwardPass->InvalidateElements();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -108,9 +108,9 @@ namespace Nz
|
||||||
if (viewerRenderMask & renderMask)
|
if (viewerRenderMask & renderMask)
|
||||||
{
|
{
|
||||||
if (viewerData.depthPrepass)
|
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* renderableData = m_renderablePool.RetrieveFromIndex(renderableIndex);
|
||||||
renderableData->scissorBox = scissorBox;
|
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)
|
void ForwardFramePipeline::UpdateViewerRenderMask(std::size_t viewerIndex, Int32 renderOrder)
|
||||||
|
|
@ -505,7 +519,7 @@ namespace Nz
|
||||||
{
|
{
|
||||||
const auto& targetViewers = renderTargetData.viewers;
|
const auto& targetViewers = renderTargetData.viewers;
|
||||||
|
|
||||||
FramePass& forwardPass = frameGraph.AddPass("Merge pass");
|
FramePass& mergePass = frameGraph.AddPass("Merge pass");
|
||||||
|
|
||||||
renderTargetData.finalAttachment = frameGraph.AddAttachment({
|
renderTargetData.finalAttachment = frameGraph.AddAttachment({
|
||||||
"Viewer output",
|
"Viewer output",
|
||||||
|
|
@ -513,12 +527,12 @@ namespace Nz
|
||||||
});
|
});
|
||||||
|
|
||||||
for (const ViewerData* viewerData : targetViewers)
|
for (const ViewerData* viewerData : targetViewers)
|
||||||
forwardPass.AddInput(viewerData->colorAttachment);
|
mergePass.AddInput(viewerData->colorAttachment);
|
||||||
|
|
||||||
forwardPass.AddOutput(renderTargetData.finalAttachment);
|
mergePass.AddOutput(renderTargetData.finalAttachment);
|
||||||
forwardPass.SetClearColor(0, Color::Black);
|
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.SetScissor(renderRect);
|
||||||
builder.SetViewport(renderRect);
|
builder.SetViewport(renderRect);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue