summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2020-08-05 11:14:17 +0200
committerPaul Lemire <paul.lemire@kdab.com>2020-08-06 09:51:56 +0200
commitda63c8d9757919e08ca6696be291e3d3217d17b9 (patch)
treef9bc56e84a3ddb103ab20d61040a687e94f106a4 /src
parent9269de1e83ec466bfda73d7fc61d5206a99a3736 (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')
-rw-r--r--src/plugins/renderers/rhi/managers/rhiresourcemanagers.cpp17
-rw-r--r--src/plugins/renderers/rhi/managers/rhiresourcemanagers_p.h2
-rw-r--r--src/plugins/renderers/rhi/renderer/renderer.cpp35
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);
}
}