Graphics/ForwardFramePipeline: Optimize out merge pass when only one viewer renders to a target
This commit is contained in:
parent
97d5640967
commit
2ef9cd0128
|
|
@ -717,47 +717,59 @@ namespace Nz
|
||||||
{
|
{
|
||||||
const auto& targetViewers = renderTargetData.viewers;
|
const auto& targetViewers = renderTargetData.viewers;
|
||||||
|
|
||||||
FramePass& mergePass = frameGraph.AddPass("Merge pass");
|
if (targetViewers.size() > 1)
|
||||||
|
|
||||||
renderTargetData.finalAttachment = frameGraph.AddAttachment({
|
|
||||||
"Viewer output",
|
|
||||||
PixelFormat::RGBA8
|
|
||||||
});
|
|
||||||
|
|
||||||
for (const ViewerData* viewerData : targetViewers)
|
|
||||||
mergePass.AddInput(viewerData->finalColorAttachment);
|
|
||||||
|
|
||||||
mergePass.AddOutput(renderTargetData.finalAttachment);
|
|
||||||
mergePass.SetClearColor(0, Color::Black());
|
|
||||||
|
|
||||||
mergePass.SetCommandCallback([&targetViewers](CommandBufferBuilder& builder, const FramePassEnvironment& /*env*/)
|
|
||||||
{
|
{
|
||||||
Graphics* graphics = Graphics::Instance();
|
// Multiple viewers on the same targets, merge them
|
||||||
builder.BindRenderPipeline(*graphics->GetBlitPipeline(false));
|
FramePass& mergePass = frameGraph.AddPass("Merge pass");
|
||||||
|
|
||||||
bool first = true;
|
renderTargetData.finalAttachment = frameGraph.AddAttachment({
|
||||||
|
"Viewer output",
|
||||||
|
PixelFormat::RGBA8
|
||||||
|
});
|
||||||
|
|
||||||
for (const ViewerData* viewerData : targetViewers)
|
for (const ViewerData* viewerData : targetViewers)
|
||||||
|
mergePass.AddInput(viewerData->finalColorAttachment);
|
||||||
|
|
||||||
|
mergePass.AddOutput(renderTargetData.finalAttachment);
|
||||||
|
mergePass.SetClearColor(0, Color::Black());
|
||||||
|
|
||||||
|
mergePass.SetCommandCallback([&targetViewers](CommandBufferBuilder& builder, const FramePassEnvironment& /*env*/)
|
||||||
{
|
{
|
||||||
Recti renderRect = viewerData->viewer->GetViewport();
|
Graphics* graphics = Graphics::Instance();
|
||||||
|
builder.BindRenderPipeline(*graphics->GetBlitPipeline(false));
|
||||||
|
|
||||||
builder.SetScissor(renderRect);
|
bool first = true;
|
||||||
builder.SetViewport(renderRect);
|
|
||||||
|
|
||||||
const ShaderBindingPtr& blitShaderBinding = viewerData->blitShaderBinding;
|
for (const ViewerData* viewerData : targetViewers)
|
||||||
|
|
||||||
builder.BindRenderShaderBinding(0, *blitShaderBinding);
|
|
||||||
builder.Draw(3);
|
|
||||||
|
|
||||||
if (first)
|
|
||||||
{
|
{
|
||||||
builder.BindRenderPipeline(*graphics->GetBlitPipeline(true));
|
Recti renderRect = viewerData->viewer->GetViewport();
|
||||||
first = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
frameGraph.AddBackbufferOutput(renderTargetData.finalAttachment);
|
builder.SetScissor(renderRect);
|
||||||
|
builder.SetViewport(renderRect);
|
||||||
|
|
||||||
|
const ShaderBindingPtr& blitShaderBinding = viewerData->blitShaderBinding;
|
||||||
|
|
||||||
|
builder.BindRenderShaderBinding(0, *blitShaderBinding);
|
||||||
|
builder.Draw(3);
|
||||||
|
|
||||||
|
if (first)
|
||||||
|
{
|
||||||
|
builder.BindRenderPipeline(*graphics->GetBlitPipeline(true));
|
||||||
|
first = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
frameGraph.AddBackbufferOutput(renderTargetData.finalAttachment);
|
||||||
|
}
|
||||||
|
else if (targetViewers.size() == 1)
|
||||||
|
{
|
||||||
|
// Single viewer on that target
|
||||||
|
const auto& viewer = *targetViewers.front();
|
||||||
|
|
||||||
|
frameGraph.AddBackbufferOutput(viewer.finalColorAttachment);
|
||||||
|
renderTargetData.finalAttachment = viewer.finalColorAttachment;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return frameGraph.Bake();
|
return frameGraph.Bake();
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue