summaryrefslogtreecommitdiffstats
path: root/src/render/renderers
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2019-10-11 11:05:12 +0200
committerPaul Lemire <paul.lemire@kdab.com>2019-10-22 16:13:37 +0200
commit6303910dc48a87b84112f31c1dd328b930f7e957 (patch)
tree3c1a962c1bf5448b0627f841d493f936908c9cd8 /src/render/renderers
parent4d0f8bcdea22f70dbf693545d56e1399b3ca0250 (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.cpp36
-rw-r--r--src/render/renderers/opengl/renderer/renderer_p.h6
-rw-r--r--src/render/renderers/opengl/renderer/renderview.cpp5
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);