diff options
author | Miikka Heikkinen <miikka.heikkinen@qt.io> | 2016-06-23 16:41:14 +0300 |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@qt.io> | 2016-06-28 09:32:13 +0000 |
commit | a6e6b2c7726e6d039a35858fa5706a2d69c434a0 (patch) | |
tree | 24eb7e10c0137263767327ab00cd6a4ddc6f0531 | |
parent | 65885a1f1f3416a426fc78a8514839470d83bced (diff) |
Set dummy surface for renderer
This works around the crash reporeted in QTBUG-54318.
Using a dummy surface instead of the proper one appears
to have no negative side effects, probably because we
draw to offscreen FBO anyway.
Change-Id: I54e8c467cac8a6cf403a7aab1da17ba2141f83b8
Reviewed-by: Titta Heikkala <titta.heikkala@qt.io>
-rw-r--r-- | editorlib/src/editorviewportitem.cpp | 28 | ||||
-rw-r--r-- | editorlib/src/editorviewportitem.h | 4 |
2 files changed, 29 insertions, 3 deletions
diff --git a/editorlib/src/editorviewportitem.cpp b/editorlib/src/editorviewportitem.cpp index ae1c025..b6582af 100644 --- a/editorlib/src/editorviewportitem.cpp +++ b/editorlib/src/editorviewportitem.cpp @@ -79,15 +79,19 @@ public: Qt3DCore::QAspectEngine *aspectEngine, Qt3DRender::QRenderAspect *renderAspect, Qt3DInput::QInputAspect *inputAspect, - Qt3DLogic::QLogicAspect *logicAspect) + Qt3DLogic::QLogicAspect *logicAspect, + QOffscreenSurface *surface) : m_item(item) , m_aspectEngine(aspectEngine) , m_renderAspect(renderAspect) , m_inputAspect(inputAspect) , m_logicAspect(logicAspect) + , m_surface(surface) { ContextSaver saver; - m_item->scene()->renderer()->setSurface(reinterpret_cast<QObject *>(saver.surface())); + // HACK: Use dummy surface for renderer to work around crash when running in creator + // TODO: Remove hack when QTBUG-54318 is fixed + m_item->scene()->renderer()->setSurface(reinterpret_cast<QObject *>(m_surface)); static_cast<Qt3DRender::QRenderAspectPrivate *>( Qt3DRender::QRenderAspectPrivate::get(m_renderAspect)) ->renderInitialize(saver.context()); @@ -134,6 +138,7 @@ public: Qt3DRender::QRenderAspect *m_renderAspect; Qt3DInput::QInputAspect *m_inputAspect; Qt3DLogic::QLogicAspect *m_logicAspect; + QOffscreenSurface *m_surface; }; EditorViewportItem::EditorViewportItem(QQuickItem *parent) @@ -145,6 +150,7 @@ EditorViewportItem::EditorViewportItem(QQuickItem *parent) , m_logicAspect(new Qt3DLogic::QLogicAspect) , m_cameraController(nullptr) , m_inputEnabled(true) + , m_surface(nullptr) { setFlag(ItemHasContents, true); m_aspectEngine->registerAspect(m_renderAspect); @@ -153,6 +159,8 @@ EditorViewportItem::EditorViewportItem(QQuickItem *parent) setAcceptHoverEvents(true); setAcceptedMouseButtons(Qt::AllButtons); + + connect(this, &QQuickItem::windowChanged, this, &EditorViewportItem::handleWindowChanged); } EditorViewportItem::~EditorViewportItem() @@ -161,6 +169,9 @@ EditorViewportItem::~EditorViewportItem() static_cast<Qt3DRender::QRenderAspectPrivate *> (Qt3DRender::QRenderAspectPrivate::get(m_renderAspect))->renderShutdown(); } + + if (m_surface) + m_surface->deleteLater(); } EditorScene *EditorViewportItem::scene() const @@ -182,6 +193,17 @@ void EditorViewportItem::setInputEnabled(bool enable) } } +void EditorViewportItem::handleWindowChanged(QQuickWindow *win) +{ + if (!m_surface && win) { + m_surface = new QOffscreenSurface; + QSurfaceFormat format = win->format(); + format.setSamples(4); + m_surface->setFormat(format); + m_surface->create(); + } +} + void EditorViewportItem::setScene(EditorScene *scene) { if (m_scene == scene) @@ -224,7 +246,7 @@ QQuickFramebufferObject::Renderer *EditorViewportItem::createRenderer() const { EditorViewportItem *self = const_cast<EditorViewportItem*>(this); return new FrameBufferObjectRenderer(self, m_aspectEngine, m_renderAspect, - m_inputAspect, m_logicAspect); + m_inputAspect, m_logicAspect, m_surface); } QSGNode *EditorViewportItem::updatePaintNode(QSGNode *node, diff --git a/editorlib/src/editorviewportitem.h b/editorlib/src/editorviewportitem.h index 43c7c88..7c31f93 100644 --- a/editorlib/src/editorviewportitem.h +++ b/editorlib/src/editorviewportitem.h @@ -33,6 +33,8 @@ class EditorScene; class EditorCameraController; +class QOffscreenSurface; + namespace Qt3DCore { class QAspectEngine; @@ -66,6 +68,7 @@ public: bool inputEnabled() const; void setInputEnabled(bool enable); + void handleWindowChanged(QQuickWindow *win); public slots: void setScene(EditorScene* scene); @@ -97,6 +100,7 @@ private: EditorCameraController *m_cameraController; bool m_inputEnabled; + QOffscreenSurface *m_surface; }; #endif // EDITORVIEWPORTITEM_H |