summaryrefslogtreecommitdiffstats
path: root/src/render/frontend
diff options
context:
space:
mode:
authorSean Harmer <sean.harmer@kdab.com>2016-12-12 15:31:32 +0000
committerJani Heikkinen <jani.heikkinen@qt.io>2016-12-14 11:18:19 +0000
commit412f9985bd59b1c46407eda67b963cbdbdc48e4b (patch)
tree1915f46702bfb7b44cb52485c5d02363f375b927 /src/render/frontend
parentf3e9952fb03050fd30fc0618f520bcdbdbfc45d2 (diff)
Ensure offscreen surface used during cleanup is created on gui thread
Windows uses a QWindow to back QOffscreenSurface so we must needs create it on the gui thread. To complicate matters we don't know the format used by Qt 3D until the Renderer is initialized. So we have to defer creation of the offscreen surface until that time and do it in the gui thread with the correct format. Task-number: QTBUG-57496 Change-Id: Idaad23c2229ab069f3e02c8d075be8e6718a8a50 Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
Diffstat (limited to 'src/render/frontend')
-rw-r--r--src/render/frontend/qrenderaspect.cpp12
-rw-r--r--src/render/frontend/qrenderaspect_p.h5
2 files changed, 17 insertions, 0 deletions
diff --git a/src/render/frontend/qrenderaspect.cpp b/src/render/frontend/qrenderaspect.cpp
index 4ba5c208a..14555d15a 100644
--- a/src/render/frontend/qrenderaspect.cpp
+++ b/src/render/frontend/qrenderaspect.cpp
@@ -121,6 +121,7 @@
#include <Qt3DRender/private/rendersettings_p.h>
#include <Qt3DRender/private/backendnode_p.h>
#include <Qt3DRender/private/rendercapture_p.h>
+#include <Qt3DRender/private/offscreensurfacehelper_p.h>
#include <Qt3DCore/qentity.h>
#include <Qt3DCore/qtransform.h>
@@ -442,6 +443,12 @@ void QRenderAspect::onRegistered()
d->m_renderer = new Render::Renderer(d->m_renderType);
d->m_renderer->setNodeManagers(d->m_nodeManagers);
+ // Create a helper for deferring creation of an offscreen surface used during cleanup
+ // to the main thread, after we knwo what the surface format in use is.
+ d->m_offscreenHelper = new Render::OffscreenSurfaceHelper(d->m_renderer);
+ d->m_offscreenHelper->moveToThread(QCoreApplication::instance()->thread());
+ d->m_renderer->setOffscreenSurfaceHelper(d->m_offscreenHelper);
+
// Register backend types now that we have a renderer
d->registerBackendTypes();
@@ -479,6 +486,11 @@ void QRenderAspect::onUnregistered()
// Waits for the render thread to join (if using threaded renderer)
delete d->m_renderer;
d->m_renderer = nullptr;
+
+ // Queue the offscreen surface helper for deletion on the main thread.
+ // That will take care of deleting the offscreen surface itself.
+ d->m_offscreenHelper->deleteLater();
+ d->m_offscreenHelper = nullptr;
}
QVector<Qt3DCore::QAspectJobPtr> QRenderAspectPrivate::createGeometryRendererJobs()
diff --git a/src/render/frontend/qrenderaspect_p.h b/src/render/frontend/qrenderaspect_p.h
index f196c2ec2..d2c789ada 100644
--- a/src/render/frontend/qrenderaspect_p.h
+++ b/src/render/frontend/qrenderaspect_p.h
@@ -67,6 +67,10 @@ class AbstractRenderer;
class NodeManagers;
}
+namespace Render {
+class OffscreenSurfaceHelper;
+}
+
class QT3DRENDERSHARED_PRIVATE_EXPORT QRenderAspectPrivate : public Qt3DCore::QAbstractAspectPrivate
{
public:
@@ -89,6 +93,7 @@ public:
bool m_initialized;
QList<QSceneIOHandler *> m_sceneIOHandler;
QRenderAspect::RenderType m_renderType;
+ Render::OffscreenSurfaceHelper *m_offscreenHelper;
};
}