diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2019-10-11 11:05:12 +0200 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2019-10-22 16:13:37 +0200 |
commit | 6303910dc48a87b84112f31c1dd328b930f7e957 (patch) | |
tree | 3c1a962c1bf5448b0627f841d493f936908c9cd8 /src/render/renderers | |
parent | 4d0f8bcdea22f70dbf693545d56e1399b3ca0250 (diff) |
ComputeCommand/SubtreeEnabler use direct sync job to update frontend
Change-Id: I773955df33f0b4dcdaa0953633761ff82f3d0da4
Reviewed-by: Mike Krus <mike.krus@kdab.com>
Diffstat (limited to 'src/render/renderers')
-rw-r--r-- | src/render/renderers/opengl/renderer/renderer.cpp | 36 | ||||
-rw-r--r-- | src/render/renderers/opengl/renderer/renderer_p.h | 6 | ||||
-rw-r--r-- | src/render/renderers/opengl/renderer/renderview.cpp | 5 |
3 files changed, 24 insertions, 23 deletions
diff --git a/src/render/renderers/opengl/renderer/renderer.cpp b/src/render/renderers/opengl/renderer/renderer.cpp index 35c4d553f..474519398 100644 --- a/src/render/renderers/opengl/renderer/renderer.cpp +++ b/src/render/renderers/opengl/renderer/renderer.cpp @@ -200,7 +200,9 @@ Renderer::Renderer(QRenderAspect::RenderType type) [this] (Qt3DCore::QAspectManager *m) { sendTextureChangesToFrontend(m); }, JobTypes::SendTextureChangesToFrontend)) , m_sendSetFenceHandlesToFrontendJob(SynchronizerJobPtr::create([this] { sendSetFenceHandlesToFrontend(); }, JobTypes::SendSetFenceHandlesToFrontend)) - , m_sendDisablesToFrontendJob(SynchronizerJobPtr::create([this] { sendDisablesToFrontend(); }, JobTypes::SendDisablesToFrontend)) + , m_sendDisablesToFrontendJob(SynchronizerPostFramePtr::create([] {}, + [this] (Qt3DCore::QAspectManager *m) { sendDisablesToFrontend(m); }, + JobTypes::SendDisablesToFrontend)) , m_introspectShaderJob(SynchronizerPostFramePtr::create([this] { reloadDirtyShaders(); }, [this] (Qt3DCore::QAspectManager *m) { sendShaderChangesToFrontend(m); }, JobTypes::DirtyShaderGathering)) @@ -1231,17 +1233,24 @@ void Renderer::sendSetFenceHandlesToFrontend() } } -// Executed in a job -void Renderer::sendDisablesToFrontend() +// Executed in a job postFrame +void Renderer::sendDisablesToFrontend(Qt3DCore::QAspectManager *manager) { - const auto updatedDisables = std::move(m_updatedDisables); - FrameGraphManager *fgManager = m_nodesManager->frameGraphManager(); + // SubtreeEnabled + const auto updatedDisables = std::move(m_updatedDisableSubtreeEnablers); for (const auto &nodeId : updatedDisables) { - FrameGraphNode *fgNode = fgManager->lookupNode(nodeId); - if (fgNode != nullptr) { // Node could have been deleted before we got a chance to notify it - Q_ASSERT(fgNode->nodeType() == FrameGraphNode::SubtreeEnabler); - SubtreeEnabler *enabler = static_cast<SubtreeEnabler *>(fgNode); - enabler->sendDisableToFrontend(); + QSubtreeEnabler *frontend = static_cast<decltype(frontend)>(manager->lookupNode(nodeId)); + frontend->setEnabled(false); + } + + // Compute Commands + const QVector<HComputeCommand> activeCommands = m_nodesManager->computeJobManager()->activeHandles(); + for (const HComputeCommand &handle :activeCommands) { + ComputeCommand *c = m_nodesManager->computeJobManager()->data(handle); + if (c->hasReachedFrameCount()) { + QComputeCommand *frontend = static_cast<decltype(frontend)>(manager->lookupNode(c->peerId())); + frontend->setEnabled(false); + c->resetHasReachedFrameCount(); } } } @@ -1773,7 +1782,6 @@ QVector<QAspectJobPtr> Renderer::preRenderingJobs() QVector<Qt3DCore::QAspectJobPtr> Renderer::renderBinJobs() { QVector<QAspectJobPtr> renderBinJobs; - // Create the jobs to build the frame const QVector<QAspectJobPtr> bufferJobs = createRenderBufferJobs(); @@ -1824,7 +1832,7 @@ QVector<Qt3DCore::QAspectJobPtr> Renderer::renderBinJobs() renderBinJobs.push_back(m_updateSkinningPaletteJob); renderBinJobs.push_back(m_updateLevelOfDetailJob); renderBinJobs.push_back(m_cleanupJob); - + renderBinJobs.push_back(m_sendDisablesToFrontendJob); renderBinJobs.append(bufferJobs); // Jobs to prepare GL Resource upload @@ -1874,9 +1882,7 @@ QVector<Qt3DCore::QAspectJobPtr> Renderer::renderBinJobs() // Handle single shot subtree enablers const auto subtreeEnablers = visitor.takeEnablersToDisable(); for (auto *node : subtreeEnablers) - m_updatedDisables.push_back(node->peerId()); - if (m_updatedDisables.size() > 0) - renderBinJobs.push_back(m_sendDisablesToFrontendJob); + m_updatedDisableSubtreeEnablers.push_back(node->peerId()); } const int fgBranchCount = m_frameGraphLeaves.size(); diff --git a/src/render/renderers/opengl/renderer/renderer_p.h b/src/render/renderers/opengl/renderer/renderer_p.h index 7b1349503..f007ab05c 100644 --- a/src/render/renderers/opengl/renderer/renderer_p.h +++ b/src/render/renderers/opengl/renderer/renderer_p.h @@ -383,7 +383,7 @@ private: SynchronizerJobPtr m_textureGathererJob; SynchronizerPostFramePtr m_sendTextureChangesToFrontendJob; SynchronizerJobPtr m_sendSetFenceHandlesToFrontendJob; - SynchronizerJobPtr m_sendDisablesToFrontendJob; + SynchronizerPostFramePtr m_sendDisablesToFrontendJob; SynchronizerPostFramePtr m_introspectShaderJob; SynchronizerJobPtr m_syncLoadingJobs; @@ -395,7 +395,7 @@ private: void sendShaderChangesToFrontend(Qt3DCore::QAspectManager *manager); void sendTextureChangesToFrontend(Qt3DCore::QAspectManager *manager); void sendSetFenceHandlesToFrontend(); - void sendDisablesToFrontend(); + void sendDisablesToFrontend(Qt3DCore::QAspectManager *manager); QMutex m_abandonedVaosMutex; QVector<HVao> m_abandonedVaos; @@ -406,7 +406,7 @@ private: QVector<HTexture> m_dirtyTextures; QVector<QPair<Texture::TextureUpdateInfo, Qt3DCore::QNodeIdVector>> m_updatedTextureProperties; QVector<QPair<Qt3DCore::QNodeId, GLFence>> m_updatedSetFences; - QVector<Qt3DCore::QNodeId> m_updatedDisables; + QVector<Qt3DCore::QNodeId> m_updatedDisableSubtreeEnablers; Qt3DCore::QNodeIdVector m_textureIdsToCleanup; QVector<ShaderBuilderUpdate> m_shaderBuilderUpdates; diff --git a/src/render/renderers/opengl/renderer/renderview.cpp b/src/render/renderers/opengl/renderer/renderview.cpp index c38ffae80..7fb1c5fb9 100644 --- a/src/render/renderers/opengl/renderer/renderview.cpp +++ b/src/render/renderers/opengl/renderer/renderview.cpp @@ -686,11 +686,6 @@ QVector<EntityRenderCommandData> RenderView::buildComputeRenderCommands(const QV if ((computeJob = nodeManagers()->computeJobManager()->data(computeCommandHandle)) != nullptr && computeJob->isEnabled()) { - // Note: if frameCount has reached 0 in the previous frame, isEnabled - // would be false - if (computeJob->runType() == QComputeCommand::Manual) - computeJob->updateFrameCount(); - const Qt3DCore::QNodeId materialComponentId = entity->componentUuid<Material>(); const QVector<RenderPassParameterData> renderPassData = m_parameters.value(materialComponentId); |