diff options
author | Sean Harmer <sean.harmer@kdab.com> | 2020-10-21 12:07:53 +0100 |
---|---|---|
committer | Sean Harmer <sean.harmer@kdab.com> | 2020-10-21 15:22:53 +0100 |
commit | c2f6cfd0e4c382045a3391dd20809d9bd3b04311 (patch) | |
tree | 5c929c6b239ad8d1122e6f315b46cc89b028915c /src | |
parent | b87b0cc89ffee4ffc01a714e705caf8e247bd233 (diff) |
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.
Pick-to: 5.15
Change-Id: Ie9f48876351a8d1a7bd0df705a9e43831753ac69
Reviewed-by: Mike Krus <mike.krus@kdab.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/quick3d/imports/scene3d/scene3ditem.cpp | 20 | ||||
-rw-r--r-- | src/quick3d/imports/scene3d/scene3ditem_p.h | 3 |
2 files changed, 19 insertions, 4 deletions
diff --git a/src/quick3d/imports/scene3d/scene3ditem.cpp b/src/quick3d/imports/scene3d/scene3ditem.cpp index 7d4b60bdd..b4a3bbc58 100644 --- a/src/quick3d/imports/scene3d/scene3ditem.cpp +++ b/src/quick3d/imports/scene3d/scene3ditem.cpp @@ -194,6 +194,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); @@ -460,8 +461,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 @@ -829,8 +835,14 @@ QSGNode *Scene3DItem::updatePaintNode(QSGNode *node, QQuickItem::UpdatePaintNode updateWindowSurface(); managerNode->init(); // Note: ChangeArbiter is only set after aspect was registered - QObject::connect(renderAspectPriv->m_aspectManager->changeArbiter(), &Qt3DCore::QChangeArbiter::receivedChange, - this, [this] { m_dirty = true; }, Qt::DirectConnection); + 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 b5a832d12..e51e639a8 100644 --- a/src/quick3d/imports/scene3d/scene3ditem_p.h +++ b/src/quick3d/imports/scene3d/scene3ditem_p.h @@ -161,6 +161,9 @@ private: CompositingMode m_compositingMode; QOffscreenSurface *m_dummySurface; QMetaObject::Connection m_windowConnection; + qint8 m_framesToRender; + + static const qint8 ms_framesNeededToFlushPipeline = 2; }; } // Qt3DRender |