summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorSean Harmer <sean.harmer@kdab.com>2020-10-21 12:07:53 +0100
committerSean Harmer <sean.harmer@kdab.com>2020-10-21 15:22:53 +0100
commitc2f6cfd0e4c382045a3391dd20809d9bd3b04311 (patch)
tree5c929c6b239ad8d1122e6f315b46cc89b028915c /src
parentb87b0cc89ffee4ffc01a714e705caf8e247bd233 (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.cpp20
-rw-r--r--src/quick3d/imports/scene3d/scene3ditem_p.h3
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