From da5a4af50076515abbf04691e8a5dfca5daaca9e Mon Sep 17 00:00:00 2001 From: Paul Lemire Date: Fri, 11 Oct 2019 09:15:12 +0200 Subject: ShaderBuilder: ensure no old updates are left over Could result in trying to send updates to nodes which have been destroyed. Change-Id: I3709277e5005f25ec8cb9efe0a2152f879bea89f Reviewed-by: Mike Krus --- src/render/materialsystem/shaderbuilder.cpp | 1 + src/render/materialsystem/shaderbuilder_p.h | 2 +- src/render/renderers/opengl/renderer/renderer.cpp | 4 ++-- 3 files changed, 4 insertions(+), 3 deletions(-) (limited to 'src/render') diff --git a/src/render/materialsystem/shaderbuilder.cpp b/src/render/materialsystem/shaderbuilder.cpp index 4e9327003..23f1400c9 100644 --- a/src/render/materialsystem/shaderbuilder.cpp +++ b/src/render/materialsystem/shaderbuilder.cpp @@ -145,6 +145,7 @@ void ShaderBuilder::cleanup() m_enabledLayers.clear(); m_graphs.clear(); m_dirtyTypes.clear(); + m_pendingUpdates.clear(); QBackendNode::setEnabled(false); } diff --git a/src/render/materialsystem/shaderbuilder_p.h b/src/render/materialsystem/shaderbuilder_p.h index ac7a165b8..0a799afaa 100644 --- a/src/render/materialsystem/shaderbuilder_p.h +++ b/src/render/materialsystem/shaderbuilder_p.h @@ -95,7 +95,7 @@ public: void syncFromFrontEnd(const Qt3DCore::QNode *frontEnd, bool firstTime) override; - QVector &updates() { return m_pendingUpdates; } + QVector takePendingUpdates() { return std::move(m_pendingUpdates); } private: void setEnabledLayers(const QStringList &layers); diff --git a/src/render/renderers/opengl/renderer/renderer.cpp b/src/render/renderers/opengl/renderer/renderer.cpp index 3da9b6c48..c3e986854 100644 --- a/src/render/renderers/opengl/renderer/renderer.cpp +++ b/src/render/renderers/opengl/renderer/renderer.cpp @@ -1115,7 +1115,7 @@ void Renderer::reloadDirtyShaders() if (shaderBuilder->isShaderCodeDirty(shaderType)) { shaderBuilder->generateCode(shaderType); - m_shaderBuilderUpdates.append(std::move(shaderBuilder->updates())); + m_shaderBuilderUpdates.append(shaderBuilder->takePendingUpdates()); } const auto code = shaderBuilder->shaderCode(shaderType); @@ -1143,9 +1143,9 @@ void Renderer::sendShaderChangesToFrontend(Qt3DCore::QAspectManager *manager) if (s->requiresFrontendSync()) { QShaderProgram *frontend = static_cast(manager->lookupNode(s->peerId())); QShaderProgramPrivate *dFrontend = static_cast(QNodePrivate::get(frontend)); + s->unsetRequiresFrontendSync(); dFrontend->setStatus(s->status()); dFrontend->setLog(s->log()); - s->unsetRequiresFrontendSync(); } } -- cgit v1.2.3