summaryrefslogtreecommitdiffstats
path: root/src/logic
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2020-06-24 10:59:08 +0200
committerPaul Lemire <paul.lemire@kdab.com>2020-06-25 12:38:55 +0200
commit7c2badb56eb564327b073fa706fb9c4f809c411a (patch)
tree941e460dd4d6ab68d7222aa2e04ebdd2eead5646 /src/logic
parent449d4bcf18f723c70f3f040df49573360d9017a0 (diff)
QLogicAspect: use QAspectJob::postFrame to drive FrameAction updates
Change-Id: I0707d1f971084fc6671aeb4bd1264c77f6406061 Pick-to: 5.15 Reviewed-by: Mike Krus <mike.krus@kdab.com>
Diffstat (limited to 'src/logic')
-rw-r--r--src/logic/callbackjob.cpp5
-rw-r--r--src/logic/callbackjob_p.h1
-rw-r--r--src/logic/executor.cpp32
-rw-r--r--src/logic/executor_p.h22
-rw-r--r--src/logic/manager.cpp8
-rw-r--r--src/logic/qlogicaspect.cpp3
6 files changed, 12 insertions, 59 deletions
diff --git a/src/logic/callbackjob.cpp b/src/logic/callbackjob.cpp
index 5dfc74f02..711ce268b 100644
--- a/src/logic/callbackjob.cpp
+++ b/src/logic/callbackjob.cpp
@@ -61,6 +61,11 @@ void CallbackJob::setManager(Manager *manager)
void CallbackJob::run()
{
+}
+
+void CallbackJob::postFrame(Qt3DCore::QAspectEngine *aspectEngine)
+{
+ Q_UNUSED(aspectEngine);
Q_ASSERT(m_logicManager);
m_logicManager->triggerLogicFrameUpdates();
}
diff --git a/src/logic/callbackjob_p.h b/src/logic/callbackjob_p.h
index 2dabc77f7..cbe985811 100644
--- a/src/logic/callbackjob_p.h
+++ b/src/logic/callbackjob_p.h
@@ -67,6 +67,7 @@ public:
void setManager(Manager *manager);
void run() override;
+ void postFrame(Qt3DCore::QAspectEngine *aspectEngine) override;
private:
Manager *m_logicManager;
diff --git a/src/logic/executor.cpp b/src/logic/executor.cpp
index 41d2f2e31..5a2f2dc51 100644
--- a/src/logic/executor.cpp
+++ b/src/logic/executor.cpp
@@ -58,41 +58,15 @@ Executor::Executor(QObject *parent)
{
}
-void Executor::clearQueueAndProceed()
-{
- // Clear the queue of nodes to process frame updates for (throw the work away).
- // If the semaphore is acquired, release it to allow the logic job and hence the
- // manager and frame to complete and shutdown to continue.
- m_nodeIds.clear();
-}
-
-void Executor::enqueueLogicFrameUpdates(const QVector<Qt3DCore::QNodeId> &nodeIds)
-{
- m_nodeIds = nodeIds;
-}
-
-bool Executor::event(QEvent *e)
-{
- if (e->type() == QEvent::User) {
- FrameUpdateEvent *ev = static_cast<FrameUpdateEvent *>(e);
- processLogicFrameUpdates(ev->deltaTime());
- e->setAccepted(true);
- return true;
- }
- return false;
-}
-
/*!
- \internal
-
Called from context of main thread
*/
-void Executor::processLogicFrameUpdates(float dt)
+void Executor::processLogicFrameUpdates(const QVector<QNodeId> &nodeIds, float dt)
{
- if (!m_scene || m_nodeIds.isEmpty())
+ if (!m_scene || nodeIds.isEmpty())
return;
- const QVector<QNode *> nodes = m_scene->lookupNodes(m_nodeIds);
+ const QVector<QNode *> nodes = m_scene->lookupNodes(nodeIds);
for (QNode *node : nodes) {
QFrameAction *frameAction = qobject_cast<QFrameAction *>(node);
if (frameAction && frameAction->isEnabled())
diff --git a/src/logic/executor_p.h b/src/logic/executor_p.h
index f68f0f93c..1e9e0fa8d 100644
--- a/src/logic/executor_p.h
+++ b/src/logic/executor_p.h
@@ -66,20 +66,6 @@ class QScene;
namespace Qt3DLogic {
namespace Logic {
-class FrameUpdateEvent : public QEvent
-{
-public:
- FrameUpdateEvent(float dt)
- : QEvent(QEvent::User)
- , m_dt(dt)
- {}
-
- float deltaTime() const { return m_dt; }
-
-private:
- float m_dt;
-};
-
class Executor : public QObject
{
Q_OBJECT
@@ -87,17 +73,11 @@ public:
explicit Executor(QObject *parent = 0);
void setScene(Qt3DCore::QScene *scene) { m_scene = scene; }
- void clearQueueAndProceed();
public Q_SLOTS:
- void enqueueLogicFrameUpdates(const QVector<Qt3DCore::QNodeId> &nodeIds);
-
-protected:
- bool event(QEvent *e) override;
- void processLogicFrameUpdates(float dt);
+ void processLogicFrameUpdates(const QVector<Qt3DCore::QNodeId> &nodeIds, float dt);
private:
- QVector<Qt3DCore::QNodeId> m_nodeIds;
Qt3DCore::QScene *m_scene;
};
diff --git a/src/logic/manager.cpp b/src/logic/manager.cpp
index 1131081ee..8f4645a05 100644
--- a/src/logic/manager.cpp
+++ b/src/logic/manager.cpp
@@ -93,7 +93,7 @@ bool Manager::hasFrameActions() const
return m_logicHandlers.count() > 0;
}
-// Called from Job Thread
+// Called from Job postFrame (main thread)
void Manager::triggerLogicFrameUpdates()
{
Q_ASSERT(m_executor);
@@ -103,11 +103,7 @@ void Manager::triggerLogicFrameUpdates()
if (Qt3DCore::QAbstractAspectPrivate::get(m_logicAspect)->m_aspectManager->isShuttingDown())
return;
- // Trigger the main thread to process logic frame updates for each
- // logic component and then wait until done. The Executor will
- // release the semaphore when it has completed its work.
- m_executor->enqueueLogicFrameUpdates(m_logicComponentIds);
- qApp->postEvent(m_executor, new FrameUpdateEvent(m_dt));
+ m_executor->processLogicFrameUpdates(m_logicComponentIds, m_dt);
}
} // namespace Logic
diff --git a/src/logic/qlogicaspect.cpp b/src/logic/qlogicaspect.cpp
index 030d36197..e6fae261e 100644
--- a/src/logic/qlogicaspect.cpp
+++ b/src/logic/qlogicaspect.cpp
@@ -81,9 +81,6 @@ QLogicAspectPrivate::QLogicAspectPrivate()
void QLogicAspectPrivate::onEngineAboutToShutdown()
{
- // Throw away any pending work that may deadlock during the shutdown procedure
- // when the main thread waits for any queued jobs to finish.
- m_executor->clearQueueAndProceed();
m_executor->setScene(nullptr);
}