summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSean Harmer <sean.harmer@kdab.com>2020-10-21 12:07:53 +0100
committerPaul Lemire <paul.lemire@kdab.com>2021-08-04 12:35:23 +0200
commit5012761aeeababaddd0091ff2679dc5f410a7b52 (patch)
tree73f326916fe17f398e684de6106434f8a93d3fa3
parent35d956f317f6d2a63dcae294be52ee46934a6bf8 (diff)
downloadqt3d-5012761aeeababaddd0091ff2679dc5f410a7b52.tar.gz
Render enough frames to flush the Qt3D pipeline when dirty
Sometimes Qt3D needs 2 frames if it involves introspecting and then compiling shaders. So render at least this many frames when needed. The change in formatting is pushed upon us by the clang-format use in the pre-commit hook. Change-Id: Ie9f48876351a8d1a7bd0df705a9e43831753ac69 Reviewed-by: Mike Krus <mike.krus@kdab.com> (cherry picked from commit c2f6cfd0e4c382045a3391dd20809d9bd3b04311) Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
-rw-r--r--src/quick3d/imports/scene3d/scene3ditem.cpp27
-rw-r--r--src/quick3d/imports/scene3d/scene3ditem_p.h3
2 files changed, 19 insertions, 11 deletions
diff --git a/src/quick3d/imports/scene3d/scene3ditem.cpp b/src/quick3d/imports/scene3d/scene3ditem.cpp
index c8c0e0f59..1c610d8bc 100644
--- a/src/quick3d/imports/scene3d/scene3ditem.cpp
+++ b/src/quick3d/imports/scene3d/scene3ditem.cpp
@@ -219,6 +219,7 @@ Scene3DItem::Scene3DItem(QQuickItem *parent)
, m_cameraAspectRatioMode(AutomaticAspectRatio)
, m_compositingMode(FBO)
, m_dummySurface(nullptr)
+ , m_framesToRender(ms_framesNeededToFlushPipeline)
{
setFlag(QQuickItem::ItemHasContents, true);
setAcceptedMouseButtons(Qt::MouseButtonMask);
@@ -542,8 +543,13 @@ bool Scene3DItem::needsRender(QRenderAspect *renderAspect)
|| (renderAspectPriv
&& renderAspectPriv->m_renderer
&& renderAspectPriv->m_renderer->shouldRender());
- m_dirty = false;
- return dirty;
+
+ if (m_dirty) {
+ --m_framesToRender;
+ if (m_framesToRender <= 0)
+ m_dirty = false;
+ }
+ return dirty || m_framesToRender > 0;
}
// This function is triggered in the context of the Main Thread
@@ -911,15 +917,14 @@ QSGNode *Scene3DItem::updatePaintNode(QSGNode *node, QQuickItem::UpdatePaintNode
updateWindowSurface();
managerNode->init();
// Note: ChangeArbiter is only set after aspect was registered
-
- // This allows Scene3DItem to know when it needs to re-render as a result of frontend nodes receiving a change.
- QObject::connect(renderAspectPriv->m_aspectManager->changeArbiter(), &Qt3DCore::QChangeArbiter::receivedChange,
- this, [this] { m_dirty = true; }, Qt::DirectConnection);
-
- // This allows Scene3DItem to know when it needs to re-render as a result of backend nodes receiving a change.
- // For e.g. nodes being created/destroyed.
- QObject::connect(renderAspectPriv->m_aspectManager->changeArbiter(), &Qt3DCore::QChangeArbiter::syncedChanges,
- this, [this] { m_dirty = true; }, Qt::QueuedConnection);
+ QObject::connect(
+ renderAspectPriv->m_aspectManager->changeArbiter(),
+ &Qt3DCore::QChangeArbiter::receivedChange, this,
+ [this] {
+ m_dirty = true;
+ m_framesToRender = ms_framesNeededToFlushPipeline;
+ },
+ Qt::DirectConnection);
}
const bool usesFBO = m_compositingMode == FBO;
diff --git a/src/quick3d/imports/scene3d/scene3ditem_p.h b/src/quick3d/imports/scene3d/scene3ditem_p.h
index 7680ee8b1..827f6c29d 100644
--- a/src/quick3d/imports/scene3d/scene3ditem_p.h
+++ b/src/quick3d/imports/scene3d/scene3ditem_p.h
@@ -169,6 +169,9 @@ private:
QOffscreenSurface *m_dummySurface;
QVector<Scene3DView *> m_views;
QMetaObject::Connection m_windowConnection;
+ qint8 m_framesToRender;
+
+ static const qint8 ms_framesNeededToFlushPipeline = 2;
};
} // Qt3DRender