diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2020-08-05 11:14:17 +0200 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2020-08-06 09:51:56 +0200 |
commit | da63c8d9757919e08ca6696be291e3d3217d17b9 (patch) | |
tree | f9bc56e84a3ddb103ab20d61040a687e94f106a4 /src | |
parent | 9269de1e83ec466bfda73d7fc61d5206a99a3736 (diff) |
rhi: release pipelines/rendertargets when Attachment changes
This fixes resizing of FBO
Change-Id: Ibf1ca8b9835e03c5163ad3df0e1d7871b751ccda
Reviewed-by: Mike Krus <mike.krus@kdab.com>
Diffstat (limited to 'src')
3 files changed, 52 insertions, 2 deletions
diff --git a/src/plugins/renderers/rhi/managers/rhiresourcemanagers.cpp b/src/plugins/renderers/rhi/managers/rhiresourcemanagers.cpp index 63fd2171f..d0aed29bc 100644 --- a/src/plugins/renderers/rhi/managers/rhiresourcemanagers.cpp +++ b/src/plugins/renderers/rhi/managers/rhiresourcemanagers.cpp @@ -112,6 +112,17 @@ void erasePipelinesReferencingShader(Manager *manager, const Qt3DCore::QNodeId & } } +template<typename Manager> +void erasePipelinesReferencingRenderTargetId(Manager *manager, const Qt3DCore::QNodeId &renderTargetId) +{ + const auto handles = manager->activeHandles(); // copy + for (const auto &handle : handles) { + const auto &key = handle->key(); + if (key.renderTarget == renderTargetId) + manager->releaseResource(key); + } +} + } // anonymous void RHIGraphicsPipelineManager::releasePipelinesReferencingShader(const Qt3DCore::QNodeId &shaderId) @@ -119,12 +130,16 @@ void RHIGraphicsPipelineManager::releasePipelinesReferencingShader(const Qt3DCor erasePipelinesReferencingShader(this, shaderId); } +void RHIGraphicsPipelineManager::releasePipelinesReferencingRenderTarget(const Qt3DCore::QNodeId &renderTargetId) +{ + erasePipelinesReferencingRenderTargetId(this, renderTargetId); +} + void RHIComputePipelineManager::releasePipelinesReferencingShader(const Qt3DCore::QNodeId &shaderId) { erasePipelinesReferencingShader(this, shaderId); } - } // Rhi } // Render diff --git a/src/plugins/renderers/rhi/managers/rhiresourcemanagers_p.h b/src/plugins/renderers/rhi/managers/rhiresourcemanagers_p.h index 7cb5e980c..044204e21 100644 --- a/src/plugins/renderers/rhi/managers/rhiresourcemanagers_p.h +++ b/src/plugins/renderers/rhi/managers/rhiresourcemanagers_p.h @@ -105,7 +105,7 @@ public: int getIdForAttributeVec(const std::vector<AttributeInfo> &attributesInfo); void releasePipelinesReferencingShader(const Qt3DCore::QNodeId &shaderId); - + void releasePipelinesReferencingRenderTarget(const Qt3DCore::QNodeId &renderTargetId); private: using AttributeInfoVec= std::vector<AttributeInfo>; diff --git a/src/plugins/renderers/rhi/renderer/renderer.cpp b/src/plugins/renderers/rhi/renderer/renderer.cpp index b721ce7cb..6dcbe25df 100644 --- a/src/plugins/renderers/rhi/renderer/renderer.cpp +++ b/src/plugins/renderers/rhi/renderer/renderer.cpp @@ -1804,6 +1804,39 @@ void Renderer::updateResources() m_textureIdsToCleanup += m_nodesManager->textureManager()->takeTexturesIdsToCleanup(); } + + // Find dirty renderTargets + // -> attachments added/removed + // -> attachments textures updated (new dimensions, format ...) + // -> destroy pipelines associated with dirty renderTargets + { + RHIRenderTargetManager *rhiRenderTargetManager = m_RHIResourceManagers->rhiRenderTargetManager(); + RenderTargetManager *renderTargetManager = m_nodesManager->renderTargetManager(); + AttachmentManager *attachmentManager = m_nodesManager->attachmentManager(); + const std::vector<HTarget> &activeHandles = renderTargetManager->activeHandles(); + for (const HTarget &hTarget : activeHandles) { + const Qt3DCore::QNodeId renderTargetId = hTarget->peerId(); + const Qt3DCore::QNodeIdVector &attachmentIds = hTarget->renderOutputs(); + for (const Qt3DCore::QNodeId &attachmentId : attachmentIds) { + RenderTargetOutput *output = attachmentManager->lookupResource(attachmentId); + + auto it = std::find_if(m_updatedTextureProperties.begin(), + m_updatedTextureProperties.end(), + [&output] (const QPair<Texture::TextureUpdateInfo, Qt3DCore::QNodeIdVector> &updateData) { + const Qt3DCore::QNodeIdVector &referencedTextureIds = updateData.second; + return referencedTextureIds.contains(output->textureUuid()); + }); + // Attachment references a texture which was update + // We need to destroy the render target and the pipelines associated with it + // so that they can be recreated + if (it != m_updatedTextureProperties.end()) { + graphicsPipelineManager->releasePipelinesReferencingRenderTarget(renderTargetId); + rhiRenderTargetManager->releaseResource(renderTargetId); + } + } + } + } + // Record list of buffer that might need uploading lookForDownloadableBuffers(); } @@ -2802,6 +2835,8 @@ void Renderer::cleanGraphicsResources() for (const Qt3DCore::QNodeId renderTargetCleanedUpId : cleanedUpRenderTargetIds) { cleanupRenderTarget(m_nodesManager->renderTargetManager()->lookupResource(renderTargetCleanedUpId)); m_nodesManager->renderTargetManager()->releaseResource(renderTargetCleanedUpId); + // Release pipelines that were referencing renderTarget + graphicsPipelineManager->releasePipelinesReferencingRenderTarget(renderTargetCleanedUpId); } } |