From f5ce8c41cdf8f2c0e84331d5f87437e009587d54 Mon Sep 17 00:00:00 2001 From: Sean Harmer Date: Sun, 12 Feb 2017 14:03:06 +0000 Subject: Initialize members in Scene3DRenderer Change-Id: Ifd2015207346987be498a63302ec6f352a489fb1 Coverity-Id: 154585 Reviewed-by: Paul Lemire --- src/quick3d/imports/scene3d/scene3drenderer.cpp | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src/quick3d/imports/scene3d/scene3drenderer.cpp') diff --git a/src/quick3d/imports/scene3d/scene3drenderer.cpp b/src/quick3d/imports/scene3d/scene3drenderer.cpp index 3065b19ac..d3b9efdb1 100644 --- a/src/quick3d/imports/scene3d/scene3drenderer.cpp +++ b/src/quick3d/imports/scene3d/scene3drenderer.cpp @@ -120,6 +120,8 @@ Scene3DRenderer::Scene3DRenderer(Scene3DItem *item, Qt3DCore::QAspectEngine *asp , m_multisampledFBO(nullptr) , m_finalFBO(nullptr) , m_texture(nullptr) + , m_node(nullptr) + , m_cleaner(nullptr) , m_multisample(false) // this value is not used, will be synced from the Scene3DItem instead , m_lastMultisample(false) { -- cgit v1.2.3 From c64df4a307aff064433f57805561cb445c0e285f Mon Sep 17 00:00:00 2001 From: Robert Brock Date: Mon, 16 Jan 2017 18:59:17 +0000 Subject: Coding convention fix for Src/importscore, importsextras, importsinput, importsrender, importsscene3d Reordering the header includes to comply with Qt coding conventions Task-number: QTBUG-56185 Change-Id: I3b2b3ee60e397772bbcebac09b07c059fbd922db Reviewed-by: Sean Harmer --- src/quick3d/imports/scene3d/scene3drenderer.cpp | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) (limited to 'src/quick3d/imports/scene3d/scene3drenderer.cpp') diff --git a/src/quick3d/imports/scene3d/scene3drenderer.cpp b/src/quick3d/imports/scene3d/scene3drenderer.cpp index 3065b19ac..0ef6c532e 100644 --- a/src/quick3d/imports/scene3d/scene3drenderer.cpp +++ b/src/quick3d/imports/scene3d/scene3drenderer.cpp @@ -38,22 +38,20 @@ ****************************************************************************/ #include "scene3drenderer_p.h" -#include "scene3dcleaner_p.h" -#include "scene3ditem_p.h" -#include "scene3dlogging_p.h" -#include "scene3dsgnode_p.h" -#include -#include #include -#include - -#include - +#include +#include #include #include +#include -#include +#include +#include +#include +#include +#include +#include QT_BEGIN_NAMESPACE -- cgit v1.2.3 From 01e15dd236b23395139fed61686ea4b98da4ea7d Mon Sep 17 00:00:00 2001 From: Laszlo Agocs Date: Tue, 4 Apr 2017 11:34:33 +0200 Subject: Hook Scene3D cleanup on scenegraphInvalidated too The invalidated signal is nice since it works in all cases, both with real QQuickWindows and ones driven via QQuickRenderControl (e.g. QQuickWidget). With QQuickWidget just relying on windowChanged is pretty bad since the window change comes way too late due to the diffeerences in widget handling internals. Task-number: QTBUG-52132 Change-Id: I8639e4d60514eeeb00fa9dda2329de6088f2a44d Reviewed-by: Andy Nichols --- src/quick3d/imports/scene3d/scene3drenderer.cpp | 30 +++++++++++++++++-------- 1 file changed, 21 insertions(+), 9 deletions(-) (limited to 'src/quick3d/imports/scene3d/scene3drenderer.cpp') diff --git a/src/quick3d/imports/scene3d/scene3drenderer.cpp b/src/quick3d/imports/scene3d/scene3drenderer.cpp index f52a071eb..88f3be3c1 100644 --- a/src/quick3d/imports/scene3d/scene3drenderer.cpp +++ b/src/quick3d/imports/scene3d/scene3drenderer.cpp @@ -122,12 +122,14 @@ Scene3DRenderer::Scene3DRenderer(Scene3DItem *item, Qt3DCore::QAspectEngine *asp , m_cleaner(nullptr) , m_multisample(false) // this value is not used, will be synced from the Scene3DItem instead , m_lastMultisample(false) + , m_needsShutdown(true) { Q_CHECK_PTR(m_item); Q_CHECK_PTR(m_item->window()); QObject::connect(m_item->window(), &QQuickWindow::beforeRendering, this, &Scene3DRenderer::render, Qt::DirectConnection); - QObject::connect(m_item, &QQuickItem::windowChanged, this, &Scene3DRenderer::onWindowChangedQueued, Qt::QueuedConnection); + QObject::connect(m_item->window(), &QQuickWindow::sceneGraphInvalidated, this, &Scene3DRenderer::onSceneGraphInvalidated, Qt::DirectConnection); + QObject::connect(m_item, &QQuickItem::windowChanged, this, &Scene3DRenderer::onWindowChanged, Qt::QueuedConnection); Q_ASSERT(QOpenGLContext::currentContext()); ContextSaver saver; @@ -173,7 +175,7 @@ void Scene3DRenderer::setCleanerHelper(Scene3DCleaner *cleaner) } } -// Executed in the QtQuick render thread. +// Executed in the QtQuick render thread (which may even be the gui/main with QQuickWidget / RenderControl). void Scene3DRenderer::shutdown() { qCDebug(Scene3D) << Q_FUNC_INFO << QThread::currentThread(); @@ -195,19 +197,29 @@ void Scene3DRenderer::shutdown() static_cast(QRenderAspectPrivate::get(m_renderAspect))->renderShutdown(); } -// SGThread -void Scene3DRenderer::onWindowChangedQueued(QQuickWindow *w) +// QtQuick render thread (which may also be the gui/main thread with QQuickWidget / RenderControl) +void Scene3DRenderer::onSceneGraphInvalidated() { - if (w == nullptr) { - qCDebug(Scene3D) << Q_FUNC_INFO << QThread::currentThread(); + qCDebug(Scene3D) << Q_FUNC_INFO << QThread::currentThread(); + if (m_needsShutdown) { + m_needsShutdown = false; shutdown(); - // Will only trigger something with the Loader case - // The window closed cases is handled by the window's destroyed - // signal QMetaObject::invokeMethod(m_cleaner, "cleanup"); } } +void Scene3DRenderer::onWindowChanged(QQuickWindow *w) +{ + qCDebug(Scene3D) << Q_FUNC_INFO << QThread::currentThread() << w; + if (!w) { + if (m_needsShutdown) { + m_needsShutdown = false; + shutdown(); + QMetaObject::invokeMethod(m_cleaner, "cleanup"); + } + } +} + void Scene3DRenderer::synchronize() { m_multisample = m_item->multisample(); -- cgit v1.2.3 From bb0f4b48390b5ddc9758f04f6ecd692072fb279f Mon Sep 17 00:00:00 2001 From: Paul Lemire Date: Fri, 5 May 2017 11:23:46 +0200 Subject: Scene3DRenderer: fix race condition When the window geometry changes, the Scene3DRenderer was updating a Qt3D frontend node's property from the QSGRenderThread. This resulted in the QPostman::notifyBackend being called from possibly two threads at the same time, resulting in a race condition where the changes would never be submitted again to the backend. Change-Id: I842aaa54637d85d4d45eb54620749efb36168e2a Task-number: QTBUG-54900 Reviewed-by: Sean Harmer Reviewed-by: Oleg Evseev --- src/quick3d/imports/scene3d/scene3drenderer.cpp | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) (limited to 'src/quick3d/imports/scene3d/scene3drenderer.cpp') diff --git a/src/quick3d/imports/scene3d/scene3drenderer.cpp b/src/quick3d/imports/scene3d/scene3drenderer.cpp index 88f3be3c1..b32191391 100644 --- a/src/quick3d/imports/scene3d/scene3drenderer.cpp +++ b/src/quick3d/imports/scene3d/scene3drenderer.cpp @@ -57,6 +57,17 @@ QT_BEGIN_NAMESPACE namespace Qt3DRender { +namespace { + +inline QMetaMethod setItemAreaMethod() +{ + const int idx = Scene3DItem::staticMetaObject.indexOfMethod("setItemArea(QSize)"); + Q_ASSERT(idx != -1); + return Scene3DItem::staticMetaObject.method(idx); +} + +} // anonymous + class ContextSaver { public: @@ -250,8 +261,11 @@ void Scene3DRenderer::render() const bool multisampleHasChanged = m_multisample != m_lastMultisample; const bool forceRecreate = sizeHasChanged || multisampleHasChanged; - if (sizeHasChanged) - m_item->setItemArea(boundingRectSize); + if (sizeHasChanged) { + // We are in the QSGRenderThread (doing a direct call would result in a race) + static const QMetaMethod setItemArea = setItemAreaMethod(); + setItemArea.invoke(m_item, Qt::QueuedConnection, Q_ARG(QSize, boundingRectSize)); + } // Rebuild FBO and textures if never created or a resize has occurred if ((m_multisampledFBO.isNull() || forceRecreate) && m_multisample) { -- cgit v1.2.3