FrameGraph: Fix texture pool

This commit is contained in:
SirLynix 2022-11-15 18:01:51 +01:00
parent 2d3d9d9526
commit 2fd2e190b9
1 changed files with 19 additions and 8 deletions

View File

@ -215,7 +215,20 @@ namespace Nz
if (std::size_t depthStencilOutput = framePass.GetDepthStencilOutput(); depthStencilOutput != FramePass::InvalidAttachmentId)
{
if (auto it = m_pending.attachmentToTextures.find(depthStencilOutput); it == m_pending.attachmentToTextures.end())
{
// Special case where multiples attachements point simultaneously to the same texture
m_pending.attachmentToTextures.emplace(depthStencilOutput, textureId);
auto inputIt = m_pending.attachmentLastUse.find(depthStencilInput);
auto outputIt = m_pending.attachmentLastUse.find(depthStencilInput);
if (inputIt != m_pending.attachmentLastUse.end() && outputIt != m_pending.attachmentLastUse.end())
{
if (inputIt->second > outputIt->second)
m_pending.attachmentLastUse.erase(outputIt);
else
m_pending.attachmentLastUse.erase(inputIt);
}
}
else if (it->second != textureId)
throw std::runtime_error("depth-stencil output already assigned");
}
@ -233,22 +246,20 @@ namespace Nz
{
attachmentId = ResolveAttachmentIndex(attachmentId);
std::size_t lastUsingPassId = Retrieve(m_pending.attachmentLastUse, attachmentId);
auto it = m_pending.attachmentLastUse.find(attachmentId);
// If this pass is the last one where this attachment is used, push the texture to the reuse pool
if (passIndex == lastUsingPassId)
if (it != m_pending.attachmentLastUse.end() && passIndex == it->second)
{
std::size_t textureId = Retrieve(m_pending.attachmentToTextures, attachmentId);
if (m_pending.texturePool.empty())
{
assert(std::find(m_pending.texturePool.begin(), m_pending.texturePool.end(), textureId) == m_pending.texturePool.end());
m_pending.texturePool.push_back(textureId);
}
}
});
}
// Add TextureUsage::Sampled to backbuffer output
// Add TextureUsage::ShaderSampling to backbuffer output
for (std::size_t output : m_backbufferOutputs)
{
auto it = m_pending.attachmentToTextures.find(output);